diff --git a/src/core/grid_generator/HCPIterator.h b/src/core/grid_generator/HCPIterator.h
index baa66f1e3f9b1a2aa218e899e3ed0d1b8cd9290e..dc84a29c61176ff55edd8e7ae53e3b8795ec8915 100644
--- a/src/core/grid_generator/HCPIterator.h
+++ b/src/core/grid_generator/HCPIterator.h
@@ -76,5 +76,39 @@ private:
    bool ended_;
 };
 
+/// Convenience class to enable range based for loops over grid points.
+/// Usage:
+/// \code for (const auto& pt : HCPGrid(...) ) \endcode
+class HCPGrid
+{
+public:
+   using iterator = HCPIterator;
+   using value_type = iterator::value_type;
+
+   /**
+    * @param domain volume were lattice points will be returned
+    * @param pointOfReference point somewhere in the world which fixes the lattice
+    * @param spacing spacing between grid points in x direction
+    */
+   HCPGrid(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t spacing)
+      : domain_(domain)
+      , pointOfReference_(pointOfReference)
+      , spacing_(spacing)
+   {}
+
+   HCPIterator begin() {return HCPIterator(domain_, pointOfReference_, spacing_);}
+   HCPIterator begin()  const {return HCPIterator(domain_, pointOfReference_, spacing_);}
+   HCPIterator cbegin() const {return HCPIterator(domain_, pointOfReference_, spacing_);}
+
+   HCPIterator end() {return HCPIterator();}
+   HCPIterator end()  const {return HCPIterator();}
+   HCPIterator cend() const {return HCPIterator();}
+
+private:
+   AABB domain_;
+   Vector3<real_t> pointOfReference_;
+   real_t spacing_;
+};
+
 } // namespace grid_generator
 } // namespace walberla
diff --git a/src/core/grid_generator/SCIterator.cpp b/src/core/grid_generator/SCIterator.cpp
index cf5c9d751f41d21a4471572ffd9ff3cf1bd3902d..6c4399a6489ab85d22d647f3e84516685d07e680 100644
--- a/src/core/grid_generator/SCIterator.cpp
+++ b/src/core/grid_generator/SCIterator.cpp
@@ -30,7 +30,7 @@
 namespace walberla {
 namespace grid_generator {
 
-SCIterator::SCIterator(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t spacing)
+SCIterator::SCIterator(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t& spacing)
    : i_(0)
    , j_(0)
    , k_(0)
diff --git a/src/core/grid_generator/SCIterator.h b/src/core/grid_generator/SCIterator.h
index 39fde5c03c7ef024db2d728a59e3fd3ecad875c4..4946f8dbd3b4d5d55fb857773e4d9c1c141e0743 100644
--- a/src/core/grid_generator/SCIterator.h
+++ b/src/core/grid_generator/SCIterator.h
@@ -55,7 +55,7 @@ public:
     * @param pointOfReference point somewhere in the world which fixes the lattice
     * @param spacing spacing between grid points in x, y and z direction
     */
-   SCIterator(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t spacing);
+   SCIterator(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t& spacing);
    /**
     * @brief begin iterator
     * @param domain volume were lattice points will be returned
@@ -77,9 +77,9 @@ public:
    static inline real_t getUnitCellX(const real_t spacing) { return spacing; }
    static inline real_t getUnitCellY(const real_t spacing) { return spacing; }
    static inline real_t getUnitCellZ(const real_t spacing) { return spacing; }
-   static inline real_t getUnitCellX(const Vector3<real_t> spacing) { return spacing[0]; }
-   static inline real_t getUnitCellY(const Vector3<real_t> spacing) { return spacing[1]; }
-   static inline real_t getUnitCellZ(const Vector3<real_t> spacing) { return spacing[2]; }
+   static inline real_t getUnitCellX(const Vector3<real_t>& spacing) { return spacing[0]; }
+   static inline real_t getUnitCellY(const Vector3<real_t>& spacing) { return spacing[1]; }
+   static inline real_t getUnitCellZ(const Vector3<real_t>& spacing) { return spacing[2]; }
 
 private:
    void updatePoint();
@@ -99,5 +99,49 @@ private:
    bool ended_;
 };
 
+/// Convenience class to enable range based for loops over grid points.
+/// Usage:
+/// \code for (const auto& pt : SCGrid(...) ) \endcode
+class SCGrid
+{
+public:
+   using iterator = SCIterator;
+   using value_type = iterator::value_type;
+
+   /**
+    * @param domain volume were lattice points will be returned
+    * @param pointOfReference point somewhere in the world which fixes the lattice
+    * @param spacing spacing between grid points in x, y and z direction
+    */
+   SCGrid(const AABB& domain, const Vector3<real_t>& pointOfReference, const real_t spacing)
+      : domain_(domain)
+      , pointOfReference_(pointOfReference)
+      , spacing_(spacing, spacing, spacing)
+   {}
+   /**
+    * @brief begin iterator
+    * @param domain volume were lattice points will be returned
+    * @param pointOfReference point somewhere in the world which fixes the lattice
+    * @param spacing spacing between grid points in x, y and z direction
+    */
+   SCGrid(const AABB& domain, const Vector3<real_t>& pointOfReference, const Vector3<real_t>& spacing)
+   : domain_(domain)
+   , pointOfReference_(pointOfReference)
+   , spacing_(spacing)
+   {}
+
+   SCIterator begin() {return SCIterator(domain_, pointOfReference_, spacing_);}
+   SCIterator begin()  const {return SCIterator(domain_, pointOfReference_, spacing_);}
+   SCIterator cbegin() const {return SCIterator(domain_, pointOfReference_, spacing_);}
+
+   SCIterator end() {return SCIterator();}
+   SCIterator end()  const {return SCIterator();}
+   SCIterator cend() const {return SCIterator();}
+private:
+   AABB            domain_;
+   Vector3<real_t> pointOfReference_;
+   Vector3<real_t> spacing_;
+};
+
 } // namespace grid_generator
 } // namespace walberla
diff --git a/tests/core/GridGeneratorTest.cpp b/tests/core/GridGeneratorTest.cpp
index 6de66e4c7c0aa86bb5786f2d342ba5fa446cd55f..bb5520a402a76ed22a2accdafe9e4cf384f65fb1 100644
--- a/tests/core/GridGeneratorTest.cpp
+++ b/tests/core/GridGeneratorTest.cpp
@@ -90,6 +90,23 @@ void referencePointTest()
    WALBERLA_CHECK_EQUAL( higherIt, endIt);
 }
 
+template <class Grid>
+void rangeBasedTest()
+{
+   math::AABB domain(0,0,0,10,10,10);
+   real_t spacing = real_c(1);
+   auto dx = Vector3<real_t>( Grid::iterator::getUnitCellX(spacing), Grid::iterator::getUnitCellY(spacing), Grid::iterator::getUnitCellZ(spacing) );
+   auto lowerIt  = typename Grid::iterator(domain, Vector3<real_t>(5,5,5) - dx * 30, spacing);
+   auto endIt = typename Grid::iterator();
+   for ( const auto& pt : Grid(domain, Vector3<real_t>(5,5,5) - dx * 30, spacing) )
+   {
+      WALBERLA_CHECK( lowerIt != endIt );
+      WALBERLA_CHECK_FLOAT_EQUAL( *lowerIt, pt);
+      ++lowerIt;
+   }
+   WALBERLA_CHECK( lowerIt == endIt );
+}
+
 int main( int argc, char** argv )
 {
    walberla::Environment env(argc, argv);
@@ -139,5 +156,8 @@ int main( int argc, char** argv )
    referencePointTest<SCIterator>();
    referencePointTest<HCPIterator>();
 
+   rangeBasedTest<SCGrid>();
+   rangeBasedTest<HCPGrid>();
+
    return EXIT_SUCCESS;
 }