diff --git a/apps/gpu/RotatingGrid/RotatingGrid.cpp b/apps/gpu/RotatingGrid/RotatingGrid.cpp
index 7279caf1a18a2770a1fb930a89e5b306bced34f3..bc13d54b46fdd4421eb69c9305ad3daaab792078 100644
--- a/apps/gpu/RotatingGrid/RotatingGrid.cpp
+++ b/apps/gpu/RotatingGrid/RotatingGrid.cpp
@@ -77,7 +77,7 @@ int main()
         // Simulation parameters
         //////////////////////////////////////////////////////////////////////////
         enum RotationOrInterpolation {Rot, Int};
-        const RotationOrInterpolation rotOrInt = Rot;
+        const RotationOrInterpolation rotOrInt = Int;
 
         const std::string path("./output/RotatingGrid");
         const std::string simulationName = rotOrInt == Int ? "RotatingGridInterpolationTest" : "RotatingGrid";
@@ -197,7 +197,7 @@ int main()
 
         Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, &scalingFactory);
 
-        const std::string gridName = rotOrInt == Rot ? "rot_grid" : "rot";
+        const std::string gridName = rotOrInt == Rot ? "rot_grid" : "grid";
         gridBuilder->writeGridsToVtk(para->getOutputPath() + gridName);
         // NeighborDebugWriter::writeNeighborLinkLinesDebug(para.get());
 
diff --git a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp
index b41813e12da1727ba03b7f179c93b4c6b042b76f..fbbf7460e9ec17946171f0f228ead6718ba13543 100644
--- a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp
+++ b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.cpp
@@ -162,13 +162,13 @@ bool Conglomerate::isPointInObject(const double& x1, const double& x2, const dou
     return false;
 }
 
-void Conglomerate::scale(double delta)
+void Conglomerate::changeSizeByDelta(double delta)
 {
     for (uint i = 0; i < numberOfAddObjects; i++)
-        addObjects[i]->scale(delta);
+        addObjects[i]->changeSizeByDelta(delta);
 
     for (uint i = 0; i < numberOfSubtractObjects; i++)
-        subtractObjects[i]->scale(delta);
+        subtractObjects[i]->changeSizeByDelta(delta);
 }
 
 void Conglomerate::findInnerNodes(SPtr<GridImp> grid)
diff --git a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h
index 0b3f7ad7b67554b72ad78188d68d9570bf21e090..ed6caace2bd3d99bd119c0771f1f5312a815dc40 100644
--- a/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h
+++ b/src/gpu/GridGenerator/geometries/Conglomerate/Conglomerate.h
@@ -63,7 +63,7 @@ public:
     double getX3Minimum() override;
     double getX3Maximum() override;
 
-    void scale(double delta) override;
+    void changeSizeByDelta(double delta) override;
 
     bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override;
 
diff --git a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp
index 2cf56a867954abecf14f7dc2a74f735ebb0660a7..e6c05313b24a656ed9171f7385d0c68a3fd7f9f6 100644
--- a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp
+++ b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.cpp
@@ -131,7 +131,7 @@ bool Cuboid::isBetween(const real& coord, const real& start, const real& end)
 }
 
 
-void Cuboid::scale(double delta)
+void Cuboid::changeSizeByDelta(double delta)
 {
     this->minX1 -= delta;
     this->minX2 -= delta;
diff --git a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h
index 7ff5c14c2f17b4ed80f4f1e0c03d26ea1a2eb196..152a8dc6b6dd89c565ec55e49c943a5d18dab782 100644
--- a/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h
+++ b/src/gpu/GridGenerator/geometries/Cuboid/Cuboid.h
@@ -54,7 +54,7 @@ public:
     double getX3Minimum() override;
     double getX3Maximum() override;
 
-    void scale(double delta) override;
+    void changeSizeByDelta(double delta) override;
 
     bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override;
 
diff --git a/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.cpp b/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a102e01cd211f3a46d24f92e5541613a2b939d9e
--- /dev/null
+++ b/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.cpp
@@ -0,0 +1,128 @@
+#include "Cylinder.h"
+#include <numeric>
+
+Cylinder::Cylinder(double centerX, double centerY, double centerZ, double radius, double height, PrincipalAxis axis)
+    : center({ centerX, centerY, centerZ }), radius(radius), height(height), principalAxis(axis)
+{
+}
+
+Cylinder::Cylinder(std::array<double, 3> center, double radius, double height, PrincipalAxis axis)
+    : center(center), radius(radius), height(height), principalAxis(axis)
+{
+}
+
+SPtr<Object> Cylinder::clone() const
+{
+    return std::make_shared<Cylinder>(center, radius, height, principalAxis);
+}
+
+double Cylinder::getCentroidCoordinate(PrincipalAxis coordinateDirection) const
+{
+    return center.at(coordinateDirection);
+}
+
+double Cylinder::getMinimunCoordinate(PrincipalAxis coordinateDirection) const
+{
+    const auto unitVector = unitVectors.at(principalAxis);
+    return center.at(coordinateDirection) - 0.5 * height * unitVector.at(coordinateDirection) +
+           radius * (unitVector.at(coordinateDirection) - 1);
+}
+
+double Cylinder::getMaximumCoordinate(PrincipalAxis coordinateDirection) const
+{
+    const auto unitVector = unitVectors.at(principalAxis);
+    return center.at(coordinateDirection) + 0.5 * height * unitVector.at(coordinateDirection) -
+           radius * (unitVector.at(coordinateDirection) - 1);
+}
+
+double Cylinder::getX1Centroid()
+{
+    return getCentroidCoordinate(x);
+}
+
+double Cylinder::getX1Minimum()
+{
+    return getMinimunCoordinate(x);
+}
+
+double Cylinder::getX1Maximum()
+{
+    return getMaximumCoordinate(x);
+}
+
+double Cylinder::getX2Centroid()
+{
+    return getCentroidCoordinate(y);
+}
+
+double Cylinder::getX2Minimum()
+{
+    return getMinimunCoordinate(y);
+}
+
+double Cylinder::getX2Maximum()
+{
+    return getMaximumCoordinate(y);
+}
+
+double Cylinder::getX3Centroid()
+{
+    return getCentroidCoordinate(z);
+}
+
+double Cylinder::getX3Minimum()
+{
+    return getMinimunCoordinate(z);
+}
+
+double Cylinder::getX3Maximum()
+{
+    return getMaximumCoordinate(z);
+}
+
+double Cylinder::getRadius() const
+{
+    return radius;
+}
+
+double Cylinder::getHeight() const
+{
+    return height;
+}
+
+bool Cylinder::isInCircle(double delta1, double delta2, double offset) const
+{
+    return (delta1 * delta1 + delta2 * delta2) < ((this->radius - offset) * (this->radius - offset));
+}
+
+bool Cylinder::isPointInObject(const double &x1, const double &x2, const double &x3, const double &minOffset,
+                               const double &maxOffset)
+{
+    double offset = maxOffset;
+    if (x1 < center.at(x) || x2 < center.at(y) || x3 < center.at(z)) offset = minOffset;
+
+    const double deltaX1 = x1 - center.at(x);
+    const double deltaX2 = x2 - center.at(y);
+    const double deltaX3 = x3 - center.at(z);
+
+    switch (principalAxis) {
+        case x:
+            if (deltaX1 > 0.5 * height || deltaX1 < -0.5 * height) return false;
+            return isInCircle(deltaX2, deltaX3, offset);
+        case y:
+            if (deltaX2 > 0.5 * height || deltaX2 < -0.5 * height) return false;
+            return isInCircle(deltaX1, deltaX3, offset);
+        case z:
+            if (deltaX3 > 0.5 * height || deltaX3 < -0.5 * height) return false;
+            return isInCircle(deltaX1, deltaX2, offset);
+    }
+
+    VF_LOG_CRITICAL("Unknown principal axis in Cylinder.");
+    return false;
+}
+
+void Cylinder::changeSizeByDelta(double delta)
+{
+    this->radius += delta;
+    this->height += 2 * delta;
+}
\ No newline at end of file
diff --git a/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.h b/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.h
new file mode 100644
index 0000000000000000000000000000000000000000..5af1f3b15f205f5a44196a984ebd551c047e51fd
--- /dev/null
+++ b/src/gpu/GridGenerator/geometries/Cylinder/Cylinder.h
@@ -0,0 +1,91 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids 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.
+//
+//  VirtualFluids 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 VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file Cylinder.h
+//! \ingroup geometries
+//! \author Anna Wellmann
+//=======================================================================================
+
+
+#ifndef CYLINDER_H
+#define CYLINDER_H
+
+#include "geometries/Object.h"
+#include <basics/geometry3d/GbCylinder3D.h>
+#include <map>
+
+class GRIDGENERATOR_EXPORT Cylinder : public Object
+{
+public:
+    enum PrincipalAxis {
+        x = 0,
+        y = 1,
+        z = 2,
+    };
+
+    Cylinder(double centerX, double centerY, double centerZ, double radius, double height, PrincipalAxis axis);
+    Cylinder(std::array<double, 3> center, double radius, double height, PrincipalAxis axis);
+
+    SPtr<Object> clone() const override;
+
+    double getX1Centroid() override;
+    double getX1Minimum() override;
+    double getX1Maximum() override;
+    double getX2Centroid() override;
+    double getX2Minimum() override;
+    double getX2Maximum() override;
+    double getX3Centroid() override;
+    double getX3Minimum() override;
+    double getX3Maximum() override;
+
+    double getRadius() const;
+    double getHeight() const;
+
+    bool isPointInObject(const double &x1, const double &x2, const double &x3, const double &minOffset,
+                         const double &maxOffset) override;
+    void changeSizeByDelta(double delta) override;
+
+private:
+    double getCentroidCoordinate(PrincipalAxis coordinateDirection) const;
+    double getMinimunCoordinate(PrincipalAxis coordinateDirection) const;
+    double getMaximumCoordinate(PrincipalAxis coordinateDirection) const;
+
+    bool isInCircle(double delta1, double delta2, double offset) const;
+
+    const std::map<PrincipalAxis, std::array<double, 3>> unitVectors{ { x, { 1, 0, 0 } },
+                                                                      { y, { 0, 1, 0 } },
+                                                                      { z, { 0, 0, 1 } } };
+
+    PrincipalAxis principalAxis;
+    const std::array<double, 3> center;
+
+    double radius;
+    double height;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gpu/GridGenerator/geometries/Cylinder/CylinderTest.cpp b/src/gpu/GridGenerator/geometries/Cylinder/CylinderTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6c0582f488783adc5fb5678d9b482ba151cbd9a2
--- /dev/null
+++ b/src/gpu/GridGenerator/geometries/Cylinder/CylinderTest.cpp
@@ -0,0 +1,212 @@
+#include <gmock/gmock.h>
+
+#include "Cylinder.h"
+
+
+void testChangeSizeByDelta(Cylinder &cylinder)
+{
+    const double delta = 0.2;
+    const double tolerance = 0.0000000001;
+    const double oldRadius = cylinder.getRadius();
+    const double oldHeight = cylinder.getHeight();
+    const double oldMinimumX1 = cylinder.getX1Minimum();
+    const double oldMinimumX2 = cylinder.getX2Minimum();
+    const double oldMinimumX3 = cylinder.getX3Minimum();
+    const double oldMaximumX1 = cylinder.getX1Maximum();
+    const double oldMaximumX2 = cylinder.getX2Maximum();
+    const double oldMaximumX3 = cylinder.getX3Maximum();
+
+    cylinder.changeSizeByDelta(delta);
+
+    EXPECT_THAT(cylinder.getRadius(), testing::Eq(oldRadius + delta));
+    EXPECT_THAT(cylinder.getHeight(), testing::Eq(oldHeight + 2 * delta));
+    EXPECT_THAT(cylinder.getX1Minimum(), testing::DoubleNear(oldMinimumX1 - delta, tolerance));
+    EXPECT_THAT(cylinder.getX2Minimum(), testing::DoubleNear(oldMinimumX2 - delta, tolerance));
+    EXPECT_THAT(cylinder.getX3Minimum(), testing::DoubleNear(oldMinimumX3 - delta, tolerance));
+    EXPECT_THAT(cylinder.getX1Maximum(), testing::DoubleNear(oldMaximumX1 + delta, tolerance));
+    EXPECT_THAT(cylinder.getX2Maximum(), testing::DoubleNear(oldMaximumX2 + delta, tolerance));
+    EXPECT_THAT(cylinder.getX3Maximum(), testing::DoubleNear(oldMaximumX3 + delta, tolerance));
+}
+
+// CylinderTestAxisNormalToX ////////////////////////////////////////////////
+
+class CylinderTestAxisNormalToX : public testing::Test
+{
+public:
+    std::array<double, 3> center = { 0.1, 0.2, 0.3 };
+    double radius = 2.0;
+    double height = 8.0;
+    Cylinder cylinder = Cylinder(center[0], center[1], center[2], radius, height, Cylinder::PrincipalAxis::x);
+};
+
+TEST_F(CylinderTestAxisNormalToX, getCentroid)
+{
+    EXPECT_THAT(cylinder.getX1Centroid(), testing::Eq(center[0]));
+    EXPECT_THAT(cylinder.getX2Centroid(), testing::Eq(center[1]));
+    EXPECT_THAT(cylinder.getX3Centroid(), testing::Eq(center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToX, getMinimum)
+{
+    EXPECT_THAT(cylinder.getX1Minimum(), testing::Eq(-0.5 * height + center[0]));
+    EXPECT_THAT(cylinder.getX2Minimum(), testing::Eq(-radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Minimum(), testing::Eq(-radius + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToX, getMaximum)
+{
+    EXPECT_THAT(cylinder.getX1Maximum(), testing::Eq(0.5 * height + center[0]));
+    EXPECT_THAT(cylinder.getX2Maximum(), testing::Eq(radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Maximum(), testing::Eq(radius + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToX, isPointInObject)
+{
+    double epsilon = 0.0001;
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2], 0.0, 0.0));
+
+    // x
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] - 0.5 * height + epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] - 0.5 * height - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] + 0.5 * height - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] + 0.5 * height + epsilon, center[1], center[2], 0.0, 0.0));
+
+    // y
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] - radius + epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] - radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] + radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] + radius + epsilon, center[2], 0.0, 0.0));
+
+    // z
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] - radius + epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] - radius - epsilon, 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] + radius - epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] + radius + epsilon, 0.0, 0.0));
+}
+
+TEST_F(CylinderTestAxisNormalToX, changeSizeByDelta)
+{
+    testChangeSizeByDelta(cylinder);
+}
+
+// CylinderTestAxisNormalToY ////////////////////////////////////////////////
+
+class CylinderTestAxisNormalToY : public testing::Test
+{
+protected:
+    std::array<double, 3> center = { 0.1, 0.2, 0.3 };
+    double radius = 2.0;
+    double height = 8.0;
+    Cylinder cylinder = Cylinder({ center[0], center[1], center[2] }, radius, height, Cylinder::PrincipalAxis::y);
+};
+
+TEST_F(CylinderTestAxisNormalToY, getCentroid)
+{
+    EXPECT_THAT(cylinder.getX1Centroid(), testing::Eq(center[0]));
+    EXPECT_THAT(cylinder.getX2Centroid(), testing::Eq(center[1]));
+    EXPECT_THAT(cylinder.getX3Centroid(), testing::Eq(center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToY, getMinimum)
+{
+    EXPECT_THAT(cylinder.getX1Minimum(), testing::Eq(-radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Minimum(), testing::Eq(-0.5 * height + center[1]));
+    EXPECT_THAT(cylinder.getX3Minimum(), testing::Eq(-radius + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToY, getMaximum)
+{
+    EXPECT_THAT(cylinder.getX1Maximum(), testing::Eq(radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Maximum(), testing::Eq(0.5 * height + center[1]));
+    EXPECT_THAT(cylinder.getX3Maximum(), testing::Eq(radius + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToY, isPointInObject)
+{
+    double epsilon = 0.0001;
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2], 0.0, 0.0));
+
+    // x
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] - radius + epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] - radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] + radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] + radius + epsilon, center[1], center[2], 0.0, 0.0));
+
+    // y
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] - 0.5 * height + epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] - 0.5 * height - epsilon, center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] + 0.5 * height - epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] + 0.5 * height + epsilon, center[2], 0.0, 0.0));
+
+    // z
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] - radius + epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] - radius - epsilon, 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] + radius - epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] + radius + epsilon, 0.0, 0.0));
+}
+
+TEST_F(CylinderTestAxisNormalToY, changeSizeByDelta)
+{
+    testChangeSizeByDelta(cylinder);
+}
+
+// CylinderTestAxisNormalToZ ////////////////////////////////////////////////
+
+class CylinderTestAxisNormalToZ : public testing::Test
+{
+protected:
+    std::array<double, 3> center = { 0.1, 0.2, 0.3 };
+    double radius = 2.0;
+    double height = 8.0;
+    Cylinder cylinder = Cylinder({ center[0], center[1], center[2] }, radius, height, Cylinder::PrincipalAxis::z);
+};
+
+TEST_F(CylinderTestAxisNormalToZ, getCentroid)
+{
+    EXPECT_THAT(cylinder.getX1Centroid(), testing::Eq(center[0]));
+    EXPECT_THAT(cylinder.getX2Centroid(), testing::Eq(center[1]));
+    EXPECT_THAT(cylinder.getX3Centroid(), testing::Eq(center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToZ, getMinimum)
+{
+    EXPECT_THAT(cylinder.getX1Minimum(), testing::Eq(-radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Minimum(), testing::Eq(-radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Minimum(), testing::Eq(-0.5 * height + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToZ, getMaximum)
+{
+    EXPECT_THAT(cylinder.getX1Maximum(), testing::Eq(radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Maximum(), testing::Eq(radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Maximum(), testing::Eq(0.5 * height + center[2]));
+}
+
+TEST_F(CylinderTestAxisNormalToZ, isPointInObject)
+{
+    double epsilon = 0.0001;
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2], 0.0, 0.0));
+
+    // x
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] - radius + epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] - radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] + radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] + radius + epsilon, center[1], center[2], 0.0, 0.0));
+
+    // y
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] - radius + epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] - radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] + radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] + radius + epsilon, center[2], 0.0, 0.0));
+
+    // z
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height + epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height - epsilon, 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height - epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height + epsilon, 0.0, 0.0));
+}
+
+TEST_F(CylinderTestAxisNormalToZ, changeSizeByDelta)
+{
+    testChangeSizeByDelta(cylinder);
+}
diff --git a/src/gpu/GridGenerator/geometries/Object.h b/src/gpu/GridGenerator/geometries/Object.h
index 8bb0a35d5e38df1f7db390fdf5ee750295788395..4448a45aecd2c89188ff955c570cf7fd38c2ba3b 100644
--- a/src/gpu/GridGenerator/geometries/Object.h
+++ b/src/gpu/GridGenerator/geometries/Object.h
@@ -59,7 +59,7 @@ public:
     virtual double getX3Maximum()  = 0;
 
 
-    virtual void scale(double delta) = 0;
+    virtual void changeSizeByDelta(double delta) = 0;
 
 
     virtual bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) = 0;
diff --git a/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp b/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp
index 4669bbcfb9848a910bc86f9331a394daf6c55dd5..212ecc90019d6ab87230b4faa717da2d754fc75c 100644
--- a/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp
+++ b/src/gpu/GridGenerator/geometries/Sphere/Sphere.cpp
@@ -115,7 +115,7 @@ bool Sphere::isPointInObject(const double& x1, const double& x2, const double& x
 }
 
 
-void Sphere::scale(double delta)
+void Sphere::changeSizeByDelta(double delta)
 {
     this->radius += delta;
 }
diff --git a/src/gpu/GridGenerator/geometries/Sphere/Sphere.h b/src/gpu/GridGenerator/geometries/Sphere/Sphere.h
index 9ac8821a9c95fce8de16c22688ef3c585197804a..99d055ec1ba04117d4fdd525520a277d8129e9f7 100644
--- a/src/gpu/GridGenerator/geometries/Sphere/Sphere.h
+++ b/src/gpu/GridGenerator/geometries/Sphere/Sphere.h
@@ -59,7 +59,7 @@ public:
     bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override;
 
 
-    void scale(double delta) override;
+    void changeSizeByDelta(double delta) override;
     
     int getIntersection(const Vertex &P, const Vertex &direction, Vertex &pointOnObject, real &qVal) override;
 
diff --git a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp
index 91bb8f030e76fa6e083e7765feb18c7ccc517ee1..e5ab3c83291b8f4fd27bb3eee5f26d3fcdb69278 100644
--- a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp
+++ b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.cpp
@@ -185,7 +185,7 @@ bool intersectPlane(const Vertex &normal, const Vertex &pointOnPlane, const Vert
     return false;
 }
 
-void TriangularMesh::scale(double offset)
+void TriangularMesh::changeSizeByDelta(double offset)
 {
     std::vector<Triangle> triangles = this->triangleVec;
 
diff --git a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
index 7c050dd70b3908f3e4b021872887c74833594a26..5083e2adf9a91fcf9f8cfdb6da83d38a9eb19a9d 100644
--- a/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
+++ b/src/gpu/GridGenerator/geometries/TriangularMesh/TriangularMesh.h
@@ -97,7 +97,7 @@ public:
     double getX3Centroid() override { throw "Not implemented in TriangularMesh"; }
     double getX3Minimum() override { return minmax.minZ; }
     double getX3Maximum() override { return minmax.maxZ; }
-    void scale(double delta) override;
+    void changeSizeByDelta(double delta) override;
     bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset,
         const double& maxOffset) override {
         return false;
diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp
index 102fb258bcc7c5d46e88b3a33c11488b728fc267..439585ff246f82a7e820f514ecd5ed609f441797 100644
--- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp
+++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.cpp
@@ -111,10 +111,10 @@ bool VerticalCylinder::isPointInObject(const double& x1, const double& x2, const
 }
 
 
-void VerticalCylinder::scale(double delta)
+void VerticalCylinder::changeSizeByDelta(double delta)
 {
     this->radius += delta;
-    this->height += delta;
+    this->height += 2 * delta;
 }
 
 double VerticalCylinder::getRadius() const
diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h
index 8e4fae42ba4b18be725f8b7abe06b0fbffc417f7..3ffcba063e78b45f7965f5e7fe3909c7437b27ab 100644
--- a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h
+++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinder.h
@@ -40,6 +40,7 @@ class GRIDGENERATOR_EXPORT VerticalCylinder : public Object
 {
 public:
     VerticalCylinder(const double& centerX, const double& centerY, const double& centerZ, const double& radius, const double& height);
+    // the axis is in the z-direction
 
     static SPtr<VerticalCylinder> makeShared(double centerX, double centerY, double centerZ, double radius, double height);
 
@@ -61,8 +62,8 @@ public:
     bool isPointInObject(const double& x1, const double& x2, const double& x3, const double& minOffset, const double& maxOffset) override;
 
 
-    void scale(double delta) override;
-   
+    void changeSizeByDelta(double delta) override;
+
 protected:
     double centerX;
     double centerY;
diff --git a/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7bca5db9988000ecb925667a70e0615fadff5376
--- /dev/null
+++ b/src/gpu/GridGenerator/geometries/VerticalCylinder/VerticalCylinderTest.cpp
@@ -0,0 +1,57 @@
+#include <gmock/gmock.h>
+
+#include "VerticalCylinder.h"
+
+class VerticalCylinderTest : public testing::Test
+{
+protected:
+    std::array<double, 3> center = { 0.1, 0.2, 0.3 };
+    double radius = 2.0;
+    double height = 8.0;
+    VerticalCylinder cylinder = VerticalCylinder(center[0], center[1], center[2], radius, height);
+};
+
+TEST_F(VerticalCylinderTest, getCentroid)
+{
+    EXPECT_THAT(cylinder.getX1Centroid(), testing::Eq(center[0]));
+    EXPECT_THAT(cylinder.getX2Centroid(), testing::Eq(center[1]));
+    EXPECT_THAT(cylinder.getX3Centroid(), testing::Eq(center[2]));
+}
+
+TEST_F(VerticalCylinderTest, getMinimum)
+{
+    EXPECT_THAT(cylinder.getX1Minimum(), testing::Eq(-radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Minimum(), testing::Eq(-radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Minimum(), testing::Eq(-0.5 * height + center[2]));
+}
+
+TEST_F(VerticalCylinderTest, getMaximum)
+{
+    EXPECT_THAT(cylinder.getX1Maximum(), testing::Eq(radius + center[0]));
+    EXPECT_THAT(cylinder.getX2Maximum(), testing::Eq(radius + center[1]));
+    EXPECT_THAT(cylinder.getX3Maximum(), testing::Eq(0.5 * height + center[2]));
+}
+
+TEST_F(VerticalCylinderTest, isPointInObject)
+{
+    double epsilon = 0.0001;
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2], 0.0, 0.0));
+
+    // x
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] - radius + epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] - radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0] + radius - epsilon, center[1], center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0] + radius + epsilon, center[1], center[2], 0.0, 0.0));
+
+    // y
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] - radius + epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] - radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1] + radius - epsilon, center[2], 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1] + radius + epsilon, center[2], 0.0, 0.0));
+
+    // z
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height + epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] - 0.5 * height - epsilon, 0.0, 0.0));
+    EXPECT_TRUE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height - epsilon, 0.0, 0.0));
+    EXPECT_FALSE(cylinder.isPointInObject(center[0], center[1], center[2] + 0.5 * height + epsilon, 0.0, 0.0));
+}
\ No newline at end of file
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index 78b879ea84e88e4382dfae36943bfda2696a8fb3..e087ef11f54bb20b3813bfbf9044bf4e0a7b3624 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -86,7 +86,7 @@ void MultipleGridBuilder::addGeometry(SPtr<Object> solidObject, uint level)
 {
     this->solidObject = solidObject;
     auto gridShape = solidObject->clone();
-    gridShape->scale(4.0);
+    gridShape->changeSizeByDelta(4.0);
 
     this->addGrid(gridShape, level);
 }
@@ -169,7 +169,7 @@ void MultipleGridBuilder::addIntermediateGridsToList(uint levelDifference, uint
         {
             const real scalingFactor = nodesBetweenGrids * spacings[i] * calculateDelta(levelFine);
             SPtr<Object> gridShapeClone = gridShape->clone();
-            gridShapeClone->scale(scalingFactor);
+            gridShapeClone->changeSizeByDelta(scalingFactor);
 
             const auto grid = makeGrid(gridShapeClone, level++, 0);
             grids.push_back(grid);
@@ -267,8 +267,12 @@ SPtr<Grid> MultipleGridBuilder::makeRotatingGrid(SPtr<VerticalCylinder> cylinder
                                                               staggeredCoordinates[4],
                                                               staggeredCoordinates[5], delta, level);
 
-    cylinder = std::make_shared<VerticalCylinder>(cylinder->getX1Centroid(), cylinder->getX2Centroid(), cylinder->getX3Centroid(), cylinder->getRadius()+5*delta, cylinder->getHeight()+6*delta);
-    VF_LOG_WARNING("RotGr: LargerCylinder Size x : {}, {} \n z: {}, {}", cylinder->getX1Minimum(), cylinder->getX1Maximum(), cylinder->getX3Minimum(), cylinder->getX3Maximum());
+    // #TODO: change next line to use staggering
+    cylinder = std::make_shared<VerticalCylinder>(cylinder->getX1Centroid(), cylinder->getX2Centroid(),
+                                                  cylinder->getX3Centroid(), cylinder->getRadius() + 6.0 * delta,
+                                                  cylinder->getHeight() + 6.0 * delta);
+    VF_LOG_WARNING("RotGr: LargerCylinder Size x : {}, {} \n z: {}, {}", cylinder->getX1Minimum(), cylinder->getX1Maximum(),
+                   cylinder->getX3Minimum(), cylinder->getX3Maximum());
 
     SPtr<Grid> newGrid = this->makeGrid(cylinder, staggeredCoordinates[0],
                                                   staggeredCoordinates[1],