diff --git a/src/blockforest/BlockDataHandling.h b/src/blockforest/BlockDataHandling.h
index a9e612e84560bdf5593ef00d979c13d8af5bf5b0..c947b3e032de0a01bf727a30e86d81ff23c035f5 100644
--- a/src/blockforest/BlockDataHandling.h
+++ b/src/blockforest/BlockDataHandling.h
@@ -214,7 +214,7 @@ public:
    template< typename T >
    BlockDataHandlingAdder & operator<<( const domain_decomposition::BlockDataCreator<T> & bdc )
    {
-      auto downcast = boost::dynamic_pointer_cast< blockforest::BlockDataHandling<T> >( bdc.dataHandling_ );
+      auto downcast = dynamic_pointer_cast< blockforest::BlockDataHandling<T> >( bdc.dataHandling_ );
       if( downcast )
       {
          dataHandling_.add( make_shared< blockforest::internal::BlockDataHandlingHelper<T> >( downcast ), bdc.requiredSelectors_,
diff --git a/src/blockforest/BlockForest.cpp b/src/blockforest/BlockForest.cpp
index 8d99f0abe7b0c015b35e0d855221979471619b64..e6c19cbc1fe9341bc297f73606a926549659355a 100644
--- a/src/blockforest/BlockForest.cpp
+++ b/src/blockforest/BlockForest.cpp
@@ -2277,7 +2277,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
             auto blockDataHandlingWrapper = dataItem->getDataHandling( block, targetState[0] );
             if( blockDataHandlingWrapper )
             {
-               auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+               auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                if( !downcastBlockDataHandlingWrapper )
                {
                   WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
@@ -2305,7 +2305,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
                auto blockDataHandlingWrapper = dataItem->getDataHandling( block, targetState[c] );
                if( blockDataHandlingWrapper )
                {
-                  auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+                  auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                   if( !downcastBlockDataHandlingWrapper )
                   {
                      WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
@@ -2651,7 +2651,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
                auto blockDataHandlingWrapper = dataItem->getDataHandling( block );
                if( blockDataHandlingWrapper )
                {
-                  auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+                  auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                   if( !downcastBlockDataHandlingWrapper )
                   {
                      WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
@@ -2671,7 +2671,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
                auto blockDataHandlingWrapper = dataItem->getDataHandling( block, buffers[0].first );
                if( blockDataHandlingWrapper )
                {
-                  auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+                  auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                   if( !downcastBlockDataHandlingWrapper )
                   {
                      WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
@@ -2699,7 +2699,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
                auto blockDataHandlingWrapper = dataItem->getDataHandling( block );
                if( blockDataHandlingWrapper )
                {
-                  auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+                  auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                   if( !downcastBlockDataHandlingWrapper )
                   {
                      WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
@@ -2720,7 +2720,7 @@ void BlockForest::update( PhantomBlockForest & phantomForest )
                auto blockDataHandlingWrapper = dataItem->getDataHandling( block, buffers[c].first );
                if( blockDataHandlingWrapper )
                {
-                  auto downcastBlockDataHandlingWrapper = boost::dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
+                  auto downcastBlockDataHandlingWrapper = dynamic_pointer_cast< blockforest::internal::BlockDataHandlingWrapper >( blockDataHandlingWrapper );
                   if( !downcastBlockDataHandlingWrapper )
                   {
                      WALBERLA_ABORT( "Dynamic data structure refresh failed!\n"
diff --git a/src/blockforest/BlockForest.h b/src/blockforest/BlockForest.h
index 011dbf371076aaa42d6aa49f7acf83acbcad2546..af1a1f8aff95d4463dc3e152f9536d59f450250c 100644
--- a/src/blockforest/BlockForest.h
+++ b/src/blockforest/BlockForest.h
@@ -856,7 +856,7 @@ inline BlockDataID BlockForest::addBlockData( const shared_ptr< T > & dataHandli
 {
    //static_assert( boost::is_base_of< BlockDataHandling<typename T::value_type>, T >::value );
 
-   auto downcast = boost::dynamic_pointer_cast< blockforest::BlockDataHandling<typename T::value_type> >( dataHandling );
+   auto downcast = dynamic_pointer_cast< blockforest::BlockDataHandling<typename T::value_type> >( dataHandling );
 
    if( downcast )
    {
@@ -880,7 +880,7 @@ template< typename T >
 inline BlockDataID BlockForest::loadBlockData( const std::string & file, const shared_ptr< T > & dataHandling, const std::string & identifier,
                                                const Set<SUID> & requiredSelectors, const Set<SUID> & incompatibleSelectors )
 {
-   auto downcast = boost::dynamic_pointer_cast< blockforest::BlockDataHandling<typename T::value_type> >( dataHandling );
+   auto downcast = dynamic_pointer_cast< blockforest::BlockDataHandling<typename T::value_type> >( dataHandling );
 
    if( downcast )
    {
diff --git a/src/blockforest/BlockID.h b/src/blockforest/BlockID.h
index b9691c74490ac52663b07f65816002fc2c48354d..dddb36d96c9659d9e7e8d6460c5bfd939726fe78 100644
--- a/src/blockforest/BlockID.h
+++ b/src/blockforest/BlockID.h
@@ -93,8 +93,8 @@ private:
 
    static const uint_t SHIFT = UINT_BITS - 3;
 
-   BOOST_STATIC_ASSERT( UINT_BITS > 31 );
-   BOOST_STATIC_ASSERT( !(UINT_BITS & (UINT_BITS - 1)) ); // power of two
+   WALBERLA_STATIC_ASSERT( UINT_BITS > 31 );
+   WALBERLA_STATIC_ASSERT( !(UINT_BITS & (UINT_BITS - 1)) ); // power of two
 
 }; // class BlockID
 
diff --git a/src/blockforest/Types.h b/src/blockforest/Types.h
index 0624414b23b529e47b23e6c56a941afa0b816eb7..76ab3911327cb28608cb6c89b2a8e964a6791803 100644
--- a/src/blockforest/Types.h
+++ b/src/blockforest/Types.h
@@ -23,7 +23,6 @@
 
 #include "core/DataTypes.h"
 
-#include <boost/static_assert.hpp>
 #include <limits>
 
 
@@ -37,8 +36,8 @@ namespace blockforest {
 typedef real_t workload_t;
 typedef real_t memory_t;
 
-BOOST_STATIC_ASSERT( sizeof( workload_t ) == 4 || sizeof( workload_t ) == 8 );
-BOOST_STATIC_ASSERT( sizeof( memory_t   ) == 4 || sizeof( memory_t   ) == 8 );
+WALBERLA_STATIC_ASSERT( sizeof( workload_t ) == 4 || sizeof( workload_t ) == 8 );
+WALBERLA_STATIC_ASSERT( sizeof( memory_t   ) == 4 || sizeof( memory_t   ) == 8 );
 
 template< typename T > inline workload_t workload_c( T t ) { return numeric_cast< workload_t >(t); } ///< cast to type workload_t using "workload_c(x)"
 template< typename T > inline memory_t   memory_c  ( T t ) { return numeric_cast< memory_t >(t); }   ///< cast to type memory_t   using "memory_c(x)"
diff --git a/src/core/DataTypes.h b/src/core/DataTypes.h
index 765636c0626c6bd62bde1a57d94f86c0ed8f0bba..b0442f52466f8fcbe13ef68656a9b99ad449cbb2 100644
--- a/src/core/DataTypes.h
+++ b/src/core/DataTypes.h
@@ -23,13 +23,10 @@
 
 #include "waLBerlaDefinitions.h"
 
-#include <boost/cstdint.hpp>
-#include <boost/make_shared.hpp>
+#include <cstdint>
 #include <boost/numeric/conversion/cast.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/static_assert.hpp>
-#include "boost/type_traits/integral_constant.hpp"
+#include <memory>
+#include <type_traits>
 #include <boost/units/detail/utility.hpp>
 
 #include <cmath>
@@ -39,17 +36,19 @@
 namespace walberla {
 
 
+#define WALBERLA_STATIC_ASSERT(x) static_assert(x, "Assertion failed")
 
-template <typename> struct never_true : boost::false_type {};
+
+template <typename> struct never_true : std::false_type {};
 
 
 
 // shared ptr
 
-using boost::shared_ptr;
-using boost::weak_ptr;
-using boost::make_shared;
-using boost::dynamic_pointer_cast;
+using std::shared_ptr;
+using std::weak_ptr;
+using std::make_shared;
+using std::dynamic_pointer_cast;
 
 // functions, use this when "function" namespace is no longer needed
 //using std::function;
@@ -69,10 +68,10 @@ inline S numeric_cast( T t ) {
 
 
 // fixed size signed integral types
-typedef boost::int8_t   int8_t;  ///<  8 bit signed integer
-typedef boost::int16_t  int16_t; ///< 16 bit signed integer
-typedef boost::int32_t  int32_t; ///< 32 bit signed integer
-typedef boost::int64_t  int64_t; ///< 64 bit signed integer
+typedef std::int8_t   int8_t;    ///<  8 bit signed integer
+typedef std::int16_t  int16_t;   ///< 16 bit signed integer
+typedef std::int32_t  int32_t;   ///< 32 bit signed integer
+typedef std::int64_t  int64_t;   ///< 64 bit signed integer
 
 template< typename T > inline int8_t   int8_c( T t ) { return numeric_cast< int8_t  >(t); } ///< cast to type int8_t  using "int8_c(x)"
 template< typename T > inline int16_t int16_c( T t ) { return numeric_cast< int16_t >(t); } ///< cast to type int16_t using "int16_c(x)"
@@ -83,10 +82,10 @@ template< typename T > inline int64_t int64_c( T t ) { return numeric_cast< int6
 
 // fixed size unsigned integral types
 
-typedef boost::uint8_t  uint8_t;  ///<  8 bit unsigned integer
-typedef boost::uint16_t uint16_t; ///< 16 bit unsigned integer
-typedef boost::uint32_t uint32_t; ///< 32 bit unsigned integer
-typedef boost::uint64_t uint64_t; ///< 64 bit unsigned integer
+typedef std::uint8_t  uint8_t;    ///<  8 bit unsigned integer
+typedef std::uint16_t uint16_t;   ///< 16 bit unsigned integer
+typedef std::uint32_t uint32_t;   ///< 32 bit unsigned integer
+typedef std::uint64_t uint64_t;   ///< 64 bit unsigned integer
 typedef uint8_t byte_t;
 typedef uint64_t id_t;            //sid datatype for pe
 
@@ -156,7 +155,7 @@ static const uint_t UINT_BITS_LD = int_ld< std::numeric_limits< uint_t >::digits
 typedef int cell_idx_t;
 //typedef int64_t cell_idx_t;
 
-BOOST_STATIC_ASSERT( std::numeric_limits<cell_idx_t>::is_specialized &&
+WALBERLA_STATIC_ASSERT( std::numeric_limits<cell_idx_t>::is_specialized &&
                      std::numeric_limits<cell_idx_t>::is_integer &&
                      std::numeric_limits<cell_idx_t>::is_signed );
 
diff --git a/src/core/cell/CellInterval.h b/src/core/cell/CellInterval.h
index 1f4737337e942f340001c4363e613485624cf2e8..10dfb0d9b1bbc375aeac80e08118b61af8c8cfd4 100644
--- a/src/core/cell/CellInterval.h
+++ b/src/core/cell/CellInterval.h
@@ -29,7 +29,6 @@
 #include "core/mpi/RecvBuffer.h"
 #include "core/mpi/SendBuffer.h"
 
-#include <boost/static_assert.hpp>
 #include <algorithm>
 #include <iterator>
 
diff --git a/src/core/debug/CheckFunctions.h b/src/core/debug/CheckFunctions.h
index 54efea20b30ba2abc04105df96729d00d900eb53..84130a8d1e209cf928f72a75b0cf99afcbf07e89 100644
--- a/src/core/debug/CheckFunctions.h
+++ b/src/core/debug/CheckFunctions.h
@@ -29,7 +29,6 @@
 #include "core/VectorTrait.h"
 
 //#include <boost/math/special_functions/next.hpp>
-#include <boost/static_assert.hpp>
 #include <boost/type_traits/is_arithmetic.hpp>
 #include <boost/type_traits/is_floating_point.hpp>
 #include <boost/type_traits/has_left_shift.hpp>
diff --git a/src/core/debug/CheckFunctions.impl.h b/src/core/debug/CheckFunctions.impl.h
index fb67dd269fcd357eb986bd7e32b283e23c82ccae..fac44221d516a0a8be73690787eecff21a672e88 100644
--- a/src/core/debug/CheckFunctions.impl.h
+++ b/src/core/debug/CheckFunctions.impl.h
@@ -20,6 +20,7 @@
 //======================================================================================================================
 
 
+#include <boost/type_traits/integral_constant.hpp>
 
 /// \cond internal
 
diff --git a/src/core/math/Matrix2.h b/src/core/math/Matrix2.h
index db66c6e2cc45be63c6798537dd8e1d6f6db04d56..87b41821e01dc77efd2e2daffc82382ada132980 100644
--- a/src/core/math/Matrix2.h
+++ b/src/core/math/Matrix2.h
@@ -28,7 +28,6 @@
 #include "core/mpi/RecvBuffer.h"
 #include "core/mpi/SendBuffer.h"
 
-#include <boost/static_assert.hpp>
 #include <algorithm>
 #include <cmath>
 #include <iostream>
@@ -725,9 +724,9 @@ inline const Matrix2<Type> Matrix2<Type>::getTranspose() const
 template< typename Type >
 inline Matrix2<Type>& Matrix2<Type>::invert()
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    Type det = getDeterminant();
 
@@ -754,9 +753,9 @@ inline Matrix2<Type>& Matrix2<Type>::invert()
 template< typename Type >
 inline const Matrix2<Type> Matrix2<Type>::getInverse() const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    Type det = getDeterminant();
 
@@ -898,7 +897,7 @@ inline bool isnan( const Matrix2<Type>& m )
 template< typename Type >
 inline const Matrix2<Type> abs( const Matrix2<Type>& m )
 {
-   BOOST_STATIC_ASSERT( std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<Type>::is_integer );
    return Matrix2<Type>( std::abs(m[0]), std::abs(m[1]),
                          std::abs(m[2]), std::abs(m[3]) );
 }
@@ -919,7 +918,7 @@ inline const Matrix2<Type> abs( const Matrix2<Type>& m )
 template< typename Type >
 inline const Matrix2<Type> fabs( const Matrix2<Type>& m )
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
    return Matrix2<Type>( std::fabs(m[0]), std::fabs(m[1]),
                          std::fabs(m[2]), std::fabs(m[3]) );
 }
diff --git a/src/core/math/Matrix3.h b/src/core/math/Matrix3.h
index 8706833ae539070102d9258ece6c8faecf1016e1..42a36dc9e2e95727dc0bb66117124c33162c31f8 100644
--- a/src/core/math/Matrix3.h
+++ b/src/core/math/Matrix3.h
@@ -32,7 +32,6 @@
 #include "core/mpi/RecvBuffer.h"
 #include "core/mpi/SendBuffer.h"
 
-#include <boost/static_assert.hpp>
 #include <boost/type_traits/is_arithmetic.hpp>
 #include <boost/utility/enable_if.hpp>
 
@@ -370,9 +369,9 @@ template< typename Type >
 template< typename Axis, typename Angle >
 Matrix3<Type>::Matrix3( Vector3<Axis> axis, Angle angle )
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Axis>::is_integer  );
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Angle>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Axis>::is_integer  );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Angle>::is_integer );
 
    const Angle sina( std::sin(angle) );
    const Angle cosa( std::cos(angle) );
@@ -1007,9 +1006,9 @@ inline const Matrix3<Type> Matrix3<Type>::getTranspose() const
 template< typename Type >
 inline Matrix3<Type>& Matrix3<Type>::invert()
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    Type det = v_[0] * ( ( v_[4] * v_[8] ) - ( v_[7] * v_[5] ) ) +
               v_[1] * ( ( v_[5] * v_[6] ) - ( v_[8] * v_[3] ) ) +
@@ -1046,7 +1045,7 @@ inline Matrix3<Type>& Matrix3<Type>::invert()
 template< typename Type >
 inline const Matrix3<Type> Matrix3<Type>::getInverse() const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    Type det = v_[0] * ( ( v_[4] * v_[8] ) - ( v_[7] * v_[5] ) ) +
               v_[1] * ( ( v_[5] * v_[6] ) - ( v_[8] * v_[3] ) ) +
@@ -1101,8 +1100,8 @@ template< typename Type >
 template< typename Other >
 inline const Matrix3<HIGH> Matrix3<Type>::rotate( const Matrix3<Other>& m ) const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
 
    //--Multiplication in two steps (number of FLOP = 90, 1 additional temporary matrix)------------
 
@@ -1160,8 +1159,8 @@ template< typename Type >
 template< typename Other >
 inline const Matrix3<HIGH> Matrix3<Type>::diagRotate( const Matrix3<Other>& m ) const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
 
    // Precalculating tmp = m * R(-1)
    const Matrix3<HIGH> tmp( m.v_[0]*v_[0], m.v_[0]*v_[3], m.v_[0]*v_[6],
@@ -1249,7 +1248,7 @@ inline bool Matrix3<Type>::isZero() const
 template< typename Type >
 inline const Matrix3<Type> Matrix3<Type>::getCholesky() const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    Matrix3 tmp( Type(0) );
 
@@ -1292,8 +1291,8 @@ template< typename Type >
 template< typename Other >
 inline const Vector3<HIGH> Matrix3<Type>::solve( const Vector3<Other> &rhs ) const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer  );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Other>::is_integer );
 
    Vector3<HIGH> tmp1, tmp2;
    HIGH sum;
@@ -1355,7 +1354,7 @@ inline Type Matrix3<Type>::trace() const
 template< typename Type >
 inline const Vector3<Type> Matrix3<Type>::getEulerAnglesXYZ() const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    const Type cy( std::sqrt( v_[0]*v_[0] + v_[3]*v_[3] ) );
 
@@ -1382,7 +1381,7 @@ inline const Vector3<Type> Matrix3<Type>::getEulerAnglesXYZ() const
 template< typename Type >
 const Vector3<Type> Matrix3<Type>::getEulerAngles( EulerRotation order ) const
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
 
    static const uint_t eulSafe[4] = { 0, 1, 2, 0 };
    static const uint_t eulNext[4] = { 1, 2, 0, 1 };
@@ -1663,7 +1662,7 @@ inline bool isnan( const Matrix3<Type>& m )
 template< typename Type >
 inline const Matrix3<Type> abs( const Matrix3<Type>& m )
 {
-   BOOST_STATIC_ASSERT( std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<Type>::is_integer );
    return Matrix3<Type>( std::abs(m[0]), std::abs(m[1]), std::abs(m[2]),
                          std::abs(m[3]), std::abs(m[4]), std::abs(m[5]),
                          std::abs(m[6]), std::abs(m[7]), std::abs(m[8]) );
@@ -1685,7 +1684,7 @@ inline const Matrix3<Type> abs( const Matrix3<Type>& m )
 template< typename Type >
 inline const Matrix3<Type> fabs( const Matrix3<Type>& m )
 {
-   BOOST_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
+   WALBERLA_STATIC_ASSERT( !std::numeric_limits<Type>::is_integer );
    return Matrix3<Type>( std::fabs(m[0]), std::fabs(m[1]), std::fabs(m[2]),
                          std::fabs(m[3]), std::fabs(m[4]), std::fabs(m[5]),
                          std::fabs(m[6]), std::fabs(m[7]), std::fabs(m[8]) );
diff --git a/src/core/math/PhysicalCheck.cpp b/src/core/math/PhysicalCheck.cpp
index 43c8e5030a5e0266f12701acab71fd9d11fd7255..321890603a9e7d0306858a94e489dad95b02cf4d 100644
--- a/src/core/math/PhysicalCheck.cpp
+++ b/src/core/math/PhysicalCheck.cpp
@@ -231,7 +231,7 @@ namespace math {
          constraints_.push_back( *i );
    }
 
-   void PhysicalCheck::completeConfig( const boost::shared_ptr<Config>& config )
+   void PhysicalCheck::completeConfig( const shared_ptr<Config>& config )
    {
       auto globalBlock = config->getWritableGlobalBlock();
 
diff --git a/src/core/math/PhysicalCheck.h b/src/core/math/PhysicalCheck.h
index d3ae91ee9848425fef6ecc063e3a3c254ebcf897..857b292f404f96b2bec8fed07ed036963afefea4 100644
--- a/src/core/math/PhysicalCheck.h
+++ b/src/core/math/PhysicalCheck.h
@@ -94,7 +94,7 @@ namespace math {
       void addEquations              ( const std::vector<std::string>& equations );
       void addUnitParameterRelations ( const std::map< std::string, std::string >& unitParameterRelations );
       void addConstraints            ( const std::vector<std::string>& constraints );
-      void completeConfig            ( const boost::shared_ptr<Config>& config );
+      void completeConfig            ( const shared_ptr<Config>& config );
       //@}
       //****************************************************************************************************************
 
diff --git a/src/core/math/Quaternion.h b/src/core/math/Quaternion.h
index ddf90343008c172b186bfa2e07157a2c71ca1b77..5fd24f91d848346a0396ece30afc29b3b39b229c 100644
--- a/src/core/math/Quaternion.h
+++ b/src/core/math/Quaternion.h
@@ -663,7 +663,7 @@ inline void Quaternion<Type>::swap( Quaternion& q ) /* throw() */
 template< typename Type >
 inline const Vector3<Type> Quaternion<Type>::getEulerAnglesXYZ() const
 {
-   BOOST_STATIC_ASSERT(!std::numeric_limits<Type>::is_integer);
+   WALBERLA_STATIC_ASSERT(!std::numeric_limits<Type>::is_integer);
 
    Vector3<Type> eulerAngles;
    
diff --git a/src/core/math/Utility.h b/src/core/math/Utility.h
index f53d2c47c86d94b38592513bc6083e3eef5e14bb..198cd4c73dd9e311e3f8fa2766d2a827f9eb0dd2 100644
--- a/src/core/math/Utility.h
+++ b/src/core/math/Utility.h
@@ -26,7 +26,6 @@
 #include "core/DataTypes.h"
 
 #include <boost/math/constants/constants.hpp>
-#include <boost/static_assert.hpp>
 #include <cmath>
 #include <cstddef>
 #include <limits>
@@ -100,7 +99,7 @@ inline real_t round( real_t a );
 template< typename T >
 inline const T sign( T a )
 {
-   BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_signed );
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<T>::is_signed );
    return ( a < T(0) )?( T(-1) ):( T(1) );
 }
 //**********************************************************************************************************************
diff --git a/src/core/math/Vector2.h b/src/core/math/Vector2.h
index 247f2a026a83e68365ff58be1864b0713b30c59d..1ad6f9cab05d9eda80a0684d736e5921ba26b5d0 100644
--- a/src/core/math/Vector2.h
+++ b/src/core/math/Vector2.h
@@ -38,7 +38,6 @@
 #include "core/mpi/SendBuffer.h"
 
 #include <boost/functional/hash.hpp>
-#include <boost/static_assert.hpp>
 #include <boost/type_traits/is_floating_point.hpp>
 #include <boost/type_traits/is_fundamental.hpp>
 #include <boost/type_traits/is_same.hpp>
diff --git a/src/core/math/Vector3.h b/src/core/math/Vector3.h
index 38fbf7ef0c40e0d3111bc7214bf21d6d8f05b826..f5b1ea819cff09f5813a162574ee318ab8bd7fa7 100644
--- a/src/core/math/Vector3.h
+++ b/src/core/math/Vector3.h
@@ -39,7 +39,6 @@
 #include "core/debug/CheckFunctions.h"
 
 #include <boost/functional/hash.hpp>
-#include <boost/static_assert.hpp>
 #include <boost/type_traits.hpp>
 #include <boost/type_traits/is_floating_point.hpp>
 #include <boost/type_traits/is_fundamental.hpp>
diff --git a/src/core/math/equation_system/EquationSystem.h b/src/core/math/equation_system/EquationSystem.h
index 5ba6d2db2f24c0c7c0fe09aae48fe8236d071025..56a15bf8096b58fbd26dc007d7fb6522c4232166 100644
--- a/src/core/math/equation_system/EquationSystem.h
+++ b/src/core/math/equation_system/EquationSystem.h
@@ -121,7 +121,7 @@ namespace math {
 
    };
 
-   typedef boost::shared_ptr< EquationSystem > EquationSystemPtr;
+   typedef shared_ptr< EquationSystem > EquationSystemPtr;
 
 } // namespace math
 } // namespace walberla
diff --git a/src/core/math/equation_system/FwdEquation.h b/src/core/math/equation_system/FwdEquation.h
index 587eceb7960558b5d69f4e300c74edbbb363c5a9..37787456b7eb1daa3ab131cb30112bd9804e483e 100644
--- a/src/core/math/equation_system/FwdEquation.h
+++ b/src/core/math/equation_system/FwdEquation.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <boost/shared_ptr.hpp>
+#include <memory>
 
 
 namespace walberla {
@@ -41,13 +41,13 @@ namespace math {
    };
 
    class Node;
-   typedef boost::shared_ptr<Node> NodePtr;
+   typedef std::shared_ptr<Node> NodePtr;
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // EQUATION
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class Equation;
-   typedef boost::shared_ptr< Equation > EquationPtr;
+   typedef std::shared_ptr< Equation > EquationPtr;
 
 } // namespace math
 } // namespace walberla
diff --git a/src/core/math/equation_system/FwdOperator.h b/src/core/math/equation_system/FwdOperator.h
index 1b54a2dbeddc74a879d102edd7787626842a4e82..2df1ae9abda4bed416e52223400111758ea4e4fa 100644
--- a/src/core/math/equation_system/FwdOperator.h
+++ b/src/core/math/equation_system/FwdOperator.h
@@ -21,7 +21,6 @@
 
 #pragma once
 
-#include <boost/shared_ptr.hpp>
 #include <map>
 
 
diff --git a/src/core/math/equation_system/FwdVariable.h b/src/core/math/equation_system/FwdVariable.h
index cbd8c86f709fa590016071e4cad036558d947af8..76715f973efe5b97d47fe7762abc8747f14e760b 100644
--- a/src/core/math/equation_system/FwdVariable.h
+++ b/src/core/math/equation_system/FwdVariable.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <boost/shared_ptr.hpp>
+#include <memory>
 #include <map>
 #include <string>
 
@@ -33,7 +33,7 @@ namespace math {
 
    class Var;
 
-   typedef boost::shared_ptr<Var> VarPtr;
+   typedef std::shared_ptr<Var> VarPtr;
 
    typedef std::map<std::string, VarPtr>                 VarMap;
    typedef std::map<std::string, VarPtr>::const_iterator VarMapIt;
diff --git a/src/core/mpi/RecvBuffer.h b/src/core/mpi/RecvBuffer.h
index 5015f9bf52c8373cf70c0eb72286027cd5498971..3caa764b7bfc9a2559d78204cc10bc2e8c33c6fb 100644
--- a/src/core/mpi/RecvBuffer.h
+++ b/src/core/mpi/RecvBuffer.h
@@ -554,10 +554,10 @@ template< typename T >  // Element type
 template< typename V >  // Type of the built-in data value
 inline void GenericRecvBuffer<T>::peek( V& value ) const
 {
-   BOOST_STATIC_ASSERT( boost::is_arithmetic<V>::value );
+   WALBERLA_STATIC_ASSERT( boost::is_arithmetic<V>::value );
 
-   BOOST_STATIC_ASSERT( sizeof(V) > sizeof(T) );
-   BOOST_STATIC_ASSERT( sizeof(V) % sizeof(T) == 0);
+   WALBERLA_STATIC_ASSERT( sizeof(V) > sizeof(T) );
+   WALBERLA_STATIC_ASSERT( sizeof(V) % sizeof(T) == 0);
 
    // Checking the validity of the read operation
    WALBERLA_ASSERT_LESS_EQUAL( cur_ + BUFFER_DEBUG_OVERHEAD + sizeof(V)/sizeof(T), end_);
diff --git a/src/core/uid/UIDGenerators.h b/src/core/uid/UIDGenerators.h
index 96dc6443eba50168b2acba8adf9b1c613cc03101..d9c254d93986340ed079761a2951119e1d7d29c4 100644
--- a/src/core/uid/UIDGenerators.h
+++ b/src/core/uid/UIDGenerators.h
@@ -24,8 +24,7 @@
 
 #include "core/debug/Debug.h"
 
-#include <boost/cstdint.hpp>
-#include <boost/static_assert.hpp>
+#include <cstdint>
 
 #include <limits>
 
@@ -106,7 +105,7 @@ public:
 
    static const char* getType() { static const char* const type = "index generator"; return type; }
 
-   BOOST_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
                        !std::numeric_limits<UINT>::is_signed );
 };
 
@@ -142,7 +141,7 @@ public:
 
    static const char* getType() { static const char* const type = "standard generator"; return type; }
 
-   BOOST_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
                        !std::numeric_limits<UINT>::is_signed );
 };
 
@@ -242,7 +241,7 @@ public:
 
    static const char* getType() { static const char* const type = "bit generator"; return type; }
 
-   BOOST_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
                        !std::numeric_limits<UINT>::is_signed );
 };
 
@@ -281,7 +280,7 @@ public:
 
    static const char* getType() { static const char* const type = "singleton generator"; return type; }
 
-   BOOST_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
+   WALBERLA_STATIC_ASSERT( std::numeric_limits<UINT>::is_specialized && std::numeric_limits<UINT>::is_integer &&
                        !std::numeric_limits<UINT>::is_signed );
 };
 
diff --git a/src/field/Field.h b/src/field/Field.h
index b6e517ec3d1f774c2c372757a2423ced83e84ec5..079e8d7fe18408ce2f19e4ea7ac3d0cfd2f9914f 100644
--- a/src/field/Field.h
+++ b/src/field/Field.h
@@ -37,7 +37,6 @@
 #include "iterators/FieldPointer.h"
 
 #include <boost/function.hpp>
-#include <boost/static_assert.hpp>
 #include <memory>
 #include <vector>
 
diff --git a/src/field/FlagField.h b/src/field/FlagField.h
index 4472323ae4e149c11bf3537a603f7b3a35804817..2785dd199fac3964a2ae835c3bf7c15299ff213a 100644
--- a/src/field/FlagField.h
+++ b/src/field/FlagField.h
@@ -32,7 +32,6 @@
 #include "core/math/Uint.h"
 
 #include <boost/array.hpp>
-#include <boost/static_assert.hpp>
 #include <boost/type_traits/is_same.hpp>
 
 #include <iostream>
diff --git a/src/field/allocation/FieldAllocator.h b/src/field/allocation/FieldAllocator.h
index 78d149fc3ade6b3c26dcb8c08edbf8c100b27d3e..5be0ecf4b0dbd2b5e292d446dd13d62aae9aca23 100644
--- a/src/field/allocation/FieldAllocator.h
+++ b/src/field/allocation/FieldAllocator.h
@@ -26,7 +26,6 @@
 #include "core/debug/Debug.h"
 #include "field/CMakeDefs.h"
 
-#include <boost/static_assert.hpp>
 #include <map>
 #include <new>
 
@@ -289,8 +288,8 @@ namespace field {
             aligned_free(values);
          }
 
-         BOOST_STATIC_ASSERT_MSG(alignment > 0, "Use StdFieldAlloc");
-         BOOST_STATIC_ASSERT_MSG(!(alignment & (alignment - 1)) , "Alignment has to be power of 2");
+         static_assert(alignment > 0, "Use StdFieldAlloc");
+         static_assert(!(alignment & (alignment - 1)) , "Alignment has to be power of 2");
 
       private:
          /// Nr of elements per allocated pointer has to be stored to call the destructor on each element
diff --git a/src/field/vtk/VTKWriter.h b/src/field/vtk/VTKWriter.h
index fabb4d71454356a3ec213b64a3f30f19e93c33c7..c83033fe81a06a54c7a0874ceb8581fc07b6f353 100644
--- a/src/field/vtk/VTKWriter.h
+++ b/src/field/vtk/VTKWriter.h
@@ -169,7 +169,7 @@ inline vtk::VTKOutput::Write createVTKOutput  ( const ConstBlockDataID & fieldId
    auto vtkOutput = vtk::createVTKOutput_BlockData( blocks, identifier, writeFrequency, ghostLayers, forcePVTU, baseFolder, executionFolder,
                                                     continuousNumbering, binary, littleEndian, useMPIIO, initialExecutionCount );
 
-   vtkOutput->addCellDataWriter( boost::make_shared< VTKWriter< Field_T,OutputType > >( fieldId, identifier ) );
+   vtkOutput->addCellDataWriter( make_shared< VTKWriter< Field_T,OutputType > >( fieldId, identifier ) );
 
    return writeFiles( vtkOutput, true, simultaneousIOOperations, requiredStates, incompatibleStates );
 }
@@ -222,7 +222,7 @@ inline vtk::VTKOutput::Write createScalingVTKOutput( const ConstBlockDataID & fi
    auto vtkOutput = vtk::createVTKOutput_BlockData( blocks, identifier, writeFrequency, ghostLayers, forcePVTU, baseFolder, executionFolder,
                                                     continuousNumbering, binary, littleEndian, useMPIIO, initialExecutionCount );
 
-   auto writer = boost::make_shared< VTKWriter< Field_T,OutputType > >( fieldId, identifier );
+   auto writer = make_shared< VTKWriter< Field_T,OutputType > >( fieldId, identifier );
    vtkOutput->addCellDataWriter( vtk::makeBlockCellDataWriterScalingAdapter(identifier, writer, factor) );
 
    return writeFiles( vtkOutput, true, simultaneousIOOperations, requiredStates, incompatibleStates );
diff --git a/src/lbm/boundary/VelocityBoundary.h b/src/lbm/boundary/VelocityBoundary.h
index 383cd41bb2d4832dbd51276a56cadc1610ab7730..8b470021b3575e755894f49397ff9cc0ddb945c3 100644
--- a/src/lbm/boundary/VelocityBoundary.h
+++ b/src/lbm/boundary/VelocityBoundary.h
@@ -112,7 +112,7 @@ public:
    inline void treatDirection( const cell_idx_t  x, const cell_idx_t  y, const cell_idx_t  z, const stencil::Direction dir,
                                const cell_idx_t nx, const cell_idx_t ny, const cell_idx_t nz, const flag_t mask );
 
-   inline const std::vector<real_t> & getValue( const cell_idx_t x, cell_idx_t y, cell_idx_t z ) const { return vel_->get(x,y,z); }
+   inline const std::vector<real_t> & getValue( const cell_idx_t x, cell_idx_t y, cell_idx_t z ) const { return *(vel_->get(x,y,z)); }
 
 private:
 
diff --git a/src/lbm/srt/SplitPureSweep.impl.h b/src/lbm/srt/SplitPureSweep.impl.h
index 975e06eb7ebc65af827fbb196d168bbd29381da9..d545a9d1269be9cbd48833d610a37f12b91f8e3c 100644
--- a/src/lbm/srt/SplitPureSweep.impl.h
+++ b/src/lbm/srt/SplitPureSweep.impl.h
@@ -133,11 +133,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -489,11 +489,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -833,13 +833,13 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT rho = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT rho = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1191,13 +1191,13 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT rho = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT rho = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/lbm/srt/SplitSweep.impl.h b/src/lbm/srt/SplitSweep.impl.h
index 30d16a68f9ba9fb765f4f908bb0f1ba36edb666e..fca8be64fe097069ea8f8892177e27d0cb0691e8 100644
--- a/src/lbm/srt/SplitSweep.impl.h
+++ b/src/lbm/srt/SplitSweep.impl.h
@@ -127,13 +127,13 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -553,13 +553,13 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -967,15 +967,15 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT rho = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT rho = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1398,15 +1398,15 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT rho = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT rho = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT dir_indep_trm = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/lbm/srt/bluegeneq/SplitPureSweep.impl.h b/src/lbm/srt/bluegeneq/SplitPureSweep.impl.h
index 501bf1ed06b070f68caaa8a2fd158e98a86d2e51..865e3dfa7dd579c1518094c9214b8139418841e9 100644
--- a/src/lbm/srt/bluegeneq/SplitPureSweep.impl.h
+++ b/src/lbm/srt/bluegeneq/SplitPureSweep.impl.h
@@ -145,11 +145,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* dir_indep_trm = new real_t[ xSize ];
+   real_t* dir_indep_trm = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -634,11 +634,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* dir_indep_trm = new real_t[ xSize ];
+   real_t* dir_indep_trm = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -1038,13 +1038,13 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* rho = new real_t[ xSize ];
+   real_t* rho = new real_t[ uint_c(xSize) ];
 
-   real_t* dir_indep_trm = new real_t[ xSize ];
+   real_t* dir_indep_trm = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1529,13 +1529,13 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* rho = new real_t[ xSize ];
+   real_t* rho = new real_t[ uint_c(xSize) ];
 
-   real_t* dir_indep_trm = new real_t[ xSize ];
+   real_t* dir_indep_trm = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/lbm/trt/SplitPureSweep.impl.h b/src/lbm/trt/SplitPureSweep.impl.h
index 90f742b7b0c916194aae6e0358daabe93c59ac41..0c60f11b440c230bff7c211b24e51e59700bdbda 100644
--- a/src/lbm/trt/SplitPureSweep.impl.h
+++ b/src/lbm/trt/SplitPureSweep.impl.h
@@ -140,11 +140,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -543,11 +543,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -936,16 +936,16 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac1 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac2 = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT fac1 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT fac2 = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1358,16 +1358,16 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if< boost::mpl::and_
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac1 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac2 = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT fac1 = new real_t[ uint_c( xSize ) ];
+   real_t * WALBERLA_RESTRICT fac2 = new real_t[ uint_c( xSize ) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c( xSize ) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/lbm/trt/SplitSweep.impl.h b/src/lbm/trt/SplitSweep.impl.h
index f33ef64ab34d7110ddb12b648b1c02c897cfbe25..fed687b167e9f1f89e20d7e64d63ce3941732cf4 100644
--- a/src/lbm/trt/SplitSweep.impl.h
+++ b/src/lbm/trt/SplitSweep.impl.h
@@ -134,13 +134,13 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -611,13 +611,13 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -1074,18 +1074,18 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac1 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac2 = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT fac1 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT fac2 = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1570,18 +1570,18 @@ void SplitSweep< LatticeModel_T, FlagField_T, typename boost::enable_if< boost::
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t * WALBERLA_RESTRICT velX = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velY = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT velZ = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT velX = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velY = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT velZ = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac1 = new real_t[ xSize ];
-   real_t * WALBERLA_RESTRICT fac2 = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT t1x2 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT t2x2 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT fac1 = new real_t[ uint_c(xSize) ];
+   real_t * WALBERLA_RESTRICT fac2 = new real_t[ uint_c(xSize) ];
 
-   real_t * WALBERLA_RESTRICT feq_common = new real_t[ xSize ];
+   real_t * WALBERLA_RESTRICT feq_common = new real_t[ uint_c(xSize) ];
 
-   bool * WALBERLA_RESTRICT perform_lbm = new bool[ xSize ];
+   bool * WALBERLA_RESTRICT perform_lbm = new bool[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/lbm/trt/bluegeneq/SplitPureSweep.impl.h b/src/lbm/trt/bluegeneq/SplitPureSweep.impl.h
index 985667314552ca883d1115df4e4a45526c06f921..ca3821096a692da7bc61322f53e4b68a910e825a 100644
--- a/src/lbm/trt/bluegeneq/SplitPureSweep.impl.h
+++ b/src/lbm/trt/bluegeneq/SplitPureSweep.impl.h
@@ -151,11 +151,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* feq_common = new real_t[ xSize ];
+   real_t* feq_common = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -687,11 +687,11 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* feq_common = new real_t[ xSize ];
+   real_t* feq_common = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
@@ -1140,16 +1140,16 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* t1x2 = new real_t[ xSize ];
-   real_t* t2x2 = new real_t[ xSize ];
-   real_t* fac1 = new real_t[ xSize ];
-   real_t* fac2 = new real_t[ xSize ];
+   real_t* t1x2 = new real_t[ uint_c(xSize) ];
+   real_t* t2x2 = new real_t[ uint_c(xSize) ];
+   real_t* fac1 = new real_t[ uint_c(xSize) ];
+   real_t* fac2 = new real_t[ uint_c(xSize) ];
 
-   real_t* feq_common = new real_t[ xSize ];
+   real_t* feq_common = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx && dst->layout() == field::fzyx )
    {
@@ -1699,16 +1699,16 @@ void SplitPureSweep< LatticeModel_T, typename boost::enable_if_c< ice_and< boost
 #endif
    // temporaries, calculated by the first innermost loop
 
-   real_t* velX = new real_t[ xSize ];
-   real_t* velY = new real_t[ xSize ];
-   real_t* velZ = new real_t[ xSize ];
+   real_t* velX = new real_t[ uint_c(xSize) ];
+   real_t* velY = new real_t[ uint_c(xSize) ];
+   real_t* velZ = new real_t[ uint_c(xSize) ];
 
-   real_t* t1x2 = new real_t[ xSize ];
-   real_t* t2x2 = new real_t[ xSize ];
-   real_t* fac1 = new real_t[ xSize ];
-   real_t* fac2 = new real_t[ xSize ];
+   real_t* t1x2 = new real_t[ uint_c(xSize) ];
+   real_t* t2x2 = new real_t[ uint_c(xSize) ];
+   real_t* fac1 = new real_t[ uint_c(xSize) ];
+   real_t* fac2 = new real_t[ uint_c(xSize) ];
 
-   real_t* feq_common = new real_t[ xSize ];
+   real_t* feq_common = new real_t[ uint_c(xSize) ];
 
    if( src->layout() == field::fzyx )
    {
diff --git a/src/python_coupling/basic_exports/BasicExports.cpp b/src/python_coupling/basic_exports/BasicExports.cpp
index 837122b5a4012502f8833584308557621bd11944..a3e4a8f31cbeb1715515319c2b6ff0e37bbe1e42 100644
--- a/src/python_coupling/basic_exports/BasicExports.cpp
+++ b/src/python_coupling/basic_exports/BasicExports.cpp
@@ -41,6 +41,7 @@
 #include "python_coupling/helper/BlockStorageExportHelpers.h"
 #include "stencil/Directions.h"
 
+#include <boost/version.hpp>
 
 using namespace boost::python;
 
@@ -111,6 +112,47 @@ struct NumpyFloatConversion
 };
 
 
+#if BOOST_VERSION < 106300
+// taken from https://github.com/boostorg/python/commit/97e4b34a15978ca9d7c296da2de89b78bba4e0d5
+template <class T>
+struct exportSharedPtr
+{
+   exportSharedPtr()
+   {
+   converter::registry::insert( &convertible, &construct, boost::python::type_id<std::shared_ptr<T> >()
+#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
+                                , &converter::expected_from_python_type_direct<T>::get_pytype
+#endif
+                              );
+   }
+
+private:
+   static void* convertible( PyObject* p )
+   {
+      if ( p == Py_None )
+         return p;
+
+      return converter::get_lvalue_from_python( p, converter::registered<T>::converters );
+   }
+
+   static void construct( PyObject* source, converter::rvalue_from_python_stage1_data* data )
+   {
+      void* const storage = ( (converter::rvalue_from_python_storage< std::shared_ptr<T> >*) data )->storage.bytes;
+      // Deal with the "None" case.
+      if ( data->convertible == source )
+         new (storage) std::shared_ptr<T>();
+      else
+      {
+         std::shared_ptr<void> hold_convertible_ref_count( (void*)0, converter::shared_ptr_deleter( handle<>( borrowed( source ) ) ) );
+         // use aliasing constructor
+         new (storage) std::shared_ptr<T>( hold_convertible_ref_count, static_cast<T*>(data->convertible) );
+      }
+
+      data->convertible = storage;
+   }
+};
+#endif
+
 //======================================================================================================================
 //
 //  Helper Functions
@@ -609,6 +651,10 @@ void exportTiming()
          .def( self_ns::str(self) )
     ;
 
+#if BOOST_VERSION < 106300
+   exportSharedPtr<WcTimingTree>();
+#endif
+
 }
 
 
@@ -996,6 +1042,10 @@ void exportStructuredBlockStorage()
        .add_property( "periodic",                       &SbS_periodic )
 
        ;
+
+#if BOOST_VERSION < 106300
+   exportSharedPtr<StructuredBlockStorage>();
+#endif
 }
 
 //======================================================================================================================
@@ -1013,6 +1063,11 @@ void exportCommunication()
    using communication::UniformMPIDatatypeInfo;
    class_< UniformMPIDatatypeInfo, shared_ptr<UniformMPIDatatypeInfo>, boost::noncopyable>
       ( "UniformMPIDatatypeInfo", no_init );
+
+#if BOOST_VERSION < 106300
+   exportSharedPtr<UniformPackInfo>();
+   exportSharedPtr<UniformMPIDatatypeInfo>();
+#endif
 }
 
 //======================================================================================================================
diff --git a/tests/cuda/communication/GPUPackInfoCommunicationTest.cpp b/tests/cuda/communication/GPUPackInfoCommunicationTest.cpp
index f3f19d085012b02e8947d2d5100a7c2e3ad1dfb6..0d118f1f30b204633967a7fad9fce80ada5f6786 100644
--- a/tests/cuda/communication/GPUPackInfoCommunicationTest.cpp
+++ b/tests/cuda/communication/GPUPackInfoCommunicationTest.cpp
@@ -149,11 +149,11 @@ int main( int argc, char ** argv )
 
       // Setup communication schemes for synchronous GPUPackInfo
       CommSchemeType syncCommScheme(blocks);
-      syncCommScheme.addPackInfo( boost::make_shared< GPUPackInfoType >( syncGPUFieldId ) );
+      syncCommScheme.addPackInfo( make_shared< GPUPackInfoType >( syncGPUFieldId ) );
 
       // Setup communication scheme for asynchronous GPUPackInfo, which uses CUDA streams
       CommSchemeType asyncCommScheme(blocks);
-      asyncCommScheme.addPackInfo( boost::make_shared< GPUPackInfoType >( asyncGPUFieldId, streams ) );
+      asyncCommScheme.addPackInfo( make_shared< GPUPackInfoType >( asyncGPUFieldId, streams ) );
 
       // Perform one communication step for each scheme
       syncCommScheme();
diff --git a/tests/lbm/Poiseuille.cpp b/tests/lbm/Poiseuille.cpp
index c1bd59992ee499f2283141d7a3bd27d3a4f3a99a..5e56138fe75b24a278d201d9af3a15226e76582b 100644
--- a/tests/lbm/Poiseuille.cpp
+++ b/tests/lbm/Poiseuille.cpp
@@ -118,7 +118,7 @@ public:
         lastMeanError_( 0 ), lastMaxError_( 0 )
    {
       if ( filename.size() > 0 )
-         graphWriter_ = boost::make_shared<gather::GnuPlotGraphWriter>( filename );
+         graphWriter_ = make_shared<gather::GnuPlotGraphWriter>( filename );
    }
 
    virtual ~PoiseuilleVelocityDataProcessor() {}
diff --git a/tests/mesh/MeshDistancePlausibilityTest.cpp b/tests/mesh/MeshDistancePlausibilityTest.cpp
index 69b76016696ab8af49ea07c3160feedee153d7d7..ff99381ff610d00f045113fed9f46df8e66264f4 100644
--- a/tests/mesh/MeshDistancePlausibilityTest.cpp
+++ b/tests/mesh/MeshDistancePlausibilityTest.cpp
@@ -207,8 +207,8 @@ int main( int argc, char * argv[] )
 
       auto vtkOutput = vtk::createVTKOutput_BlockData( blocks, "plausibility test" );
 
-      vtkOutput->addCellDataWriter( boost::make_shared< field::VTKWriter< DistanceField, float  > >( distanceFieldId   , "distance field" ) );
-      vtkOutput->addCellDataWriter( boost::make_shared< field::VTKWriter< ErrorMarkerField      > >( errorMarkerFieldId, "error marker"   ) );
+      vtkOutput->addCellDataWriter( make_shared< field::VTKWriter< DistanceField, float  > >( distanceFieldId   , "distance field" ) );
+      vtkOutput->addCellDataWriter( make_shared< field::VTKWriter< ErrorMarkerField      > >( errorMarkerFieldId, "error marker"   ) );
 
       writeFiles( vtkOutput, true )();
    }