diff --git a/src/domain_decomposition/PeriodicIntersectionVolume.cpp b/src/domain_decomposition/PeriodicIntersectionVolume.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ac61fc474155c852de64162e52f05b391eead46d
--- /dev/null
+++ b/src/domain_decomposition/PeriodicIntersectionVolume.cpp
@@ -0,0 +1,53 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file PeriodicIntersectionVolume.cpp
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#include "core/logging/Logging.h"
+#include "MapPointToPeriodicDomain.h"
+
+namespace walberla {
+namespace domain_decomposition {
+
+real_t periodicIntersectionVolume( const std::array< bool, 3 > & periodic, const math::AABB & domain, const math::AABB & box1, const math::AABB & box2 )
+{
+   const auto diagonal = (domain.maxCorner() - domain.minCorner());
+   const auto halfDiagonal = real_t(0.5) * diagonal;
+   const auto center1 = box1.center();
+   auto center2 = box2.center();
+
+   for (size_t dim = 0; dim < 3; ++dim)
+   {
+      if (periodic[dim])
+      {
+         while ((center2[dim]-center1[dim])>halfDiagonal[dim]) center2[dim] -= diagonal[dim];
+         while ((center2[dim]-center1[dim])<-halfDiagonal[dim]) center2[dim] += diagonal[dim];
+      }
+   }
+
+   return box1.intersectionVolume(box2.getTranslated(center2 - box2.center()));
+}
+
+real_t periodicIntersectionVolume( const std::array< bool, 3 > & periodic, const math::AABB & domain, const math::AABB& box1, const math::AABB & box2, const real_t dx )
+{
+   return periodicIntersectionVolume(periodic, domain, box1.getExtended( dx ), box2);
+}
+
+
+} // namespace domain_decomposition
+} // namespace walberla
diff --git a/src/domain_decomposition/PeriodicIntersectionVolume.h b/src/domain_decomposition/PeriodicIntersectionVolume.h
new file mode 100644
index 0000000000000000000000000000000000000000..15c13d70235e542e10f96b176c1e60c88c3e2c95
--- /dev/null
+++ b/src/domain_decomposition/PeriodicIntersectionVolume.h
@@ -0,0 +1,36 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file PeriodicIntersectionVolume.h
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#pragma once
+
+#include "core/DataTypes.h"
+#include "core/math/AABB.h"
+#include "core/math/Vector3.h"
+
+#include <array>
+
+namespace walberla {
+namespace domain_decomposition {
+
+real_t periodicIntersectionVolume( const std::array< bool, 3 > & periodic, const math::AABB & domain, const math::AABB & box1, const math::AABB & box2 );
+real_t periodicIntersectionVolume( const std::array< bool, 3 > & periodic, const math::AABB & domain, const math::AABB& box1, const math::AABB & box2, const real_t dx );
+
+} // namespace domain_decomposition
+} // namespace walberla
diff --git a/tests/domain_decomposition/CMakeLists.txt b/tests/domain_decomposition/CMakeLists.txt
index 9ab9ff72cb0418ca4ce77b09fe7e945c29ecb42e..2c7cae2624be9baca0d50259c941223c233aa4f9 100644
--- a/tests/domain_decomposition/CMakeLists.txt
+++ b/tests/domain_decomposition/CMakeLists.txt
@@ -6,3 +6,6 @@
 
 waLBerla_compile_test( NAME PeriodicIntersect FILES PeriodicIntersect.cpp DEPENDS core blockforest )
 waLBerla_execute_test( NAME PeriodicIntersect )
+
+waLBerla_compile_test( NAME PeriodicIntersectionVolume FILES PeriodicIntersectionVolume.cpp DEPENDS core blockforest )
+waLBerla_execute_test( NAME PeriodicIntersectionVolume )
diff --git a/tests/domain_decomposition/PeriodicIntersectionVolume.cpp b/tests/domain_decomposition/PeriodicIntersectionVolume.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cb48e5777aef6ecd6054ad984c1a62b0a6a7ad45
--- /dev/null
+++ b/tests/domain_decomposition/PeriodicIntersectionVolume.cpp
@@ -0,0 +1,99 @@
+//======================================================================================================================
+//
+//  This file is part of waLBerla. waLBerla is free software: you can 
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of 
+//  the License, or (at your option) any later version.
+//  
+//  waLBerla is distributed in the hope that it will be useful, but WITHOUT 
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
+//  for more details.
+//  
+//  You should have received a copy of the GNU General Public License along
+//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file DataTypesTest.cpp
+//! \author Sebastian Eibl <sebastian.eibl@fau.de>
+//
+//======================================================================================================================
+
+#include "core/Environment.h"
+#include "core/math/AABB.h"
+#include "core/debug/Debug.h"
+#include "core/debug/TestSubsystem.h"
+#include "core/logging/Logging.h"
+
+#include "domain_decomposition/PeriodicIntersectionVolume.h"
+
+#include "stencil/D3Q27.h"
+
+int main( int argc, char** argv )
+{
+   using namespace walberla;
+   using namespace walberla::domain_decomposition;
+
+   debug::enterTestMode();
+
+   Environment walberlaEnv( argc, argv );
+   WALBERLA_UNUSED(walberlaEnv);
+
+   std::array< bool, 3 > periodic{{true, true, true}};
+   math::AABB domain(real_t(0),real_t(0),real_t(0),real_t(100),real_t(100),real_t(100));
+   math::AABB box1(real_t(0),real_t(0),real_t(0),real_t(10),real_t(10),real_t(10));
+   math::AABB box2(real_t(0),real_t(0),real_t(0),real_t(10),real_t(10),real_t(10));
+
+   for (int multiple = 0; multiple < 3; ++multiple)
+   {
+      for (auto dir = stencil::D3Q27::beginNoCenter(); dir != stencil::D3Q27::end(); ++dir)
+      {
+         Vector3<real_t> shift(
+               real_c(dir.cx()) * (real_t(9) + domain.xSize() * real_c(multiple)),
+               real_c(dir.cy()) * (real_t(9) + domain.ySize() * real_c(multiple)),
+               real_c(dir.cz()) * (real_t(9) + domain.zSize() * real_c(multiple)));
+         box2.setCenter(shift + box1.center());
+         real_t vol = periodicIntersectionVolume(periodic, domain, box1, box2);
+
+         switch (dir.direction())
+         {
+         case stencil::BNE:
+         case stencil::BNW:
+         case stencil::BSE:
+         case stencil::BSW:
+         case stencil::TNE:
+         case stencil::TNW:
+         case stencil::TSE:
+         case stencil::TSW:
+            WALBERLA_CHECK_FLOAT_EQUAL(vol, real_t(1));
+            break;
+         case stencil::BN:
+         case stencil::BW:
+         case stencil::BS:
+         case stencil::BE:
+         case stencil::TN:
+         case stencil::TW:
+         case stencil::TS:
+         case stencil::TE:
+         case stencil::NE:
+         case stencil::NW:
+         case stencil::SE:
+         case stencil::SW:
+            WALBERLA_CHECK_FLOAT_EQUAL(vol, real_t(10));
+            break;
+         case stencil::B:
+         case stencil::T:
+         case stencil::N:
+         case stencil::W:
+         case stencil::S:
+         case stencil::E:
+            WALBERLA_CHECK_FLOAT_EQUAL(vol, real_t(100));
+            break;
+         default:
+            WALBERLA_CHECK(false, "Should not end up here!");
+            break;
+         }
+      }
+   }
+
+   return EXIT_SUCCESS;
+}