diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index 43489caa3132f30c76ed64d0dce089f146147ed5..d8166c0374ec9b170b13120000ba757072e0bd16 100644
--- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -10,6 +10,7 @@
 #include "Parameter/CudaStreamManager.h"
 #include "IndexRearrangementForStreams.h"
 #include "InterpolationCellGrouper.h"
+#include "GridGenerator/grid/Grid.h"
 
 #include <iostream>
 #include <algorithm>
diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
index 97f712aeb97bc901b271eeddaafda499457fca3e..5bf066a7350b59ebda8a822d42fb936169fb5a53 100644
--- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp
@@ -236,11 +236,9 @@ std::vector<std::string> FileWriter::writeUnstructuredGridLT(std::shared_ptr<Par
             nodeData[i].resize(sizeOfNodes);
 
         //////////////////////////////////////////////////////////////////////////
-        for (unsigned int pos = startPosition; pos < endPosition; pos++)
-        {
-                const LBMSimulationParameter* parH = para->getParHConst(level).get();
-            if (parH->typeOfGridNode[pos] == GEO_FLUID)
-            {
+        for (unsigned int pos = startPosition; pos < endPosition; pos++) {
+            const LBMSimulationParameter* parH = para->getParHConst(level).get();
+            if (parH->typeOfGridNode[pos] == GEO_FLUID) {
                 //////////////////////////////////////////////////////////////////////////
                 double x1 = parH->coordinateX[pos];
                 double x2 = parH->coordinateY[pos];
@@ -284,7 +282,7 @@ std::vector<std::string> FileWriter::writeUnstructuredGridLT(std::shared_ptr<Par
 
                 WriterUtilities::getIndicesOfAllNodesInOct(indicesOfOct, pos, para->getParHConst(level).get());
 
-                if (WriterUtilities::isPeriodicCell(para.get(), level, indicesOfOct[0], indicesOfOct[6])) {
+                if (WriterUtilities::isPeriodicCell(parH, indicesOfOct[0], indicesOfOct[6])) {
                     continue;
                 }
 
@@ -392,7 +390,7 @@ std::vector<std::string> FileWriter::writeUnstructuredGridMedianLT(std::shared_p
                 dn7 = number7 - startPosition;
                 dn8 = number8 - startPosition;
                 //////////////////////////////////////////////////////////////////////////
-                if (WriterUtilities::isPeriodicCell(para.get(), level, number1, number7))
+                if (WriterUtilities::isPeriodicCell(para->getParHConst(level).get(), number1, number7))
                     continue;
                 //////////////////////////////////////////////////////////////////////////
                 if (neighborsFluid == true) cells.push_back(makeUbTuple(dn1, dn2, dn3, dn4, dn5, dn6, dn7, dn8));
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
index d6775589866843d45c306fbe00ccf20561b45967..033f37c17b68a17099804ca2cef104e376d695bf 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.cpp
@@ -13,14 +13,14 @@ uint WriterUtilities::calculateNumberOfParts(const Parameter* parameter, uint le
     return (uint)parameter->getParHConst(level)->numberOfNodes / parameter->getLimitOfNodesForVTK() + 1;
 }
 
-bool WriterUtilities::isPeriodicCell(const Parameter* para, int level, unsigned int baseNodeOfCell,
+bool WriterUtilities::isPeriodicCell(const LBMSimulationParameter* parH, unsigned int baseNodeOfCell,
                                      unsigned int otherNodeInCell)
 {
     real distance = sqrt(
-        pow(para->getParHConst(level)->coordinateX[otherNodeInCell] - para->getParHConst(level)->coordinateX[baseNodeOfCell], 2.) +
-        pow(para->getParHConst(level)->coordinateY[otherNodeInCell] - para->getParHConst(level)->coordinateY[baseNodeOfCell], 2.) +
-        pow(para->getParHConst(level)->coordinateZ[otherNodeInCell] - para->getParHConst(level)->coordinateZ[baseNodeOfCell], 2.));
-    return distance > 1.01 * sqrt(3 * pow(para->getParHConst(level)->gridSpacing, 2.));
+        pow(parH->coordinateX[otherNodeInCell] - parH->coordinateX[baseNodeOfCell], 2.) +
+        pow(parH->coordinateY[otherNodeInCell] - parH->coordinateY[baseNodeOfCell], 2.) +
+        pow(parH->coordinateZ[otherNodeInCell] - parH->coordinateZ[baseNodeOfCell], 2.));
+    return distance > 1.01 * sqrt(3 * pow(parH->gridSpacing, 2.));
 }
 
 uint WriterUtilities::calculateNumberOfNodesInPart(const Parameter* para, uint level, uint part)
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
index 35705e4c9414c7c0f4fb43e383364de1329b8d0f..eaa26dd549ef9190cf7e58197b2425732610078b 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilities.h
@@ -6,14 +6,15 @@
 #include <basics/DataTypes.h>
 
 class Parameter;
-class LBMSimulationParameter;
+struct LBMSimulationParameter;
 
 class WriterUtilities
 {
 public:
     static uint calculateNumberOfParts(const Parameter* para, uint level);
     static uint calculateNumberOfNodesInPart(const Parameter* para, uint level, uint part);
-    static bool isPeriodicCell(const Parameter* para, int level, unsigned int baseNodeOfCell, unsigned int otherNodeInCell);
+    static bool isPeriodicCell(const LBMSimulationParameter* parH, unsigned int baseNodeOfCell,
+                               unsigned int otherNodeInCell);
     static void getIndicesOfAllNodesInOct(std::array<uint, 8>& nodeIndices, uint baseNodeOfOct,
                                           const LBMSimulationParameter* parH);
     static void calculateRelativeNodeIndexInPart(std::array<uint, 8>& relativePositionInPart,
diff --git a/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp b/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
index 7702c5f33fdb315e2ee332629cb775b800297302..bf39c44decb34699d643feeab46f919522fd48f6 100644
--- a/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
+++ b/src/gpu/VirtualFluids_GPU/Output/WriterUtilitiesTest.cpp
@@ -40,8 +40,7 @@ TEST(WriterUtilitiesTest, calculateNumberOfNodesInPart)
 class WriterUtilitiesPeriodicCellTest : public testing::Test
 {
 protected:
-    SPtr<Parameter> parameter;
-    SPtr<LBMSimulationParameter> parH;
+    std::unique_ptr<LBMSimulationParameter> parH = std::make_unique<LBMSimulationParameter>();
     const uint level = 0;
     const uint baseNodeIndex = 0;
     const uint otherNodeIndex = 1;
@@ -51,8 +50,6 @@ protected:
     {
         // create a domain with only three layers of nodes
         // nodes are at the coordinates 0.0, 1.0 and 2.0
-        parameter = testingVF::createParameterForLevel(level);
-        parH = parameter->getParH(level);
         parH->gridSpacing = 1.0;
 
         parH->coordinateX = new real[2];
@@ -77,52 +74,52 @@ protected:
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsNotPeriodic)
 {
-    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_FALSE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInX)
 {
     parH->coordinateX[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInY)
 {
     parH->coordinateY[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInZ)
 {
     parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXY)
 {
     parH->coordinateX[1] = 2.0;
     parH->coordinateY[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXZ)
 {
     parH->coordinateX[1] = 2.0;
     parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInYZ)
 {
     parH->coordinateY[1] = 2.0;
     parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXYZ)
@@ -130,13 +127,12 @@ TEST_F(WriterUtilitiesPeriodicCellTest, cellIsPeriodicInXYZ)
     parH->coordinateX[1] = 2.0;
     parH->coordinateY[1] = 2.0;
     parH->coordinateZ[1] = 2.0;
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, baseNodeIndex, otherNodeIndex));
-    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parameter.get(), level, otherNodeIndex, baseNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), baseNodeIndex, otherNodeIndex));
+    EXPECT_TRUE(WriterUtilities::isPeriodicCell(parH.get(), otherNodeIndex, baseNodeIndex));
 }
 
 class WriterUtilitiesNeighborOctTest : public testing::Test
 {
-
     static void setUpNeighborsNeighborsForOct(LBMSimulationParameter* parH, const std::array<uint, 8>& nodeIndices)
     {
         // node indices: MMM, PMM, PPM, MPM,