diff --git a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
index 947ce516e860e216806a6f288d134b1efd8b91a6..26d4045fe4b14cf9ffc5dea16815d70c716de000 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
@@ -1,6 +1,5 @@
 #include "ConfigFileReaderNT.h"
 
-// #include "Core/Input/Input.h"
 #include <basics/config/ConfigurationFile.h>
 #include "Core/StringUtilities/StringUtil.h"
 
@@ -11,63 +10,11 @@
 #define VAL(str) #str
 #define TOSTRING(str) VAL(str)
 
-std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance(const std::string aFilePath)
-{
-    return std::shared_ptr<ConfigFileReader>(new ConfigFileReader(aFilePath));
-}
+using ConfigFilePtr = std::shared_ptr<vf::basics::ConfigurationFile>;
+using ConfigDataPtr = std::shared_ptr<ConfigDataStruct>;
 
-ConfigFileReader::ConfigFileReader(const std::string aFilePath) : myFilePath(aFilePath)
-{
-    // If PATH_NUMERICAL_TESTS is not defined, the grid definitions for the tests needs to be placed in the project root
-    // directories.
-#ifdef PATH_NUMERICAL_TESTS
-    pathNumericalTests = TOSTRING(PATH_NUMERICAL_TESTS) + std::string("/");
-#else
-    pathNumericalTests = TOSTRING(SOURCE_ROOT) + std::string("/");
-#endif
-    std::cout << pathNumericalTests << "\n";
-}
 
-void ConfigFileReader::readConfigFile()
-{
-    configData           = std::shared_ptr<ConfigDataStruct>(new ConfigDataStruct);
-
-    auto input = std::make_shared<vf::basics::ConfigurationFile>();
-    input->load(myFilePath);
-
-    if (!checkConfigFile(input))
-        exit(1);
-
-    configData->viscosity            = StringUtil::toDoubleVector(input->getValue<std::string>("Viscosity"));
-    configData->kernelsToTest        = readKernelList(input);
-    configData->writeAnalyticalToVTK = StringUtil::toBool(input->getValue<std::string>("WriteAnalyResultsToVTK"));
-    configData->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
-
-    configData->logFilePath         = pathNumericalTests + input->getValue<std::string>("FolderLogFile");
-    configData->numberOfSimulations = calcNumberOfSimulations(input);
-
-    std::shared_ptr<BasicSimulationParameterStruct> basicSimPara = makeBasicSimulationParameter(input);
-
-    configData->taylorGreenVortexUxParameter       = makeTaylorGreenVortexUxParameter(input, basicSimPara);
-    configData->taylorGreenVortexUxGridInformation = makeGridInformation(input, "TaylorGreenVortexUx");
-
-    configData->taylorGreenVortexUzParameter       = makeTaylorGreenVortexUzParameter(input, basicSimPara);
-    configData->taylorGreenVortexUzGridInformation = makeGridInformation(input, "TaylorGreenVortexUz");
-
-    configData->shearWaveParameter       = makeShearWaveParameter(input, basicSimPara);
-    configData->shearWaveGridInformation = makeGridInformation(input, "ShearWave");
-
-    configData->phiTestParameter                  = makePhiTestParameter(input);
-    configData->nyTestParameter                   = makeNyTestParameter(input);
-    configData->l2NormTestParameter               = makeL2NormTestParameter(input);
-    configData->l2NormTestBetweenKernelsParameter = makeL2NormTestBetweenKernelsParameter(input);
-
-    configData->vectorWriterInfo = makeVectorWriterInformationStruct(input);
-
-    configData->logFilePara = makeLogFilePara(input);
-}
-
-std::ifstream ConfigFileReader::openConfigFile(const std::string aFilePath)
+std::ifstream openConfigFile(const std::string aFilePath)
 {
     std::ifstream stream;
     stream.open(aFilePath.c_str(), std::ios::in);
@@ -77,9 +24,7 @@ std::ifstream ConfigFileReader::openConfigFile(const std::string aFilePath)
     return stream;
 }
 
-std::shared_ptr<ConfigDataStruct> ConfigFileReader::getConfigData() { return configData; }
-
-bool ConfigFileReader::checkConfigFile(std::shared_ptr<vf::basics::ConfigurationFile> input)
+bool checkConfigFile(ConfigFilePtr input)
 {
     std::vector<double> u0TGVux               = StringUtil::toDoubleVector(input->getValue<std::string>("ux_TGV_Ux"));
     std::vector<double> amplitudeTGVux        = StringUtil::toDoubleVector(input->getValue<std::string>("Amplitude_TGV_Ux"));
@@ -112,7 +57,7 @@ bool ConfigFileReader::checkConfigFile(std::shared_ptr<vf::basics::Configuration
 }
 
 std::shared_ptr<BasicSimulationParameterStruct>
-ConfigFileReader::makeBasicSimulationParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
+makeBasicSimulationParameter(ConfigFilePtr input)
 {
     std::shared_ptr<BasicSimulationParameterStruct> basicSimPara =
         std::shared_ptr<BasicSimulationParameterStruct>(new BasicSimulationParameterStruct);
@@ -123,8 +68,9 @@ ConfigFileReader::makeBasicSimulationParameter(std::shared_ptr<vf::basics::Confi
 }
 
 std::vector<std::shared_ptr<TaylorGreenVortexUxParameterStruct>>
-ConfigFileReader::makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                                   std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
+makeTaylorGreenVortexUxParameter(const std::string pathNumericalTests, 
+                                 ConfigFilePtr input,
+                                 std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
     std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_TGV_Ux"));
     std::vector<double> amplitude        = StringUtil::toDoubleVector(input->getValue<std::string>("Amplitude_TGV_Ux"));
@@ -151,8 +97,9 @@ ConfigFileReader::makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::C
 }
 
 std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>>
-ConfigFileReader::makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                                   std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
+makeTaylorGreenVortexUzParameter(const std::string pathNumericalTests,
+                                 ConfigFilePtr input,
+                                 std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
     std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_TGV_Uz"));
     std::vector<double> amplitude        = StringUtil::toDoubleVector(input->getValue<std::string>("Amplitude_TGV_Uz"));
@@ -177,8 +124,9 @@ ConfigFileReader::makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::C
     return parameter;
 }
 std::vector<std::shared_ptr<ShearWaveParameterStruct>>
-ConfigFileReader::makeShearWaveParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                         std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
+makeShearWaveParameter(const std::string pathNumericalTests,
+                       ConfigFilePtr input,
+                       std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
     std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_SW"));
     std::vector<double> uz               = StringUtil::toDoubleVector(input->getValue<std::string>("v0_SW"));
@@ -203,7 +151,7 @@ ConfigFileReader::makeShearWaveParameter(std::shared_ptr<vf::basics::Configurati
     return parameter;
 }
 
-std::shared_ptr<NyTestParameterStruct> ConfigFileReader::makeNyTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
+std::shared_ptr<NyTestParameterStruct> makeNyTestParameter(ConfigFilePtr input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
@@ -220,7 +168,7 @@ std::shared_ptr<NyTestParameterStruct> ConfigFileReader::makeNyTestParameter(std
     return testParameter;
 }
 
-std::shared_ptr<PhiTestParameterStruct> ConfigFileReader::makePhiTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
+std::shared_ptr<PhiTestParameterStruct> makePhiTestParameter(ConfigFilePtr input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
@@ -238,7 +186,7 @@ std::shared_ptr<PhiTestParameterStruct> ConfigFileReader::makePhiTestParameter(s
 }
 
 std::shared_ptr<L2NormTestParameterStruct>
-ConfigFileReader::makeL2NormTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
+makeL2NormTestParameter(ConfigFilePtr input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
@@ -256,8 +204,42 @@ ConfigFileReader::makeL2NormTestParameter(std::shared_ptr<vf::basics::Configurat
     return testParameter;
 }
 
+std::vector<std::string> readKernelList(ConfigFilePtr input)
+{
+    if (StringUtil::toBool(input->getValue<std::string>("L2NormBetweenKernelsTest"))) {
+        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue<std::string>("KernelsToTest"));
+        std::string beginKernel             = input->getValue<std::string>("BasicKernel_L2NormBetweenKernels");
+        bool basicKernelInKernelList        = false;
+        for (int i = 0; i < kernelList.size(); i++) {
+            if (kernelList.at(i) == beginKernel)
+                basicKernelInKernelList = true;
+        }
+        if (!basicKernelInKernelList)
+            kernelList.push_back(beginKernel);
+
+        std::vector<std::string> kernelNames = kernelList;
+
+        while (kernelNames.at(0) != beginKernel) {
+            kernelNames.push_back(kernelNames.at(0));
+            std::vector<std::string>::iterator it = kernelNames.begin();
+            kernelNames.erase(it);
+        }
+        std::vector<std::string> kernels;
+        for (int i = 0; i < kernelNames.size(); i++)
+            kernels.push_back(kernelNames.at(i));
+        return kernels;
+    } else {
+        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue<std::string>("KernelsToTest"));
+        std::vector<std::string> kernels;
+        for (int i = 0; i < kernelList.size(); i++)
+            kernels.push_back(kernelList.at(i));
+
+        return kernels;
+    }
+}
+
 std::shared_ptr<L2NormTestBetweenKernelsParameterStruct>
-ConfigFileReader::makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
+makeL2NormTestBetweenKernelsParameter(ConfigFilePtr input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
@@ -289,7 +271,7 @@ ConfigFileReader::makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basi
 }
 
 std::vector<std::shared_ptr<GridInformationStruct>>
-ConfigFileReader::makeGridInformation(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName)
+makeGridInformation(const std::string pathNumericalTests, ConfigFilePtr input, std::string simName)
 {
     int number = 32;
     std::vector<std::string> valueNames;
@@ -333,8 +315,19 @@ ConfigFileReader::makeGridInformation(std::shared_ptr<vf::basics::ConfigurationF
     return gridInformation;
 }
 
+unsigned int calcStartStepForToVectorWriter(ConfigFilePtr input)
+{
+    std::vector<unsigned int> startStepsTests;
+    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("BasicTimeStep_L2")));
+    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Ny")));
+    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Phi")));
+    std::sort(startStepsTests.begin(), startStepsTests.end());
+
+    return startStepsTests.at(0);
+}
+
 std::shared_ptr<VectorWriterInformationStruct>
-ConfigFileReader::makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::ConfigurationFile> input)
+makeVectorWriterInformationStruct(ConfigFilePtr input)
 {
     std::shared_ptr<VectorWriterInformationStruct> vectorWriter =
         std::shared_ptr<VectorWriterInformationStruct>(new VectorWriterInformationStruct);
@@ -345,7 +338,7 @@ ConfigFileReader::makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::
     return vectorWriter;
 }
 
-std::shared_ptr<LogFileParameterStruct> ConfigFileReader::makeLogFilePara(std::shared_ptr<vf::basics::ConfigurationFile> input)
+std::shared_ptr<LogFileParameterStruct> makeLogFilePara(ConfigFilePtr input)
 {
     std::shared_ptr<LogFileParameterStruct> logFilePara =
         std::shared_ptr<LogFileParameterStruct>(new LogFileParameterStruct);
@@ -356,52 +349,25 @@ std::shared_ptr<LogFileParameterStruct> ConfigFileReader::makeLogFilePara(std::s
     return logFilePara;
 }
 
-std::vector<std::string> ConfigFileReader::readKernelList(std::shared_ptr<vf::basics::ConfigurationFile> input)
+int calcNumberOfSimulationGroup(ConfigFilePtr input, std::string simName)
 {
-    if (StringUtil::toBool(input->getValue<std::string>("L2NormBetweenKernelsTest"))) {
-        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue<std::string>("KernelsToTest"));
-        std::string beginKernel             = input->getValue<std::string>("BasicKernel_L2NormBetweenKernels");
-        bool basicKernelInKernelList        = false;
-        for (int i = 0; i < kernelList.size(); i++) {
-            if (kernelList.at(i) == beginKernel)
-                basicKernelInKernelList = true;
-        }
-        if (!basicKernelInKernelList)
-            kernelList.push_back(beginKernel);
-
-        std::vector<std::string> kernelNames = kernelList;
-
-        while (kernelNames.at(0) != beginKernel) {
-            kernelNames.push_back(kernelNames.at(0));
-            std::vector<std::string>::iterator it = kernelNames.begin();
-            kernelNames.erase(it);
-        }
-        std::vector<std::string> kernels;
-        for (int i = 0; i < kernelNames.size(); i++)
-            kernels.push_back(kernelNames.at(i));
-        return kernels;
-    } else {
-        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue<std::string>("KernelsToTest"));
-        std::vector<std::string> kernels;
-        for (int i = 0; i < kernelList.size(); i++)
-            kernels.push_back(kernelList.at(i));
-
-        return kernels;
+    int counter = 0;
+    int number  = 32;
+    std::vector<std::string> valueNames;
+    for (int i = 1; i <= 5; i++) {
+        std::string aValueName = simName;
+        aValueName += std::to_string(number);
+        valueNames.push_back(aValueName);
+        number *= 2;
     }
+    for (int i = 0; i < valueNames.size(); i++) {
+        if (StringUtil::toBool(input->getValue<std::string>(valueNames.at(i))))
+            counter++;
+    }
+    return counter;
 }
 
-unsigned int ConfigFileReader::calcStartStepForToVectorWriter(std::shared_ptr<vf::basics::ConfigurationFile> input)
-{
-    std::vector<unsigned int> startStepsTests;
-    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("BasicTimeStep_L2")));
-    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Ny")));
-    startStepsTests.push_back(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Phi")));
-    std::sort(startStepsTests.begin(), startStepsTests.end());
-
-    return startStepsTests.at(0);
-}
-
-int ConfigFileReader::calcNumberOfSimulations(std::shared_ptr<vf::basics::ConfigurationFile> input)
+int calcNumberOfSimulations(ConfigFilePtr input, ConfigDataPtr configData)
 {
     int counter = 0;
 
@@ -425,20 +391,51 @@ int ConfigFileReader::calcNumberOfSimulations(std::shared_ptr<vf::basics::Config
     return counter;
 }
 
-int ConfigFileReader::calcNumberOfSimulationGroup(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName)
+ConfigDataPtr vf::gpu::tests::readConfigFile(const std::string aFilePath)
 {
-    int counter = 0;
-    int number  = 32;
-    std::vector<std::string> valueNames;
-    for (int i = 1; i <= 5; i++) {
-        std::string aValueName = simName;
-        aValueName += std::to_string(number);
-        valueNames.push_back(aValueName);
-        number *= 2;
-    }
-    for (int i = 0; i < valueNames.size(); i++) {
-        if (StringUtil::toBool(input->getValue<std::string>(valueNames.at(i))))
-            counter++;
-    }
-    return counter;
+    // If PATH_NUMERICAL_TESTS is not defined, the grid definitions for the tests needs to be placed in the project root
+    // directories.
+#ifdef PATH_NUMERICAL_TESTS
+    auto pathNumericalTests = TOSTRING(PATH_NUMERICAL_TESTS) + std::string("/");
+#else
+    auto pathNumericalTests = TOSTRING(SOURCE_ROOT) + std::string("/");
+#endif
+    std::cout << pathNumericalTests << "\n";
+
+    auto configData = std::make_shared<ConfigDataStruct>();
+    auto input      = std::make_shared<vf::basics::ConfigurationFile>();
+    input->load(aFilePath);
+
+    if (!checkConfigFile(input))
+        exit(1);
+
+    configData->viscosity            = StringUtil::toDoubleVector(input->getValue<std::string>("Viscosity"));
+    configData->kernelsToTest        = readKernelList(input);
+    configData->writeAnalyticalToVTK = StringUtil::toBool(input->getValue<std::string>("WriteAnalyResultsToVTK"));
+    configData->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
+
+    configData->logFilePath         = pathNumericalTests + input->getValue<std::string>("FolderLogFile");
+    configData->numberOfSimulations = calcNumberOfSimulations(input, configData);
+
+    auto basicSimPara = makeBasicSimulationParameter(input);
+
+    configData->taylorGreenVortexUxParameter       = makeTaylorGreenVortexUxParameter(pathNumericalTests, input, basicSimPara);
+    configData->taylorGreenVortexUxGridInformation = makeGridInformation(pathNumericalTests, input, "TaylorGreenVortexUx");
+
+    configData->taylorGreenVortexUzParameter       = makeTaylorGreenVortexUzParameter(pathNumericalTests, input, basicSimPara);
+    configData->taylorGreenVortexUzGridInformation = makeGridInformation(pathNumericalTests, input, "TaylorGreenVortexUz");
+
+    configData->shearWaveParameter       = makeShearWaveParameter(pathNumericalTests, input, basicSimPara);
+    configData->shearWaveGridInformation = makeGridInformation(pathNumericalTests, input, "ShearWave");
+
+    configData->phiTestParameter                  = makePhiTestParameter(input);
+    configData->nyTestParameter                   = makeNyTestParameter(input);
+    configData->l2NormTestParameter               = makeL2NormTestParameter(input);
+    configData->l2NormTestBetweenKernelsParameter = makeL2NormTestBetweenKernelsParameter(input);
+
+    configData->vectorWriterInfo = makeVectorWriterInformationStruct(input);
+
+    configData->logFilePara = makeLogFilePara(input);
+
+    return configData;
 }
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
index d9446388fdbc2721f95120212ddd9b4dfbf52b1b..662d0e7039cac8837dfbd0cd4e2fcd7a4462b3f1 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
+++ b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
@@ -12,53 +12,46 @@ namespace vf::basics
 class ConfigurationFile;
 }
 
-class ConfigFileReader
+namespace vf::gpu::tests
 {
-public:
-    static std::shared_ptr<ConfigFileReader> getNewInstance(const std::string aFilePath);
-    std::shared_ptr<ConfigDataStruct> getConfigData();
-    void readConfigFile();
-
-private:
-    ConfigFileReader(){};
-    ConfigFileReader(const std::string aFilePath);
-
-    std::ifstream openConfigFile(const std::string aFilePath);
-    bool checkConfigFile(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::vector<std::string> readKernelList(std::shared_ptr<vf::basics::ConfigurationFile> input);
-
-    int calcNumberOfSimulations(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    int calcNumberOfSimulationGroup(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName);
-    unsigned int calcStartStepForToVectorWriter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-
-    std::vector<std::shared_ptr<TaylorGreenVortexUxParameterStruct>>
-    makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                     std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
-    std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>>
-    makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                     std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
-    std::vector<std::shared_ptr<ShearWaveParameterStruct>>
-    makeShearWaveParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                           std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
-
-    std::shared_ptr<NyTestParameterStruct> makeNyTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::shared_ptr<PhiTestParameterStruct> makePhiTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::shared_ptr<L2NormTestParameterStruct> makeL2NormTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::shared_ptr<L2NormTestBetweenKernelsParameterStruct>
-    makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-
-    std::shared_ptr<BasicSimulationParameterStruct> makeBasicSimulationParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::vector<std::shared_ptr<GridInformationStruct>> makeGridInformation(std::shared_ptr<vf::basics::ConfigurationFile> input,
-                                                                            std::string simName);
-
-    std::shared_ptr<VectorWriterInformationStruct>
-    makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::ConfigurationFile> input);
-    std::shared_ptr<LogFileParameterStruct> makeLogFilePara(std::shared_ptr<vf::basics::ConfigurationFile> input);
-
-    std::string pathNumericalTests;
+    std::shared_ptr<ConfigDataStruct> readConfigFile(const std::string aFilePath);
+}
 
-    const std::string myFilePath;
-    std::shared_ptr<ConfigDataStruct> configData;
-    //std::shared_ptr<KernelMapper> myKernelMapper;
-};
+// private:
+//     std::ifstream openConfigFile(const std::string aFilePath);
+//     bool checkConfigFile(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::vector<std::string> readKernelList(std::shared_ptr<vf::basics::ConfigurationFile> input);
+
+//     int calcNumberOfSimulations(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     int calcNumberOfSimulationGroup(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName);
+//     unsigned int calcStartStepForToVectorWriter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+
+//     std::vector<std::shared_ptr<TaylorGreenVortexUxParameterStruct>>
+//     makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
+//                                      std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
+//     std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>>
+//     makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
+//                                      std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
+//     std::vector<std::shared_ptr<ShearWaveParameterStruct>>
+//     makeShearWaveParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
+//                            std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
+
+//     std::shared_ptr<NyTestParameterStruct> makeNyTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::shared_ptr<PhiTestParameterStruct> makePhiTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::shared_ptr<L2NormTestParameterStruct> makeL2NormTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::shared_ptr<L2NormTestBetweenKernelsParameterStruct>
+//     makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+
+//     std::shared_ptr<BasicSimulationParameterStruct> makeBasicSimulationParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::vector<std::shared_ptr<GridInformationStruct>> makeGridInformation(std::shared_ptr<vf::basics::ConfigurationFile> input,
+//                                                                             std::string simName);
+
+//     std::shared_ptr<VectorWriterInformationStruct>
+//     makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::ConfigurationFile> input);
+//     std::shared_ptr<LogFileParameterStruct> makeLogFilePara(std::shared_ptr<vf::basics::ConfigurationFile> input);
+
+//     std::string pathNumericalTests;
+
+//     const std::string myFilePath;
+//     std::shared_ptr<ConfigDataStruct> configData;
 #endif
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.cpp
similarity index 51%
rename from apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp
rename to apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.cpp
index 53bb1d75007a47572742a69907012e7f0d71efbd..0754824f18c65363f7dba4d4c628a8e7cffdc137 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.cpp
@@ -1,4 +1,4 @@
-#include "VirtualFluidSimulationImp.h"
+#include "VirtualFluidSimulation.h"
 
 #include "Utilities/NumericalTestSuite/NumericalTestSuite.h"
 #include "Utilities/Time/TimeTracking.h"
@@ -10,7 +10,7 @@
 
 #include <sstream>
 
-void VirtualFluidSimulationImp::run()
+void VirtualFluidSimulation::run()
 {
 	numericalTestSuite->makeSimulationHeadOutput();
 	BoundaryConditionFactory bc_factory;
@@ -24,47 +24,42 @@ void VirtualFluidSimulationImp::run()
 	numericalTestSuite->startPostProcessing();
 }
 
-void VirtualFluidSimulationImp::setParameter(std::shared_ptr<Parameter> para)
+void VirtualFluidSimulation::setParameter(std::shared_ptr<Parameter> para)
 {
 	this->para = para;
 }
 
-void VirtualFluidSimulationImp::setCudaMemoryManager(std::shared_ptr<CudaMemoryManager> cudaManager)
+void VirtualFluidSimulation::setCudaMemoryManager(std::shared_ptr<CudaMemoryManager> cudaManager)
 {
 	this->cudaManager = cudaManager;
 }
 
-void VirtualFluidSimulationImp::setGridProvider(std::shared_ptr<GridProvider> grid)
+void VirtualFluidSimulation::setGridProvider(std::shared_ptr<GridProvider> grid)
 {
 	this->grid = grid;
 }
 
-std::shared_ptr<VirtualFluidSimulationImp> VirtualFluidSimulationImp::getNewInstance()
-{
-	return std::shared_ptr<VirtualFluidSimulationImp>(new VirtualFluidSimulationImp());
-}
-
-void VirtualFluidSimulationImp::setDataWriter(std::shared_ptr<DataWriter> dataWriter)
+void VirtualFluidSimulation::setDataWriter(std::shared_ptr<DataWriter> dataWriter)
 {
 	this->dataWriter = dataWriter;
 }
 
-void VirtualFluidSimulationImp::setNumericalTestSuite(std::shared_ptr<NumericalTestSuite> numericalTestSuite)
+void VirtualFluidSimulation::setNumericalTestSuite(std::shared_ptr<NumericalTestSuite> numericalTestSuite)
 {
 	this->numericalTestSuite = numericalTestSuite;
 }
 
-void VirtualFluidSimulationImp::setTimeTracking(std::shared_ptr<TimeTracking> timeTracking)
+void VirtualFluidSimulation::setTimeTracking(std::shared_ptr<TimeTracking> timeTracking)
 {
 	this->timeTracking = timeTracking;
 }
 
-void VirtualFluidSimulationImp::setKernelFactory(std::shared_ptr<KernelFactory> kernelFactory)
+void VirtualFluidSimulation::setKernelFactory(std::shared_ptr<KernelFactory> kernelFactory)
 {
 	this->kernelFactory = kernelFactory;
 }
 
-void VirtualFluidSimulationImp::setPreProcessorFactory(std::shared_ptr<PreProcessorFactory> preProcessorFactory)
+void VirtualFluidSimulation::setPreProcessorFactory(std::shared_ptr<PreProcessorFactory> preProcessorFactory)
 {
 	this->preProcessorFactory = preProcessorFactory;
 }
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h
index 36e1eabd9af51a0e415da876faca8d38c691cbad..04253837f4bd3de43d67b279bd3adf1b08d02597 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h
@@ -1,13 +1,46 @@
-#ifndef VIRTUAL_FLUID_SIMULATION_H
-#define VIRTUAL_FLUID_SIMULATION_H
+#ifndef VIRTUAL_FLUID_SIMULATION_IMP_H
+#define VIRTUAL_FLUID_SIMULATION_IMP_H
 
-#include "VirtualFluids_GPU/LBM/LB.h"
+#include <memory>
+#include <string>
+
+class CudaMemoryManager;
+class InitialCondition;
+class DataWriter;
+class Parameter;
+class GridProvider;
+class KernelConfiguration;
+class TestSimulation;
+class TimeTracking;
+class NumericalTestSuite;
+class KernelFactory;
+class PreProcessorFactory;
 
 class VirtualFluidSimulation
 {
 public:
-	virtual void run() = 0;
+    void run();
+
+    void setParameter(std::shared_ptr<Parameter> para);
+    void setCudaMemoryManager(std::shared_ptr<CudaMemoryManager> cudaManager);
+    void setGridProvider(std::shared_ptr<GridProvider> grid);
+    void setDataWriter(std::shared_ptr<DataWriter> dataWriter);
+    void setNumericalTestSuite(std::shared_ptr<NumericalTestSuite> numericalTestSuite);
+    void setTimeTracking(std::shared_ptr<TimeTracking> timeTracking);
+
+    void setKernelFactory(std::shared_ptr<KernelFactory> kernelFactory);
+    void setPreProcessorFactory(std::shared_ptr<PreProcessorFactory> preProcessorFactory);
+
 private:
+    std::shared_ptr<Parameter> para;
+    std::shared_ptr<CudaMemoryManager> cudaManager;
+    std::shared_ptr<InitialCondition> initialCondition;
+    std::shared_ptr<GridProvider> grid;
+    std::shared_ptr<DataWriter> dataWriter;
+    std::shared_ptr<NumericalTestSuite> numericalTestSuite;
+    std::shared_ptr<TimeTracking> timeTracking;
 
+    std::shared_ptr<KernelFactory> kernelFactory;
+    std::shared_ptr<PreProcessorFactory> preProcessorFactory;
 };
 #endif
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.h b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.h
deleted file mode 100644
index 492459052e56c36345e5650415b2691b4c1b1ed8..0000000000000000000000000000000000000000
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef VIRTUAL_FLUID_SIMULATION_IMP_H
-#define VIRTUAL_FLUID_SIMULATION_IMP_H
-
-#include "VirtualFluidSimulation.h"
-
-#include <string>
-#include <memory>
-
-class CudaMemoryManager;
-class InitialCondition;
-class DataWriter;
-class Parameter;
-class GridProvider;
-class KernelConfiguration;
-class TestSimulation;
-class TimeTracking;
-class NumericalTestSuite;
-class KernelFactory;
-class PreProcessorFactory;
-
-class VirtualFluidSimulationImp : public VirtualFluidSimulation
-{
-public:
-	void run();
-
-	static std::shared_ptr<VirtualFluidSimulationImp> getNewInstance();
-
-	void setParameter(std::shared_ptr<Parameter> para);
-	void setCudaMemoryManager(std::shared_ptr<CudaMemoryManager> cudaManager);
-	void setGridProvider(std::shared_ptr<GridProvider> grid);
-	void setDataWriter(std::shared_ptr<DataWriter> dataWriter);
-	void setNumericalTestSuite(std::shared_ptr<NumericalTestSuite> numericalTestSuite);
-	void setTimeTracking(std::shared_ptr<TimeTracking> timeTracking);
-
-	void setKernelFactory(std::shared_ptr<KernelFactory> kernelFactory);
-	void setPreProcessorFactory(std::shared_ptr<PreProcessorFactory> preProcessorFactory);
-
-protected:
-	VirtualFluidSimulationImp() {};
-		
-private:
-	std::shared_ptr<Parameter> para;
-	std::shared_ptr<CudaMemoryManager> cudaManager;
-	std::shared_ptr<InitialCondition> initialCondition;
-	std::shared_ptr<GridProvider> grid;
-	std::shared_ptr<DataWriter> dataWriter;
-	std::shared_ptr<NumericalTestSuite> numericalTestSuite;
-	std::shared_ptr<TimeTracking> timeTracking;
-
-	std::shared_ptr<KernelFactory> kernelFactory;
-	std::shared_ptr<PreProcessorFactory> preProcessorFactory;
-};
-#endif
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1714a1125a256255f084d3464f16095392a540ab
--- /dev/null
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.cpp
@@ -0,0 +1,146 @@
+#include "VirtualFluidSimulationFactory.h"
+
+#include "Utilities/InitialCondition/InitialCondition.h"
+#include "Utilities/KernelConfiguration/KernelConfiguration.h"
+#include "Utilities/NumericalTestGridReader/NumericalTestGridReader.h"
+#include "Utilities/SimulationParameter/SimulationParameter.h"
+#include "Utilities/TestSimulation/TestSimulation.h"
+#include "Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h"
+
+#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
+#include "VirtualFluids_GPU/Parameter/Parameter.h"
+#include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
+
+std::shared_ptr<Parameter> makeParameter(std::shared_ptr<SimulationParameter> simPara)
+{
+    auto para = std::make_shared<Parameter>(1, 0);
+
+    para->setQuadricLimiters(0.01, 0.01, 0.01);
+
+    para->setMaxDev(simPara->getDevices().size());
+    para->setDevices(simPara->getDevices());
+
+    std::string _prefix = "cells";
+    std::string gridPath = simPara->getGridPath() + "/";
+    para->setFName(simPara->getFilePath() + "/" + _prefix);
+    para->setPrintFiles(true);
+
+    para->setD3Qxx(27);
+    para->setMaxLevel(simPara->getNumberOfGridLevels());
+
+    para->setTimestepEnd(simPara->getEndTime());
+    para->setTimestepOut(simPara->getTimeStepLength());
+    para->setTStartOut(1);
+
+    para->setViscosityLB(simPara->getViscosity());
+    para->setVelocityLB(simPara->getMaxVelocity());
+    para->setViscosityRatio(1.0);
+    para->setVelocityRatio(1.0);
+    para->setDensityRatio(1.0);
+    para->setFactorPressBC(100000.0);
+
+    para->setgeoVec(gridPath + "geoVec.dat");
+    para->setcoordX(gridPath + "coordX.dat");
+    para->setcoordY(gridPath + "coordY.dat");
+    para->setcoordZ(gridPath + "coordZ.dat");
+    para->setneighborX(gridPath + "neighborX.dat");
+    para->setneighborY(gridPath + "neighborY.dat");
+    para->setneighborZ(gridPath + "neighborZ.dat");
+    para->setneighborWSB(gridPath + "neighborWSB.dat");
+    para->setgeomBoundaryBcQs(gridPath + "geomBoundaryQs.dat");
+    para->setgeomBoundaryBcValues(gridPath + "geomBoundaryValues.dat");
+    para->setinletBcQs(gridPath + "inletBoundaryQs.dat");
+    para->setinletBcValues(gridPath + "inletBoundaryValues.dat");
+    para->setoutletBcQs(gridPath + "outletBoundaryQs.dat");
+    para->setoutletBcValues(gridPath + "outletBoundaryValues.dat");
+    para->settopBcQs(gridPath + "topBoundaryQs.dat");
+    para->settopBcValues(gridPath + "topBoundaryValues.dat");
+    para->setbottomBcQs(gridPath + "bottomBoundaryQs.dat");
+    para->setbottomBcValues(gridPath + "bottomBoundaryValues.dat");
+    para->setfrontBcQs(gridPath + "frontBoundaryQs.dat");
+    para->setfrontBcValues(gridPath + "frontBoundaryValues.dat");
+    para->setbackBcQs(gridPath + "backBoundaryQs.dat");
+    para->setbackBcValues(gridPath + "backBoundaryValues.dat");
+    para->setnumberNodes(gridPath + "numberNodes.dat");
+    para->setLBMvsSI(gridPath + "LBMvsSI.dat");
+    para->setscaleCFC(gridPath + "scaleCFC.dat");
+    para->setscaleCFF(gridPath + "scaleCFF.dat");
+    para->setscaleFCC(gridPath + "scaleFCC.dat");
+    para->setscaleFCF(gridPath + "scaleFCF.dat");
+    para->setscaleOffsetCF(gridPath + "offsetVecCF.dat");
+    para->setscaleOffsetFC(gridPath + "offsetVecFC.dat");
+    para->setCalcParticles(false);
+    para->setDiffOn(false);
+    para->setDoCheckPoint(false);
+    para->setDoRestart(false);
+    para->setUseGeometryValues(false);
+    para->setCalc2ndOrderMoments(false);
+    para->setCalc3rdOrderMoments(false);
+    para->setCalcHighOrderMoments(false);
+    para->setReadGeo(false);
+    para->setCalcMedian(false);
+    para->setConcFile(false);
+    para->setUseMeasurePoints(false);
+    para->setUseWale(false);
+    para->setSimulatePorousMedia(false);
+    para->setForcing(0.0, 0.0, 0.0);
+
+    std::vector<int> dist;
+    dist.resize(1);
+    dist[0] = 0;
+    para->setDistX(dist);
+    para->setDistY(dist);
+    para->setDistZ(dist);
+
+    // TODO: Find out if we still need this
+    // para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
+
+    para->setMainKernel(simPara->getKernelConfiguration()->getMainKernel());
+    para->setMultiKernelOn(simPara->getKernelConfiguration()->getMultiKernelOn());
+    para->setMultiKernelLevel(simPara->getKernelConfiguration()->getMultiKernelLevel());
+    para->setMultiKernel(simPara->getKernelConfiguration()->getMultiKernel());
+
+    return para;
+}
+
+std::shared_ptr<NumericalTestGridReader> makeGridReader(std::shared_ptr<InitialCondition> initialCondition,
+                                                        std::shared_ptr<Parameter> para,
+                                                        std::shared_ptr<CudaMemoryManager> cudaManager)
+{
+    return NumericalTestGridReader::getNewInstance(para, initialCondition, cudaManager);
+}
+
+void initInitialConditions(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para)
+{
+    initialCondition->setParameter(para);
+}
+
+std::vector<std::shared_ptr<VirtualFluidSimulation>>
+vf::gpu::tests::makeVirtualFluidSimulations(std::vector<std::shared_ptr<TestSimulation>> testSim)
+{
+    std::vector<std::shared_ptr<VirtualFluidSimulation>> vfSimulations;
+
+    for (const auto currentSim : testSim) {
+        auto vfSim = std::make_shared<VirtualFluidSimulation>();
+        auto simPara = currentSim->getSimulationParameter();
+        auto para = makeParameter(simPara);
+        vfSim->setParameter(para);
+        currentSim->setParameter(para);
+
+        auto cudaManager = std::make_shared<CudaMemoryManager>(para);
+        vfSim->setCudaMemoryManager(cudaManager);
+
+        initInitialConditions(currentSim->getInitialCondition(), para);
+        auto grid = makeGridReader(currentSim->getInitialCondition(), para, cudaManager);
+
+        vfSim->setGridProvider(grid);
+        vfSim->setDataWriter(currentSim->getDataWriter());
+        vfSim->setNumericalTestSuite(currentSim);
+        vfSim->setTimeTracking(currentSim->getTimeTracking());
+
+        vfSimulations.push_back(vfSim);
+    }
+
+    return vfSimulations;
+}
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.h b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.h
index 1abda69dc2770d060d3551781df4f0b677fa61b4..caeff55ae522a115ae83d03df3b91168d18cd443 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.h
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.h
@@ -1,15 +1,14 @@
-#ifndef VIRTUAL_FLUID_SIMULATION_FACTORY_H
-#define VIRTUAL_FLUID_SIMULATION_FACTORY_H
+#ifndef VIRTUAL_FLUID_SIMULATION_FACTORY_IMP_H
+#define VIRTUAL_FLUID_SIMULATION_FACTORY_IMP_H
 
-#include <memory>
 #include <vector>
+#include <memory>
+#include "Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h"
+#include "Utilities/TestSimulation/TestSimulation.h"
 
-class VirtualFluidSimulation;
-class TestSimulation;
-
-class VirtualFluidSimulationFactory
+namespace vf::gpu::tests
 {
-public:
-	virtual std::vector<std::shared_ptr<VirtualFluidSimulation> > makeVirtualFluidSimulations(std::vector<std::shared_ptr<TestSimulation> > testSim) = 0;
-};
-#endif
+std::vector<std::shared_ptr<VirtualFluidSimulation>> makeVirtualFluidSimulations(std::vector<std::shared_ptr<TestSimulation>> testSim);
+}
+
+#endif
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp
deleted file mode 100644
index 437849ab24898a014acc030b1ccc134b59dd50d6..0000000000000000000000000000000000000000
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-#include "VirtualFluidSimulationFactoryImp.h"
-
-#include "Utilities/NumericalTestGridReader/NumericalTestGridReader.h"
-#include "Utilities/InitialCondition/InitialCondition.h"
-#include "Utilities/KernelConfiguration/KernelConfiguration.h"
-#include "Utilities/TestSimulation/TestSimulation.h"
-#include "Utilities/SimulationParameter/SimulationParameter.h"
-#include "Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.h"
-
-#include "VirtualFluids_GPU/GPU/CudaMemoryManager.h"
-#include "VirtualFluids_GPU/Parameter/Parameter.h"
-#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactoryImp.h"
-#include "VirtualFluids_GPU/PreProcessor/PreProcessorFactory/PreProcessorFactoryImp.h"
-
-std::shared_ptr<VirtualFluidSimulationFactory> VirtualFluidSimulationFactoryImp::getNewInstance()
-{
-	return std::shared_ptr<VirtualFluidSimulationFactory>(new VirtualFluidSimulationFactoryImp());
-}
-
-VirtualFluidSimulationFactoryImp::VirtualFluidSimulationFactoryImp()
-{
-
-}
-
-std::shared_ptr<Parameter> VirtualFluidSimulationFactoryImp::makeParameter(std::shared_ptr<SimulationParameter> simPara)
-{
-	auto para = std::make_shared<Parameter>(1, 0);
-
-	para->setMaxDev(simPara->getDevices().size());
-	para->setDevices(simPara->getDevices());
-
-	std::string _prefix = "cells";
-	std::string gridPath = simPara->getGridPath() + "/";
-	para->setPathAndFilename(simPara->getFilePath() + "/" + _prefix);
-	para->setPrintFiles(true);
-
-	para->setD3Qxx(27);
-	para->setMaxLevel(simPara->getNumberOfGridLevels());
-
-	para->setTimestepEnd(simPara->getEndTime());
-	para->setTimestepOut(simPara->getTimeStepLength());
-<<<<<<< HEAD
-	para->setTimestepStartOut(1);
-=======
-	para->setTStartOut(1);
->>>>>>> Clean up unnecessary comments
-
-	para->setViscosityLB(simPara->getViscosity());
-	para->setVelocityLB(simPara->getMaxVelocity());
-	para->setViscosityRatio(1.0);
-	para->setVelocityRatio(1.0);
-	para->setDensityRatio(1.0);
-	para->setFactorPressBC(100000.0);
-
-	para->setgeoVec(gridPath + "geoVec.dat");
-	para->setcoordX(gridPath + "coordX.dat");
-	para->setcoordY(gridPath + "coordY.dat");
-	para->setcoordZ(gridPath + "coordZ.dat");
-	para->setneighborX(gridPath + "neighborX.dat");
-	para->setneighborY(gridPath + "neighborY.dat");
-	para->setneighborZ(gridPath + "neighborZ.dat");
-	para->setneighborWSB(gridPath + "neighborWSB.dat");
-	para->setgeomBoundaryBcQs(gridPath + "geomBoundaryQs.dat");
-	para->setgeomBoundaryBcValues(gridPath + "geomBoundaryValues.dat");
-	para->setinletBcQs(gridPath + "inletBoundaryQs.dat");
-	para->setinletBcValues(gridPath + "inletBoundaryValues.dat");
-	para->setoutletBcQs(gridPath + "outletBoundaryQs.dat");
-	para->setoutletBcValues(gridPath + "outletBoundaryValues.dat");
-	para->settopBcQs(gridPath + "topBoundaryQs.dat");
-	para->settopBcValues(gridPath + "topBoundaryValues.dat");
-	para->setbottomBcQs(gridPath + "bottomBoundaryQs.dat");
-	para->setbottomBcValues(gridPath + "bottomBoundaryValues.dat");
-	para->setfrontBcQs(gridPath + "frontBoundaryQs.dat");
-	para->setfrontBcValues(gridPath + "frontBoundaryValues.dat");
-	para->setbackBcQs(gridPath + "backBoundaryQs.dat");
-	para->setbackBcValues(gridPath + "backBoundaryValues.dat");
-	para->setnumberNodes(gridPath + "numberNodes.dat");
-	para->setLBMvsSI(gridPath + "LBMvsSI.dat");
-	para->setscaleCFC(gridPath + "scaleCFC.dat");
-	para->setscaleCFF(gridPath + "scaleCFF.dat");
-	para->setscaleFCC(gridPath + "scaleFCC.dat");
-	para->setscaleFCF(gridPath + "scaleFCF.dat");
-	para->setscaleOffsetCF(gridPath + "offsetVecCF.dat");
-	para->setscaleOffsetFC(gridPath + "offsetVecFC.dat");
-	para->setCalcParticles(false);
-	para->setDiffOn(false);
-	para->setDoCheckPoint(false);
-	para->setDoRestart(false);
-	para->setUseGeometryValues(false);
-	para->setCalc2ndOrderMoments(false);
-	para->setCalc3rdOrderMoments(false);
-	para->setCalcHighOrderMoments(false);
-	para->setReadGeo(false);
-	para->setCalcMedian(false);
-	para->setConcFile(false);
-	para->setUseMeasurePoints(false);
-	para->setUseWale(false);
-	para->setSimulatePorousMedia(false);
-	para->setForcing(0.0, 0.0, 0.0);
-
-	std::vector<int> dist;
-	dist.resize(1);
-	dist[0] = 0;
-	para->setDistX(dist);
-	para->setDistY(dist);
-	para->setDistZ(dist);
-
-	// TODO: Find out if we still need this
-	// para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
-
-	para->setMainKernel(simPara->getKernelConfiguration()->getMainKernel());
-	para->setMultiKernelOn(simPara->getKernelConfiguration()->getMultiKernelOn());
-	para->setMultiKernelLevel(simPara->getKernelConfiguration()->getMultiKernelLevel());
-	para->setMultiKernel(simPara->getKernelConfiguration()->getMultiKernel());
-
-	return para;
-}
-
-std::shared_ptr<NumericalTestGridReader> VirtualFluidSimulationFactoryImp::makeGridReader(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaManager)
-{
-	return NumericalTestGridReader::getNewInstance(para, initialCondition, cudaManager);
-}
-
-std::shared_ptr<CudaMemoryManager> VirtualFluidSimulationFactoryImp::makeCudaMemoryManager(std::shared_ptr<Parameter> para)
-{
-	return std::make_shared<CudaMemoryManager>(para);
-}
-
-void VirtualFluidSimulationFactoryImp::initInitialConditions(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para)
-{
-	initialCondition->setParameter(para);
-}
-
-std::vector<std::shared_ptr<VirtualFluidSimulation> > VirtualFluidSimulationFactoryImp::makeVirtualFluidSimulations(std::vector<std::shared_ptr<TestSimulation> > testSim)
-{
-	std::vector<std::shared_ptr<VirtualFluidSimulation> > vfSimulations;
-
-	auto kernelFactory = std::make_shared<KernelFactoryImp>();
-	auto preProcessorFactory = std::make_shared<PreProcessorFactoryImp>();
-
-	for (size_t i = 0; i < testSim.size(); i++) {
-		std::shared_ptr<VirtualFluidSimulationImp> vfSim = VirtualFluidSimulationImp::getNewInstance();
-		
-		std::shared_ptr<Parameter> para = makeParameter(testSim.at(i)->getSimulationParameter());
-		vfSim->setParameter(para);
-		testSim.at(i)->setParameter(para);
-
-		std::shared_ptr<CudaMemoryManager> cudaManager = makeCudaMemoryManager(para);
-		vfSim->setCudaMemoryManager(cudaManager);
-
-		initInitialConditions(testSim.at(i)->getInitialCondition(), para);
-		std::shared_ptr<NumericalTestGridReader> grid = makeGridReader(testSim.at(i)->getInitialCondition(), para, cudaManager);
-		
-		vfSim->setGridProvider(grid);
-		vfSim->setDataWriter(testSim.at(i)->getDataWriter());
-		vfSim->setNumericalTestSuite(testSim.at(i));
-		vfSim->setTimeTracking(testSim.at(i)->getTimeTracking());
-
-		vfSim->setKernelFactory(kernelFactory);
-		vfSim->setPreProcessorFactory(preProcessorFactory);
-
-		vfSimulations.push_back(vfSim);		
-	}
-
-	return vfSimulations;
-}
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.h b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.h
deleted file mode 100644
index 07e6b6ebb924a6b4ff940befd7ba8e266e9b160a..0000000000000000000000000000000000000000
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef VIRTUAL_FLUID_SIMULATION_FACTORY_IMP_H
-#define VIRTUAL_FLUID_SIMULATION_FACTORY_IMP_H
-
-#include "VirtualFluidSimulationFactory.h"
-
-class CudaMemoryManager;
-class NumericalTestGridReader;
-class InitialCondition;
-class Parameter;
-class SimulationParameter;
-
-class VirtualFluidSimulationFactoryImp: public VirtualFluidSimulationFactory
-{
-public:
-	static std::shared_ptr<VirtualFluidSimulationFactory> getNewInstance();
-	std::vector<std::shared_ptr<VirtualFluidSimulation> > makeVirtualFluidSimulations(std::vector<std::shared_ptr<TestSimulation> > testSim);
-
-protected:
-	VirtualFluidSimulationFactoryImp();
-	
-	std::shared_ptr<Parameter> makeParameter(std::shared_ptr<SimulationParameter> simPara);
-	std::shared_ptr<NumericalTestGridReader> makeGridReader(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaManager);
-	std::shared_ptr<CudaMemoryManager> makeCudaMemoryManager(std::shared_ptr<Parameter> para);
-	void initInitialConditions(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para);
-
-private:
-
-};
-#endif
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/main.cpp b/apps/gpu/tests/NumericalTests/main.cpp
index 703e8961497f3f1c93cb460fb9937f391e4ea0e9..81ced12e096131186d68184108f06b4bcaa92b5e 100644
--- a/apps/gpu/tests/NumericalTests/main.cpp
+++ b/apps/gpu/tests/NumericalTests/main.cpp
@@ -1,143 +1,144 @@
-#include <mpi.h>
 #include <gmock/gmock.h>
+#include <mpi.h>
 
 #include "Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h"
 #include "Utilities/LogFileQueue/LogFileQueue.h"
 #include "Utilities/NumericalTestFactory/NumericalTestFactoryImp.h"
 #include "Utilities/TestQueue/TestQueue.h"
 #include "Utilities/VirtualFluidSimulation/VirtualFluidSimulation.h"
-#include "Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.h"
+#include "Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactory.h"
 
-//validation
+// validation
+#include "Utilities/Calculator/FFTCalculator/FFTCalculator.h"
 #include <fstream>
 #include <iostream>
-#include "Utilities/Calculator/FFTCalculator/FFTCalculator.h"
 
 static void validateTestSuite()
 {
-	const int timeSteps = 10;
-	const int begin = 11;
-	const int end = 20;
-	const int l0 = 32;
-	const double viscosity = 0.001;
-	std::string kernelName = "Cum";
-
-	std::vector<int> xLength{32,64,128,256,512};
-	std::vector<int> zLength(xLength.size());
-	std::vector<int> timeStepLength(xLength.size());
-	for (int i = 0; i < xLength.size(); i++) {
-		zLength.at(i) = xLength.at(i) * 3 / 2;
-		timeStepLength.at(i) = (int)1000 * xLength.at(i)*xLength.at(i) / l0 / l0;
-	}
-		
-	std::vector<std::vector<std::ostringstream>> filePaths;
-	filePaths.resize(xLength.size());
-	
-	for (int j = 0; j < xLength.size(); j++) {
-		filePaths.at(j).resize(timeSteps);
-		for (int i = begin; i <= end; i++)
-			filePaths.at(j).at(i - begin) << "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/Auswertung_TGV_10hm3_X_CumD3Q27F3/" << kernelName << "_" << xLength.at(j) << "_3_" << zLength.at(j) << "_AD_X_" << i*timeStepLength.at(j) << ".dat";
-
-	}
-	std::vector<std::vector<std::vector<double>>> dataForOneSimulationGroup;
-	
-	for (int j = 0; j < filePaths.size(); j++) {
-		std::vector<std::vector<double>> dataForOneSimulation;
-		dataForOneSimulation.resize(timeSteps);
-		for (int i = 0; i < filePaths.at(j).size(); i++) {
-			std::ifstream file;
-			file.open(filePaths.at(j).at(i).str());
-
-			if (file.is_open()) {
-				double data = 0.0;
-				while (file >> data)
-					dataForOneSimulation.at(i).push_back(data);
-
-				file.close();
-			}
-			else
-				int stop = 1;
-		}
-		dataForOneSimulationGroup.push_back(dataForOneSimulation);
-	}
-
-	std::shared_ptr<FFTCalculator> calulator = FFTCalculator::getInstance();
-
-	std::vector<double> phiDifForOneSimGroup;
-	std::vector<double> nyDifForOneSimGroup;
-	for (int i = 0; i < dataForOneSimulationGroup.size(); i++) {
-		int timeStepLength = 1000 * xLength.at(i)*xLength.at(i) / l0 / l0;
-
-		double phiDiff = calulator->calcPhiDiff(dataForOneSimulationGroup.at(i), false, xLength.at(i), zLength.at(i), timeStepLength);
-		double ny = calulator->calcNy(dataForOneSimulationGroup.at(i), false, xLength.at(i), zLength.at(i), timeStepLength);
-		double nyDiff = abs(ny - viscosity) / viscosity;
-		phiDifForOneSimGroup.push_back(phiDiff);
-		nyDifForOneSimGroup.push_back(nyDiff);
-	}
-
-
-
-	std::fstream dataOutPhi;
-	std::string dataOutFilePathPhi = "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/NumericalTestAuswertung/" + kernelName + "_PhiDiff.dat";
-	dataOutPhi.open(dataOutFilePathPhi, std::ios::out);
-
-	std::fstream dataOutNy;
-	std::string dataOutFilePathNy = "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/NumericalTestAuswertung/" + kernelName + "_NyDiff.dat";
-	dataOutNy.open(dataOutFilePathNy, std::ios::out);
-
-	for (int i = 0; i < phiDifForOneSimGroup.size(); i++) {
-		dataOutPhi << std::fixed << std::setprecision(std::numeric_limits<double>::digits10 + 1);
-		dataOutPhi << phiDifForOneSimGroup.at(i);
-		dataOutNy << std::fixed << std::setprecision(std::numeric_limits<double>::digits10 + 1);
-		dataOutNy << nyDifForOneSimGroup.at(i);
-
-		if (i < phiDifForOneSimGroup.size() - 1) {
-			dataOutPhi << std::endl;
-			dataOutNy << std::endl;
-		}
-	}
-
-	dataOutPhi.close();
+    const int timeSteps = 10;
+    const int begin = 11;
+    const int end = 20;
+    const int l0 = 32;
+    const double viscosity = 0.001;
+    std::string kernelName = "Cum";
+
+    std::vector<int> xLength{ 32, 64, 128, 256, 512 };
+    std::vector<int> zLength(xLength.size());
+    std::vector<int> timeStepLength(xLength.size());
+    for (int i = 0; i < xLength.size(); i++) {
+        zLength.at(i) = xLength.at(i) * 3 / 2;
+        timeStepLength.at(i) = (int)1000 * xLength.at(i) * xLength.at(i) / l0 / l0;
+    }
+
+    std::vector<std::vector<std::ostringstream>> filePaths;
+    filePaths.resize(xLength.size());
+
+    for (int j = 0; j < xLength.size(); j++) {
+        filePaths.at(j).resize(timeSteps);
+        for (int i = begin; i <= end; i++)
+            filePaths.at(j).at(i - begin)
+                << "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/Auswertung_TGV_10hm3_X_CumD3Q27F3/"
+                << kernelName << "_" << xLength.at(j) << "_3_" << zLength.at(j) << "_AD_X_" << i * timeStepLength.at(j)
+                << ".dat";
+    }
+    std::vector<std::vector<std::vector<double>>> dataForOneSimulationGroup;
+
+    for (int j = 0; j < filePaths.size(); j++) {
+        std::vector<std::vector<double>> dataForOneSimulation;
+        dataForOneSimulation.resize(timeSteps);
+        for (int i = 0; i < filePaths.at(j).size(); i++) {
+            std::ifstream file;
+            file.open(filePaths.at(j).at(i).str());
+
+            if (file.is_open()) {
+                double data = 0.0;
+                while (file >> data)
+                    dataForOneSimulation.at(i).push_back(data);
+
+                file.close();
+            } else
+                int stop = 1;
+        }
+        dataForOneSimulationGroup.push_back(dataForOneSimulation);
+    }
+
+    std::shared_ptr<FFTCalculator> calulator = FFTCalculator::getInstance();
+
+    std::vector<double> phiDifForOneSimGroup;
+    std::vector<double> nyDifForOneSimGroup;
+    for (int i = 0; i < dataForOneSimulationGroup.size(); i++) {
+        int timeStepLength = 1000 * xLength.at(i) * xLength.at(i) / l0 / l0;
+
+        double phiDiff = calulator->calcPhiDiff(dataForOneSimulationGroup.at(i), false, xLength.at(i), zLength.at(i),
+                                                timeStepLength);
+        double ny =
+            calulator->calcNy(dataForOneSimulationGroup.at(i), false, xLength.at(i), zLength.at(i), timeStepLength);
+        double nyDiff = abs(ny - viscosity) / viscosity;
+        phiDifForOneSimGroup.push_back(phiDiff);
+        nyDifForOneSimGroup.push_back(nyDiff);
+    }
+
+    std::fstream dataOutPhi;
+    std::string dataOutFilePathPhi =
+        "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/NumericalTestAuswertung/" + kernelName +
+        "_PhiDiff.dat";
+    dataOutPhi.open(dataOutFilePathPhi, std::ios::out);
+
+    std::fstream dataOutNy;
+    std::string dataOutFilePathNy =
+        "C:/Users/Timon/Desktop/Auswertung_TGV_10hm3_X_CumD3Q27F3/NumericalTestAuswertung/" + kernelName +
+        "_NyDiff.dat";
+    dataOutNy.open(dataOutFilePathNy, std::ios::out);
+
+    for (int i = 0; i < phiDifForOneSimGroup.size(); i++) {
+        dataOutPhi << std::fixed << std::setprecision(std::numeric_limits<double>::digits10 + 1);
+        dataOutPhi << phiDifForOneSimGroup.at(i);
+        dataOutNy << std::fixed << std::setprecision(std::numeric_limits<double>::digits10 + 1);
+        dataOutNy << nyDifForOneSimGroup.at(i);
+
+        if (i < phiDifForOneSimGroup.size() - 1) {
+            dataOutPhi << std::endl;
+            dataOutNy << std::endl;
+        }
+    }
+
+    dataOutPhi.close();
 }
 
-
 static bool startNumericalTests(const std::string &configFile)
 {
-	std::shared_ptr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance(configFile);
-	configReader->readConfigFile();
-
-	std::shared_ptr<NumericalTestFactoryImp> numericalTestFactory = NumericalTestFactoryImp::getNewInstance(configReader->getConfigData());
+    auto configData = vf::gpu::tests::readConfigFile(configFile);
 
-	std::vector<std::shared_ptr<TestSimulation> > testSim = numericalTestFactory->getTestSimulations();
-	std::shared_ptr<TestQueue> testQueue = numericalTestFactory->getTestQueue();
-	std::shared_ptr<LogFileQueue> logFileQueue = numericalTestFactory->getLogFileQueue();
+    std::shared_ptr<NumericalTestFactoryImp> numericalTestFactory = NumericalTestFactoryImp::getNewInstance(configData);
 
-	std::shared_ptr<VirtualFluidSimulationFactory> factory = VirtualFluidSimulationFactoryImp::getNewInstance();
-	std::vector<std::shared_ptr<VirtualFluidSimulation> > vfSimulations = factory->makeVirtualFluidSimulations(testSim);
+    std::vector<std::shared_ptr<TestSimulation>> testSim = numericalTestFactory->getTestSimulations();
+    std::shared_ptr<TestQueue> testQueue = numericalTestFactory->getTestQueue();
+    std::shared_ptr<LogFileQueue> logFileQueue = numericalTestFactory->getLogFileQueue();
 
-	for (int i = 0; i < vfSimulations.size(); i++)
-		vfSimulations.at(i)->run();
+    auto vfSimulations = vf::gpu::tests::makeVirtualFluidSimulations(testSim);
+    for (const auto sim : vfSimulations)
+        sim->run();
 
-	testQueue->makeFinalOutput();
-	logFileQueue->writeLogFiles();
+    testQueue->makeFinalOutput();
+    logFileQueue->writeLogFiles();
 
-	return testQueue->getNumberOfFailedTests() > 0;
+    return testQueue->getNumberOfFailedTests() > 0;
 }
 
 int main(int argc, char **argv)
 {
-	MPI_Init(&argc, &argv);
+    MPI_Init(&argc, &argv);
 
-	//validateTestSuite();
+    // validateTestSuite();
 
-	bool tests_passed{false};
+    bool tests_passed{ false };
 
-	if (argc > 1)
+    if (argc > 1)
         tests_passed = startNumericalTests(argv[1]);
-	else
-		std::cout << "Configuration file must be set!: lbmgm <config file>" << std::endl << std::flush;
+    else
+        std::cout << "Configuration file must be set!: lbmgm <config file>" << std::endl << std::flush;
 
     MPI_Finalize();
 
-	return tests_passed;
+    return tests_passed;
 }