diff --git a/apps/gpu/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp b/apps/gpu/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
index 0f254c99746a98f0e8f2323ba0f89e73e9317052..9f4254c7a4b717509e607384052dc810a9696989 100644
--- a/apps/gpu/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
+++ b/apps/gpu/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
@@ -11,7 +11,8 @@
 
 #include "Utilities/LogFileData/LogFileDataImp.h"
 
-#include "Core/Input/Input.h"
+// #include "Core/Input/Input.h"
+#include <basics/config/ConfigurationFile.h>
 #include "Core/StringUtilities/StringUtil.h"
 
 #include "Utilities/AlmostEquals.h"
@@ -33,33 +34,35 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 {
 	std::shared_ptr<LogFileDataImp> logFileData = LogFileDataImp::getNewInstance();
 
-	std::ifstream stream;
-	stream.open(filePath.c_str(), std::ios::in);
-	if (stream.fail()) {
-		std::cout << "can not open log file!\n";
-		exit(1);
-	}
+	// std::ifstream stream;
+	// stream.open(filePath.c_str(), std::ios::in);
+	// if (stream.fail()) {
+	// 	std::cout << "can not open log file!\n";
+	// 	exit(1);
+	// }
 
-	std::unique_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+	// std::unique_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+	auto input = std::make_shared<vf::basics::ConfigurationFile>();
+	input->load(filePath);
 
 	logFileData->setFilePath(filePath);
-	logFileData->setDate(input->getValue("Date"));
-	logFileData->setTime(input->getValue("Time"));
-	logFileData->setGpuDevices(StringUtil::toStringVector(input->getValue("GPU_Devices")));
+	logFileData->setDate(input->getValue<std::string>("Date"));
+	logFileData->setTime(input->getValue<std::string>("Time"));
+	logFileData->setGpuDevices(StringUtil::toStringVector(input->getValue<std::string>("GPU_Devices")));
 
-	logFileData->setKernel(input->getValue("Kernel"));
-	logFileData->setNumberOfTimeSteps(StringUtil::toInt(input->getValue("NumberOfTimeSteps")));
-	logFileData->setViscosity(StringUtil::toDouble(input->getValue("Viscosity")));
-	logFileData->setBasisTimeStepLength(StringUtil::toInt(input->getValue("BasisTimeStepLength")));
+	logFileData->setKernel(input->getValue<std::string>("Kernel"));
+	logFileData->setNumberOfTimeSteps(StringUtil::toInt(input->getValue<std::string>("NumberOfTimeSteps")));
+	logFileData->setViscosity(StringUtil::toDouble(input->getValue<std::string>("Viscosity")));
+	logFileData->setBasisTimeStepLength(StringUtil::toInt(input->getValue<std::string>("BasisTimeStepLength")));
 
-	logFileData->setSimName(input->getValue("SimulationName"));
+	logFileData->setSimName(input->getValue<std::string>("SimulationName"));
 
 
 
 
 	std::ostringstream simSigniture;
 	if (logFileData->getSimName() == "ShearWave") {
-		std::vector<double> shearWaveLx = StringUtil::toDoubleVector(input->getValue("Lx"));
+		std::vector<double> shearWaveLx = StringUtil::toDoubleVector(input->getValue<std::string>("Lx"));
 		logFileData->setBasicGridLengths(shearWaveLx);
 		std::vector<int> shearWaveL0;
 		std::vector<double> shearWaveUx;
@@ -69,9 +72,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 			l0 << "l0_" << shearWaveLx.at(i);
 			ux << "ux_" << shearWaveLx.at(i);
 			uz << "uz_" << shearWaveLx.at(i);
-			shearWaveL0.push_back(StringUtil::toInt(input->getValue(l0.str())));
-			shearWaveUx.push_back(StringUtil::toDouble(input->getValue(ux.str())));
-			shearWaveUz.push_back(StringUtil::toDouble(input->getValue(uz.str())));
+			shearWaveL0.push_back(StringUtil::toInt(input->getValue<std::string>(l0.str())));
+			shearWaveUx.push_back(StringUtil::toDouble(input->getValue<std::string>(ux.str())));
+			shearWaveUz.push_back(StringUtil::toDouble(input->getValue<std::string>(uz.str())));
 		}
 		std::shared_ptr<ShearWaveLogFileDataImp> swLogFileData = ShearWaveLogFileDataImp::getNewInstance();
 		swLogFileData->setL0(shearWaveL0);
@@ -82,7 +85,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		logFileData->setBasicSimulation(ShearWave);
 	}
 	if (logFileData->getSimName() == "TaylorGreenVortexUx") {
-		std::vector<double> tgvUxLx = StringUtil::toDoubleVector(input->getValue("Lx"));
+		std::vector<double> tgvUxLx = StringUtil::toDoubleVector(input->getValue<std::string>("Lx"));
 		logFileData->setBasicGridLengths(tgvUxLx);
 		std::vector<int> tgvUxL0;
 		std::vector<double> tgvUxUx;
@@ -92,9 +95,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 			l0 << "l0_" << tgvUxLx.at(i);
 			ux << "ux_" << tgvUxLx.at(i);
 			amplitude << "Amplitude_" << tgvUxLx.at(i);
-			tgvUxL0.push_back(StringUtil::toInt(input->getValue(l0.str())));
-			tgvUxUx.push_back(StringUtil::toDouble(input->getValue(ux.str())));
-			tgvUxAmp.push_back(StringUtil::toDouble(input->getValue(amplitude.str())));
+			tgvUxL0.push_back(StringUtil::toInt(input->getValue<std::string>(l0.str())));
+			tgvUxUx.push_back(StringUtil::toDouble(input->getValue<std::string>(ux.str())));
+			tgvUxAmp.push_back(StringUtil::toDouble(input->getValue<std::string>(amplitude.str())));
 		}
 		std::shared_ptr<TaylorGreenVortexUxLogFileDataImp> tgvUxLogFileData = TaylorGreenVortexUxLogFileDataImp::getNewInstance();
 		tgvUxLogFileData->setL0(tgvUxL0);
@@ -105,7 +108,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		logFileData->setBasicSimulation(TaylorGreenVortexUx);
 	}
 	if (logFileData->getSimName() == "TaylorGreenVortexUz") {
-		std::vector<double> tgvUzLz = StringUtil::toDoubleVector(input->getValue("Lx"));
+		std::vector<double> tgvUzLz = StringUtil::toDoubleVector(input->getValue<std::string>("Lx"));
 		logFileData->setBasicGridLengths(tgvUzLz);
 		std::vector<int> tgvUzL0;
 		std::vector<double> tgvUzUz;
@@ -115,9 +118,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 			l0 << "l0_" << tgvUzLz.at(i);
 			uz << "uz_" << tgvUzLz.at(i);
 			amplitude << "Amplitude_" << tgvUzLz.at(i);
-			tgvUzL0.push_back(StringUtil::toInt(input->getValue(l0.str())));
-			tgvUzUz.push_back(StringUtil::toDouble(input->getValue(uz.str())));
-			tgvUzAmp.push_back(StringUtil::toDouble(input->getValue(amplitude.str())));
+			tgvUzL0.push_back(StringUtil::toInt(input->getValue<std::string>(l0.str())));
+			tgvUzUz.push_back(StringUtil::toDouble(input->getValue<std::string>(uz.str())));
+			tgvUzAmp.push_back(StringUtil::toDouble(input->getValue<std::string>(amplitude.str())));
 		}
 		std::shared_ptr<TaylorGreenVortexUzLogFileDataImp> tgvUzLogFileData = TaylorGreenVortexUzLogFileDataImp::getNewInstance();
 		tgvUzLogFileData->setL0(tgvUzL0);
@@ -140,10 +143,10 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		resultsCheckTimeOStringStream << "ResultsCheckTime_" << logFileData->getBasicGridLengths().at(i);
 		testTimeOStringStream << "TestTime_" << logFileData->getBasicGridLengths().at(i);
 		analyticalVTKWritingTimeOStringStream << "AnalyticalVTKFileWritingTime_" << logFileData->getBasicGridLengths().at(i);
-		std::string simTimeString = input->getValue(simTimeOStringStream.str());
-		std::string resultCheckTimeString = input->getValue(resultsCheckTimeOStringStream.str());
-		std::string testTimeString = input->getValue(testTimeOStringStream.str());
-		std::string analyticalVTKWritingTimeString = input->getValue(analyticalVTKWritingTimeOStringStream.str());
+		std::string simTimeString = input->getValue<std::string>(simTimeOStringStream.str());
+		std::string resultCheckTimeString = input->getValue<std::string>(resultsCheckTimeOStringStream.str());
+		std::string testTimeString = input->getValue<std::string>(testTimeOStringStream.str());
+		std::string analyticalVTKWritingTimeString = input->getValue<std::string>(analyticalVTKWritingTimeOStringStream.str());
 		simTimeString.erase(simTimeString.end() - 3, simTimeString.end());
 		resultCheckTimeString.erase(resultCheckTimeString.end() - 3, resultCheckTimeString.end());
 		testTimeString.erase(testTimeString.end() - 3, testTimeString.end());
@@ -154,29 +157,29 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		analyticalVTKWritingTime.push_back(StringUtil::toInt(analyticalVTKWritingTimeString));
 	}
 
-	logFileData->setVTKFileWriting(StringUtil::toBool(input->getValue("VTKFileWriting")));
+	logFileData->setVTKFileWriting(StringUtil::toBool(input->getValue<std::string>("VTKFileWriting")));
 	logFileData->setSimTime(simTime);
 	logFileData->setResultCheckTime(resultsCheckTime);
 	logFileData->setTestTime(testTime);
 	logFileData->setAnalyticalVTKWritingTime(analyticalVTKWritingTime);
 	
-	logFileData->setPhiTestRun(StringUtil::toBool(input->getValue("PhiTest")));
-	logFileData->setNyTestRun(StringUtil::toBool(input->getValue("NyTest")));
-	logFileData->setL2NormTestRun(StringUtil::toBool(input->getValue("L2NormTest")));
-	logFileData->setL2NormTestBetweenKernelRun(StringUtil::toBool(input->getValue("L2NormTestBetweenKernel")));
+	logFileData->setPhiTestRun(StringUtil::toBool(input->getValue<std::string>("PhiTest")));
+	logFileData->setNyTestRun(StringUtil::toBool(input->getValue<std::string>("NyTest")));
+	logFileData->setL2NormTestRun(StringUtil::toBool(input->getValue<std::string>("L2NormTest")));
+	logFileData->setL2NormTestBetweenKernelRun(StringUtil::toBool(input->getValue<std::string>("L2NormTestBetweenKernel")));
 
 	if (logFileData->getPhiTestRun()) {
-		std::vector<std::string> failPhi = StringUtil::toStringVector(input->getValue("FailTests_Phi_PhiTest"));
-		std::vector<std::string> failOOA = StringUtil::toStringVector(input->getValue("FailTests_OOA_PhiTest"));
+		std::vector<std::string> failPhi = StringUtil::toStringVector(input->getValue<std::string>("FailTests_Phi_PhiTest"));
+		std::vector<std::string> failOOA = StringUtil::toStringVector(input->getValue<std::string>("FailTests_OOA_PhiTest"));
 
-		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue("DataToCalc_PhiTest"));
+		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue<std::string>("DataToCalc_PhiTest"));
 		std::vector<std::shared_ptr<PhiLogFileData> > aPhiLogGroup;
 		for (int i = 0; i < dataToCalc.size(); i++) {
 			std::shared_ptr<PhiLogFileDataImp> phiLog = PhiLogFileDataImp::getNewInstance();
 			phiLog->setBasicGridLengths(logFileData->getBasicGridLengths());
 			phiLog->setDataToCalc(dataToCalc.at(i));
-			phiLog->setStartTimeStepCalculation(StringUtil::toInt(input->getValue("StartTimeStepCalculation_PhiTest")));
-			phiLog->setEndTimeStepCalculation(StringUtil::toInt(input->getValue("EndTimeStepCalculation_PhiTest")));
+			phiLog->setStartTimeStepCalculation(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_PhiTest")));
+			phiLog->setEndTimeStepCalculation(StringUtil::toInt(input->getValue<std::string>("EndTimeStepCalculation_PhiTest")));
 
 			std::vector<double> phiDiff;
 			std::vector<std::vector<double> > orderOfAccuracy;
@@ -190,7 +193,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 				}
 				if (!failData) {
 					phiDiffString << "PhiDiff_" << logFileData->getBasicGridLengths().at(j) << "_" << dataToCalc.at(i);
-					phiDiff.push_back(StringUtil::toDouble(input->getValue(phiDiffString.str())));
+					phiDiff.push_back(StringUtil::toDouble(input->getValue<std::string>(phiDiffString.str())));
 				}
 
 				for (int k = j + 1; k < logFileData->getBasicGridLengths().size(); k++) {
@@ -206,7 +209,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 						phiDiffOOA << "OrderOfAccuracy_PhiDiff_" << phiDiffBasicOOA.str();
 						aOrderOfAccuracyGroup.push_back(logFileData->getBasicGridLengths().at(j));
 						aOrderOfAccuracyGroup.push_back(logFileData->getBasicGridLengths().at(k));
-						aOrderOfAccuracyGroup.push_back(StringUtil::toDouble(input->getValue(phiDiffOOA.str())));
+						aOrderOfAccuracyGroup.push_back(StringUtil::toDouble(input->getValue<std::string>(phiDiffOOA.str())));
 					}
 					if (aOrderOfAccuracyGroup.size() > 0)
 						orderOfAccuracy.push_back(aOrderOfAccuracyGroup);
@@ -231,17 +234,17 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 
 
 	if (logFileData->getNyTestRun()) {
-		std::vector<std::string> failNy = StringUtil::toStringVector(input->getValue("FailTests_Ny_NyTest"));
-		std::vector<std::string> failOOA = StringUtil::toStringVector(input->getValue("FailTests_OOA_NyTest"));
+		std::vector<std::string> failNy = StringUtil::toStringVector(input->getValue<std::string>("FailTests_Ny_NyTest"));
+		std::vector<std::string> failOOA = StringUtil::toStringVector(input->getValue<std::string>("FailTests_OOA_NyTest"));
 
-		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue("DataToCalc_NyTest"));
+		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue<std::string>("DataToCalc_NyTest"));
 		std::vector<std::shared_ptr<NyLogFileData> > aNyLogGroup;
 		for (int i = 0; i < dataToCalc.size(); i++) {
 			std::shared_ptr<NyLogFileDataImp> nyLog = NyLogFileDataImp::getNewInstance();
 			nyLog->setBasicGridLengths(logFileData->getBasicGridLengths());
 			nyLog->setDataToCalc(dataToCalc.at(i));
-			nyLog->setStartTimeStepCalculation(StringUtil::toInt(input->getValue("StartTimeStepCalculation_NyTest")));
-			nyLog->setEndTimeStepCalculation(StringUtil::toInt(input->getValue("EndTimeStepCalculation_NyTest")));
+			nyLog->setStartTimeStepCalculation(StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_NyTest")));
+			nyLog->setEndTimeStepCalculation(StringUtil::toInt(input->getValue<std::string>("EndTimeStepCalculation_NyTest")));
 
 			std::vector<double> ny, nyDiff;
 			std::vector<std::vector<double> > orderOfAccuracy;
@@ -255,9 +258,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 				}
 				if (!failData) {
 					nyString << "Ny_" << nyBasicString.str();
-					ny.push_back(StringUtil::toDouble(input->getValue(nyString.str())));
+					ny.push_back(StringUtil::toDouble(input->getValue<std::string>(nyString.str())));
 					nyDiffString << "NyDiff_" << logFileData->getBasicGridLengths().at(j) << "_" << dataToCalc.at(i);
-					nyDiff.push_back(StringUtil::toDouble(input->getValue(nyDiffString.str())));
+					nyDiff.push_back(StringUtil::toDouble(input->getValue<std::string>(nyDiffString.str())));
 				}			
 
 				
@@ -274,7 +277,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 						nyDiffOOA << "OrderOfAccuracy_NyDiff_" << nyDiffBasicOOA.str();
 						aOrderOfAccuracyGroup.push_back(logFileData->getBasicGridLengths().at(j));
 						aOrderOfAccuracyGroup.push_back(logFileData->getBasicGridLengths().at(k));
-						aOrderOfAccuracyGroup.push_back(StringUtil::toDouble(input->getValue(nyDiffOOA.str())));
+						aOrderOfAccuracyGroup.push_back(StringUtil::toDouble(input->getValue<std::string>(nyDiffOOA.str())));
 					}
 					if (aOrderOfAccuracyGroup.size() > 0)
 						orderOfAccuracy.push_back(aOrderOfAccuracyGroup);
@@ -300,17 +303,17 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 
 	if (logFileData->getL2NormTestRun()) {
 		std::vector<std::shared_ptr<L2NormLogFileData> > l2NormGroup;
-		std::vector<std::string> dataToCalcL2Norm = StringUtil::toStringVector(input->getValue("DataToCalc_L2Norm"));
-		std::vector<std::string> normData = StringUtil::toStringVector(input->getValue("NormalizeData_L2Norm"));
-		std::vector<std::string> failL2Norm = StringUtil::toStringVector(input->getValue("FailTests_L2Norm"));
+		std::vector<std::string> dataToCalcL2Norm = StringUtil::toStringVector(input->getValue<std::string>("DataToCalc_L2Norm"));
+		std::vector<std::string> normData = StringUtil::toStringVector(input->getValue<std::string>("NormalizeData_L2Norm"));
+		std::vector<std::string> failL2Norm = StringUtil::toStringVector(input->getValue<std::string>("FailTests_L2Norm"));
 		for (int i = 0; i < dataToCalcL2Norm.size(); i++) {
 			for (int k = 0; k < normData.size(); k++) {
 				std::shared_ptr<L2NormLogFileDataImp> aL2Norm = L2NormLogFileDataImp::getNewInstance();
 				aL2Norm->setDataToCalc(dataToCalcL2Norm.at(i));
 				aL2Norm->setNormalizeData(normData.at(k));
 				aL2Norm->setBasicGridLengths(logFileData->getBasicGridLengths());
-				aL2Norm->setBasicTimeStep(StringUtil::toInt(input->getValue("BasicTimeStep_L2Norm")));
-				aL2Norm->setDivergentTimeStep(StringUtil::toInt(input->getValue("DivergentTimeStep_L2Norm")));
+				aL2Norm->setBasicTimeStep(StringUtil::toInt(input->getValue<std::string>("BasicTimeStep_L2Norm")));
+				aL2Norm->setDivergentTimeStep(StringUtil::toInt(input->getValue<std::string>("DivergentTimeStep_L2Norm")));
 
 				std::vector<double>  l2NormBasicTimeStep;
 				std::vector<double>  l2NormDivergentTimeStep;
@@ -327,9 +330,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 						basicTimeStep << "L2Norm_BasicTimeStep_" << basicString.str();
 						divergentTimeStep << "L2Norm_DivergentTimeStep_" << basicString.str();
 						diff << "L2Norm_Diff_" << basicString.str();
-						l2NormBasicTimeStep.push_back(StringUtil::toDouble(input->getValue(basicTimeStep.str())));
-						l2NormDivergentTimeStep.push_back(StringUtil::toDouble(input->getValue(divergentTimeStep.str())));
-						l2NormDiff.push_back(StringUtil::toDouble(input->getValue(diff.str())));
+						l2NormBasicTimeStep.push_back(StringUtil::toDouble(input->getValue<std::string>(basicTimeStep.str())));
+						l2NormDivergentTimeStep.push_back(StringUtil::toDouble(input->getValue<std::string>(divergentTimeStep.str())));
+						l2NormDiff.push_back(StringUtil::toDouble(input->getValue<std::string>(diff.str())));
 					}
 				}
 				if (l2NormBasicTimeStep.size() > 0) {
@@ -380,10 +383,10 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 
 	if (logFileData->getL2NormTestBetweenKernelRun()) {
 		std::vector<std::shared_ptr<L2NormBetweenKernelsLogFileData> > l2NormBetweenKernelsData;
-		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue("DataToCalculate_L2Norm_BK"));
-		std::vector<int> timeSteps = StringUtil::toIntVector(input->getValue("TimeSteps_L2Norm_BK"));
-		std::vector<std::string> normalizeData = StringUtil::toStringVector(input->getValue("NormalizeWith_L2Norm_BK"));
-		std::vector<std::string> failL2Norm = StringUtil::toStringVector(input->getValue("FailTests_L2Norm_BK"));
+		std::vector<std::string> dataToCalc = StringUtil::toStringVector(input->getValue<std::string>("DataToCalculate_L2Norm_BK"));
+		std::vector<int> timeSteps = StringUtil::toIntVector(input->getValue<std::string>("TimeSteps_L2Norm_BK"));
+		std::vector<std::string> normalizeData = StringUtil::toStringVector(input->getValue<std::string>("NormalizeWith_L2Norm_BK"));
+		std::vector<std::string> failL2Norm = StringUtil::toStringVector(input->getValue<std::string>("FailTests_L2Norm_BK"));
 
 
 		for (int i = 0; i < dataToCalc.size(); i++) {
@@ -393,7 +396,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 					std::vector<double> l2NormDivergentKernel;
 					std::vector<double> l2NormBetweenKernels;
 					std::shared_ptr<L2NormBetweenKernelsLogFileDataImp> aL2NormLogFileData = L2NormBetweenKernelsLogFileDataImp::getNewInstance();
-					aL2NormLogFileData->setBasicKernel(input->getValue("BasicKernel_L2Norm_BK"));
+					aL2NormLogFileData->setBasicKernel(input->getValue<std::string>("BasicKernel_L2Norm_BK"));
 					aL2NormLogFileData->setDivergentKernel(logFileData->getKernel());
 					aL2NormLogFileData->setDataToCalculate(dataToCalc.at(i));
 					aL2NormLogFileData->setTimeStep(timeSteps.at(j));
@@ -415,9 +418,9 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 							basicKernel << "L2Norm_BasicKernel_" << basicString.str();
 							divergentKernel << "L2Norm_DivergentKernel_" << basicString.str();
 							diff << "L2Norm_Between_Kernels_" << basicString.str();
-							l2NormBasicKernel.push_back(StringUtil::toDouble(input->getValue(basicKernel.str())));
-							l2NormDivergentKernel.push_back(StringUtil::toDouble(input->getValue(divergentKernel.str())));
-							l2NormBetweenKernels.push_back(StringUtil::toDouble(input->getValue(diff.str())));
+							l2NormBasicKernel.push_back(StringUtil::toDouble(input->getValue<std::string>(basicKernel.str())));
+							l2NormDivergentKernel.push_back(StringUtil::toDouble(input->getValue<std::string>(divergentKernel.str())));
+							l2NormBetweenKernels.push_back(StringUtil::toDouble(input->getValue<std::string>(diff.str())));
 						}						
 					}
 					if (l2NormBasicKernel.size() > 0) {
diff --git a/apps/gpu/tests/NumericalTestPostProcessing/Utilities/PostProcessingConfigFileReader/PostProcessingConfigFileReaderImp.cpp b/apps/gpu/tests/NumericalTestPostProcessing/Utilities/PostProcessingConfigFileReader/PostProcessingConfigFileReaderImp.cpp
index 6aa5cfe7780267adfa5729c390c3ee0c0daeac18..9b4eec35e498c8491c8855e68bcef4d5e0a4550b 100644
--- a/apps/gpu/tests/NumericalTestPostProcessing/Utilities/PostProcessingConfigFileReader/PostProcessingConfigFileReaderImp.cpp
+++ b/apps/gpu/tests/NumericalTestPostProcessing/Utilities/PostProcessingConfigFileReader/PostProcessingConfigFileReaderImp.cpp
@@ -1,6 +1,7 @@
 #include "PostProcessingConfigFileReaderImp.h"
 
-#include "Core/Input/Input.h"
+// #include "Core/Input/Input.h"
+#include <basics/config/ConfigurationFile.h>
 #include "Core/StringUtilities/StringUtil.h"
 
 #include "Utilities/PostProcessingConfigData/PostProcessingConfigDataImp.h"
@@ -15,48 +16,50 @@ std::shared_ptr<PostProcessingConfigFileReader> PostProcessingConfigFileReaderIm
 
 std::shared_ptr<PostProcessingConfigData> PostProcessingConfigFileReaderImp::readConfigFile(std::string filePath)
 {
-	std::ifstream stream;
-	stream.open(filePath.c_str(), std::ios::in);
-	if (stream.fail()) {
-		throw "can not open config file!\n";
-		exit(1);
-	}
-	std::shared_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+	// std::ifstream stream;
+	// stream.open(filePath.c_str(), std::ios::in);
+	// if (stream.fail()) {
+	// 	throw "can not open config file!\n";
+	// 	exit(1);
+	// }
+	// std::shared_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+	auto input = std::make_shared<vf::basics::ConfigurationFile>();
+	input->load(filePath);
 
 
 	std::vector<BasicSimulation> simulation;
 	std::vector<Assistant> assistants;
 	std::vector<DataCombination> combination;
 
-	if(StringUtil::toBool(input->getValue("ShearWave")))
+	if(StringUtil::toBool(input->getValue<std::string>("ShearWave")))
 		simulation.push_back(ShearWave);
 
-	if (StringUtil::toBool(input->getValue("TaylorGreenVortexUx")))
+	if (StringUtil::toBool(input->getValue<std::string>("TaylorGreenVortexUx")))
 		simulation.push_back(TaylorGreenVortexUx);
 
-	if (StringUtil::toBool(input->getValue("TaylorGreenVortexUz")))
+	if (StringUtil::toBool(input->getValue<std::string>("TaylorGreenVortexUz")))
 		simulation.push_back(TaylorGreenVortexUz);
 
-	if (StringUtil::toBool(input->getValue("Phi")))
+	if (StringUtil::toBool(input->getValue<std::string>("Phi")))
 		assistants.push_back(Phi);
 
-	if (StringUtil::toBool(input->getValue("Ny")))
+	if (StringUtil::toBool(input->getValue<std::string>("Ny")))
 		assistants.push_back(Ny);
 
-	if (StringUtil::toBool(input->getValue("L2Norm")))
+	if (StringUtil::toBool(input->getValue<std::string>("L2Norm")))
 		assistants.push_back(L2Norm);
 
-	if (StringUtil::toBool(input->getValue("L2Norm_BetweenKernels")))
+	if (StringUtil::toBool(input->getValue<std::string>("L2Norm_BetweenKernels")))
 		assistants.push_back(L2NormBetweenKernels);
 
-	if (StringUtil::toBool(input->getValue("TimeOutput")))
+	if (StringUtil::toBool(input->getValue<std::string>("TimeOutput")))
 		assistants.push_back(Time);
 
 
-	if (StringUtil::toBool(input->getValue("EqualSimulationsForDifferentKernels")))
+	if (StringUtil::toBool(input->getValue<std::string>("EqualSimulationsForDifferentKernels")))
 		combination.push_back(EqualSimulationsForDifferentKernels);
 
-	if (StringUtil::toBool(input->getValue("EqualKernelSimulationsForDifferentViscosities")))
+	if (StringUtil::toBool(input->getValue<std::string>("EqualKernelSimulationsForDifferentViscosities")))
 		combination.push_back(EqualKernelSimulationsForDifferentViscosities);
 
 	std::shared_ptr<PostProcessingConfigDataImp> data = PostProcessingConfigDataImp::getNewInstance();
@@ -65,8 +68,8 @@ std::shared_ptr<PostProcessingConfigData> PostProcessingConfigFileReaderImp::rea
 	data->setSimulations(simulation);
 	data->setDataCombinations(combination);
 
-	data->setLogFilesPath(input->getValue("LogFilesPath"));
-	data->setMathematicaFilePath(input->getValue("MathematicaFilePath"));
+	data->setLogFilesPath(input->getValue<std::string>("LogFilesPath"));
+	data->setMathematicaFilePath(input->getValue<std::string>("MathematicaFilePath"));
 	
 	return data;
 }
diff --git a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
index 37734bc4dfbdd00df73a79947db2c07edb04ad18..947ce516e860e216806a6f288d134b1efd8b91a6 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.cpp
@@ -1,8 +1,10 @@
 #include "ConfigFileReaderNT.h"
 
-#include "Core/Input/Input.h"
+// #include "Core/Input/Input.h"
+#include <basics/config/ConfigurationFile.h>
 #include "Core/StringUtilities/StringUtil.h"
 
+#include <memory>
 #include <fstream>
 #include <string>
 
@@ -29,34 +31,31 @@ ConfigFileReader::ConfigFileReader(const std::string aFilePath) : myFilePath(aFi
 void ConfigFileReader::readConfigFile()
 {
     configData           = std::shared_ptr<ConfigDataStruct>(new ConfigDataStruct);
-    std::ifstream stream = openConfigFile(myFilePath);
 
-    std::shared_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+    auto input = std::make_shared<vf::basics::ConfigurationFile>();
+    input->load(myFilePath);
 
     if (!checkConfigFile(input))
         exit(1);
 
-    configData->viscosity            = StringUtil::toDoubleVector(input->getValue("Viscosity"));
+    configData->viscosity            = StringUtil::toDoubleVector(input->getValue<std::string>("Viscosity"));
     configData->kernelsToTest        = readKernelList(input);
-    configData->writeAnalyticalToVTK = StringUtil::toBool(input->getValue("WriteAnalyResultsToVTK"));
-    configData->ySliceForCalculation = StringUtil::toInt(input->getValue("ySliceForCalculation"));
-    ;
-    configData->logFilePath         = pathNumericalTests + input->getValue("FolderLogFile");
+    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);
@@ -66,8 +65,6 @@ void ConfigFileReader::readConfigFile()
     configData->vectorWriterInfo = makeVectorWriterInformationStruct(input);
 
     configData->logFilePara = makeLogFilePara(input);
-
-    stream.close();
 }
 
 std::ifstream ConfigFileReader::openConfigFile(const std::string aFilePath)
@@ -82,19 +79,19 @@ std::ifstream ConfigFileReader::openConfigFile(const std::string aFilePath)
 
 std::shared_ptr<ConfigDataStruct> ConfigFileReader::getConfigData() { return configData; }
 
-bool ConfigFileReader::checkConfigFile(std::shared_ptr<input::Input> input)
+bool ConfigFileReader::checkConfigFile(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
-    std::vector<double> u0TGVux               = StringUtil::toDoubleVector(input->getValue("ux_TGV_Ux"));
-    std::vector<double> amplitudeTGVux        = StringUtil::toDoubleVector(input->getValue("Amplitude_TGV_Ux"));
-    std::vector<int> basisTimeStepLengthTGVux = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_TGV_Ux"));
+    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"));
+    std::vector<int> basisTimeStepLengthTGVux = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_TGV_Ux"));
 
-    std::vector<double> v0TGVuz               = StringUtil::toDoubleVector(input->getValue("uz_TGV_Uz"));
-    std::vector<double> amplitudeTGVuz        = StringUtil::toDoubleVector(input->getValue("Amplitude_TGV_Uz"));
-    std::vector<int> basisTimeStepLengthTGVuz = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_TGV_Uz"));
+    std::vector<double> v0TGVuz               = StringUtil::toDoubleVector(input->getValue<std::string>("uz_TGV_Uz"));
+    std::vector<double> amplitudeTGVuz        = StringUtil::toDoubleVector(input->getValue<std::string>("Amplitude_TGV_Uz"));
+    std::vector<int> basisTimeStepLengthTGVuz = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_TGV_Uz"));
 
-    std::vector<double> v0SW               = StringUtil::toDoubleVector(input->getValue("v0_SW"));
-    std::vector<double> u0SW               = StringUtil::toDoubleVector(input->getValue("u0_SW"));
-    std::vector<int> basisTimeStepLengthSW = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_SW"));
+    std::vector<double> v0SW               = StringUtil::toDoubleVector(input->getValue<std::string>("v0_SW"));
+    std::vector<double> u0SW               = StringUtil::toDoubleVector(input->getValue<std::string>("u0_SW"));
+    std::vector<int> basisTimeStepLengthSW = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_SW"));
 
     if (u0TGVux.size() != amplitudeTGVux.size() || u0TGVux.size() != basisTimeStepLengthTGVux.size()) {
         std::cout << "Length u0_TGV_U0 is unequal to Lenght Amplitude_TGV_U0 or BasisTimeStepLength_TGV_U0!"
@@ -115,24 +112,24 @@ bool ConfigFileReader::checkConfigFile(std::shared_ptr<input::Input> input)
 }
 
 std::shared_ptr<BasicSimulationParameterStruct>
-ConfigFileReader::makeBasicSimulationParameter(std::shared_ptr<input::Input> input)
+ConfigFileReader::makeBasicSimulationParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<BasicSimulationParameterStruct> basicSimPara =
         std::shared_ptr<BasicSimulationParameterStruct>(new BasicSimulationParameterStruct);
 
-    basicSimPara->numberOfTimeSteps = StringUtil::toInt(input->getValue("NumberOfTimeSteps"));
-    basicSimPara->devices           = StringUtil::toUintVector(input->getValue("Devices"));
+    basicSimPara->numberOfTimeSteps = StringUtil::toInt(input->getValue<std::string>("NumberOfTimeSteps"));
+    basicSimPara->devices           = StringUtil::toUintVector(input->getValue<std::string>("Devices"));
     return basicSimPara;
 }
 
 std::vector<std::shared_ptr<TaylorGreenVortexUxParameterStruct>>
-ConfigFileReader::makeTaylorGreenVortexUxParameter(std::shared_ptr<input::Input> input,
+ConfigFileReader::makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                                                    std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
-    std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_TGV_Ux"));
-    std::vector<double> amplitude        = StringUtil::toDoubleVector(input->getValue("Amplitude_TGV_Ux"));
-    std::vector<double> u0               = StringUtil::toDoubleVector(input->getValue("ux_TGV_Ux"));
-    int l0                               = StringUtil::toInt(input->getValue("l0_TGV_Ux"));
+    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"));
+    std::vector<double> u0               = StringUtil::toDoubleVector(input->getValue<std::string>("ux_TGV_Ux"));
+    int l0                               = StringUtil::toInt(input->getValue<std::string>("l0_TGV_Ux"));
     basicSimParameter->l0                = l0;
 
     std::vector<std::shared_ptr<TaylorGreenVortexUxParameterStruct>> parameter;
@@ -145,22 +142,22 @@ ConfigFileReader::makeTaylorGreenVortexUxParameter(std::shared_ptr<input::Input>
         aParameter->amplitude           = amplitude.at(i);
         aParameter->basicTimeStepLength = basisTimeStepLength.at(i);
         aParameter->l0                  = l0;
-        aParameter->rho0                = StringUtil::toDouble(input->getValue("Rho0"));
-        aParameter->vtkFilePath         = pathNumericalTests + input->getValue("FolderForVTKFileWriting");
-        aParameter->dataToCalcTests     = StringUtil::toStringVector(input->getValue("DataToCalcTests_TGV_Ux"));
+        aParameter->rho0                = StringUtil::toDouble(input->getValue<std::string>("Rho0"));
+        aParameter->vtkFilePath         = pathNumericalTests + input->getValue<std::string>("FolderForVTKFileWriting");
+        aParameter->dataToCalcTests     = StringUtil::toStringVector(input->getValue<std::string>("DataToCalcTests_TGV_Ux"));
         parameter.push_back(aParameter);
     }
     return parameter;
 }
 
 std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>>
-ConfigFileReader::makeTaylorGreenVortexUzParameter(std::shared_ptr<input::Input> input,
+ConfigFileReader::makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                                                    std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
-    std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_TGV_Uz"));
-    std::vector<double> amplitude        = StringUtil::toDoubleVector(input->getValue("Amplitude_TGV_Uz"));
-    std::vector<double> uz               = StringUtil::toDoubleVector(input->getValue("uz_TGV_Uz"));
-    int l0                               = StringUtil::toInt(input->getValue("l0_TGV_Uz"));
+    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"));
+    std::vector<double> uz               = StringUtil::toDoubleVector(input->getValue<std::string>("uz_TGV_Uz"));
+    int l0                               = StringUtil::toInt(input->getValue<std::string>("l0_TGV_Uz"));
     basicSimParameter->l0                = l0;
 
     std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>> parameter;
@@ -172,21 +169,21 @@ ConfigFileReader::makeTaylorGreenVortexUzParameter(std::shared_ptr<input::Input>
         aParameter->amplitude                = amplitude.at(i);
         aParameter->basicTimeStepLength      = basisTimeStepLength.at(i);
         aParameter->l0                       = l0;
-        aParameter->rho0                     = StringUtil::toDouble(input->getValue("Rho0"));
-        aParameter->vtkFilePath              = pathNumericalTests + input->getValue("FolderForVTKFileWriting");
-        aParameter->dataToCalcTests          = StringUtil::toStringVector(input->getValue("DataToCalcTests_TGV_Uz"));
+        aParameter->rho0                     = StringUtil::toDouble(input->getValue<std::string>("Rho0"));
+        aParameter->vtkFilePath              = pathNumericalTests + input->getValue<std::string>("FolderForVTKFileWriting");
+        aParameter->dataToCalcTests          = StringUtil::toStringVector(input->getValue<std::string>("DataToCalcTests_TGV_Uz"));
         parameter.push_back(aParameter);
     }
     return parameter;
 }
 std::vector<std::shared_ptr<ShearWaveParameterStruct>>
-ConfigFileReader::makeShearWaveParameter(std::shared_ptr<input::Input> input,
+ConfigFileReader::makeShearWaveParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                                          std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter)
 {
-    std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue("BasisTimeStepLength_SW"));
-    std::vector<double> uz               = StringUtil::toDoubleVector(input->getValue("v0_SW"));
-    std::vector<double> ux               = StringUtil::toDoubleVector(input->getValue("u0_SW"));
-    int l0                               = StringUtil::toInt(input->getValue("l0_SW"));
+    std::vector<int> basisTimeStepLength = StringUtil::toIntVector(input->getValue<std::string>("BasisTimeStepLength_SW"));
+    std::vector<double> uz               = StringUtil::toDoubleVector(input->getValue<std::string>("v0_SW"));
+    std::vector<double> ux               = StringUtil::toDoubleVector(input->getValue<std::string>("u0_SW"));
+    int l0                               = StringUtil::toInt(input->getValue<std::string>("l0_SW"));
     basicSimParameter->l0                = l0;
 
     std::vector<std::shared_ptr<ShearWaveParameterStruct>> parameter;
@@ -198,82 +195,82 @@ ConfigFileReader::makeShearWaveParameter(std::shared_ptr<input::Input> input,
         aParameter->ux                       = ux.at(i);
         aParameter->basicTimeStepLength      = basisTimeStepLength.at(i);
         aParameter->l0                       = l0;
-        aParameter->rho0                     = StringUtil::toDouble(input->getValue("Rho0"));
-        aParameter->vtkFilePath              = pathNumericalTests + input->getValue("FolderForVTKFileWriting");
-        aParameter->dataToCalcTests          = StringUtil::toStringVector(input->getValue("DataToCalcTests_SW"));
+        aParameter->rho0                     = StringUtil::toDouble(input->getValue<std::string>("Rho0"));
+        aParameter->vtkFilePath              = pathNumericalTests + input->getValue<std::string>("FolderForVTKFileWriting");
+        aParameter->dataToCalcTests          = StringUtil::toStringVector(input->getValue<std::string>("DataToCalcTests_SW"));
         parameter.push_back(aParameter);
     }
     return parameter;
 }
 
-std::shared_ptr<NyTestParameterStruct> ConfigFileReader::makeNyTestParameter(std::shared_ptr<input::Input> input)
+std::shared_ptr<NyTestParameterStruct> ConfigFileReader::makeNyTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
-    basicTestParameter->runTest              = StringUtil::toBool(input->getValue("NyTest"));
-    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue("ySliceForCalculation"));
+    basicTestParameter->runTest              = StringUtil::toBool(input->getValue<std::string>("NyTest"));
+    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
 
     std::shared_ptr<NyTestParameterStruct> testParameter =
         std::shared_ptr<NyTestParameterStruct>(new NyTestParameterStruct);
     testParameter->basicTestParameter       = basicTestParameter;
-    testParameter->endTimeStepCalculation   = StringUtil::toInt(input->getValue("EndTimeStepCalculation_Ny"));
-    testParameter->minOrderOfAccuracy       = StringUtil::toDouble(input->getValue("MinOrderOfAccuracy_Ny"));
-    testParameter->startTimeStepCalculation = StringUtil::toInt(input->getValue("StartTimeStepCalculation_Ny"));
+    testParameter->endTimeStepCalculation   = StringUtil::toInt(input->getValue<std::string>("EndTimeStepCalculation_Ny"));
+    testParameter->minOrderOfAccuracy       = StringUtil::toDouble(input->getValue<std::string>("MinOrderOfAccuracy_Ny"));
+    testParameter->startTimeStepCalculation = StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Ny"));
 
     return testParameter;
 }
 
-std::shared_ptr<PhiTestParameterStruct> ConfigFileReader::makePhiTestParameter(std::shared_ptr<input::Input> input)
+std::shared_ptr<PhiTestParameterStruct> ConfigFileReader::makePhiTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
-    basicTestParameter->runTest              = StringUtil::toBool(input->getValue("PhiTest"));
-    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue("ySliceForCalculation"));
+    basicTestParameter->runTest              = StringUtil::toBool(input->getValue<std::string>("PhiTest"));
+    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
 
     std::shared_ptr<PhiTestParameterStruct> testParameter =
         std::shared_ptr<PhiTestParameterStruct>(new PhiTestParameterStruct);
     testParameter->basicTestParameter       = basicTestParameter;
-    testParameter->endTimeStepCalculation   = StringUtil::toInt(input->getValue("EndTimeStepCalculation_Phi"));
-    testParameter->minOrderOfAccuracy       = StringUtil::toDouble(input->getValue("MinOrderOfAccuracy_Phi"));
-    testParameter->startTimeStepCalculation = StringUtil::toInt(input->getValue("StartTimeStepCalculation_Phi"));
+    testParameter->endTimeStepCalculation   = StringUtil::toInt(input->getValue<std::string>("EndTimeStepCalculation_Phi"));
+    testParameter->minOrderOfAccuracy       = StringUtil::toDouble(input->getValue<std::string>("MinOrderOfAccuracy_Phi"));
+    testParameter->startTimeStepCalculation = StringUtil::toInt(input->getValue<std::string>("StartTimeStepCalculation_Phi"));
 
     return testParameter;
 }
 
 std::shared_ptr<L2NormTestParameterStruct>
-ConfigFileReader::makeL2NormTestParameter(std::shared_ptr<input::Input> input)
+ConfigFileReader::makeL2NormTestParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
-    basicTestParameter->runTest              = StringUtil::toBool(input->getValue("L2NormTest"));
-    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue("ySliceForCalculation"));
+    basicTestParameter->runTest              = StringUtil::toBool(input->getValue<std::string>("L2NormTest"));
+    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
 
     std::shared_ptr<L2NormTestParameterStruct> testParameter =
         std::shared_ptr<L2NormTestParameterStruct>(new L2NormTestParameterStruct);
     testParameter->basicTestParameter = basicTestParameter;
-    testParameter->basicTimeStep      = StringUtil::toInt(input->getValue("BasicTimeStep_L2"));
-    testParameter->divergentTimeStep  = StringUtil::toInt(input->getValue("DivergentTimeStep_L2"));
-    testParameter->normalizeData      = StringUtil::toStringVector(input->getValue("NormalizeData_L2Norm"));
-    testParameter->maxDiff            = StringUtil::toDoubleVector(input->getValue("MaxL2NormDiff"));
+    testParameter->basicTimeStep      = StringUtil::toInt(input->getValue<std::string>("BasicTimeStep_L2"));
+    testParameter->divergentTimeStep  = StringUtil::toInt(input->getValue<std::string>("DivergentTimeStep_L2"));
+    testParameter->normalizeData      = StringUtil::toStringVector(input->getValue<std::string>("NormalizeData_L2Norm"));
+    testParameter->maxDiff            = StringUtil::toDoubleVector(input->getValue<std::string>("MaxL2NormDiff"));
 
     return testParameter;
 }
 
 std::shared_ptr<L2NormTestBetweenKernelsParameterStruct>
-ConfigFileReader::makeL2NormTestBetweenKernelsParameter(std::shared_ptr<input::Input> input)
+ConfigFileReader::makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<BasicTestParameterStruct> basicTestParameter =
         std::shared_ptr<BasicTestParameterStruct>(new BasicTestParameterStruct);
-    basicTestParameter->runTest              = StringUtil::toBool(input->getValue("L2NormBetweenKernelsTest"));
-    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue("ySliceForCalculation"));
+    basicTestParameter->runTest              = StringUtil::toBool(input->getValue<std::string>("L2NormBetweenKernelsTest"));
+    basicTestParameter->ySliceForCalculation = StringUtil::toInt(input->getValue<std::string>("ySliceForCalculation"));
 
     std::shared_ptr<L2NormTestBetweenKernelsParameterStruct> testParameter =
         std::shared_ptr<L2NormTestBetweenKernelsParameterStruct>(new L2NormTestBetweenKernelsParameterStruct);
     testParameter->basicTestParameter = basicTestParameter;
-    testParameter->basicKernel        = input->getValue("BasicKernel_L2NormBetweenKernels");
+    testParameter->basicKernel        = input->getValue<std::string>("BasicKernel_L2NormBetweenKernels");
     testParameter->kernelsToTest      = readKernelList(input);
-    testParameter->timeSteps          = StringUtil::toIntVector(input->getValue("Timesteps_L2NormBetweenKernels"));
-    testParameter->normalizeData      = StringUtil::toStringVector(input->getValue("NormalizeData_L2Norm"));
+    testParameter->timeSteps          = StringUtil::toIntVector(input->getValue<std::string>("Timesteps_L2NormBetweenKernels"));
+    testParameter->normalizeData      = StringUtil::toStringVector(input->getValue<std::string>("NormalizeData_L2Norm"));
 
     bool correct = false;
     for (int i = 0; i < testParameter->normalizeData.size(); i++)
@@ -292,7 +289,7 @@ ConfigFileReader::makeL2NormTestBetweenKernelsParameter(std::shared_ptr<input::I
 }
 
 std::vector<std::shared_ptr<GridInformationStruct>>
-ConfigFileReader::makeGridInformation(std::shared_ptr<input::Input> input, std::string simName)
+ConfigFileReader::makeGridInformation(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName)
 {
     int number = 32;
     std::vector<std::string> valueNames;
@@ -314,10 +311,10 @@ ConfigFileReader::makeGridInformation(std::shared_ptr<input::Input> input, std::
     double nextNumber = 32.0;
 
     for (int i = 0; i < valueNames.size(); i++) {
-        if (StringUtil::toBool(input->getValue(valueNames.at(i)))) {
+        if (StringUtil::toBool(input->getValue<std::string>(valueNames.at(i)))) {
             lx.push_back(nextNumber);
             lz.push_back(nextNumber * 3.0 / 2.0);
-            gridPath.push_back(pathNumericalTests + input->getValue(gridPaths.at(i)));
+            gridPath.push_back(pathNumericalTests + input->getValue<std::string>(gridPaths.at(i)));
             nextNumber *= 2;
         }
     }
@@ -326,7 +323,7 @@ ConfigFileReader::makeGridInformation(std::shared_ptr<input::Input> input, std::
     for (int i = 0; i < lx.size(); i++) {
         std::shared_ptr<GridInformationStruct> aGridInformation =
             std::shared_ptr<GridInformationStruct>(new GridInformationStruct);
-        aGridInformation->numberOfGridLevels = StringUtil::toInt(input->getValue("NumberOfGridLevels"));
+        aGridInformation->numberOfGridLevels = StringUtil::toInt(input->getValue<std::string>("NumberOfGridLevels"));
         aGridInformation->maxLevel           = aGridInformation->numberOfGridLevels - 1;
         aGridInformation->gridPath           = gridPath.at(i);
         aGridInformation->lx                 = lx.at(i);
@@ -337,44 +334,44 @@ ConfigFileReader::makeGridInformation(std::shared_ptr<input::Input> input, std::
 }
 
 std::shared_ptr<VectorWriterInformationStruct>
-ConfigFileReader::makeVectorWriterInformationStruct(std::shared_ptr<input::Input> input)
+ConfigFileReader::makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<VectorWriterInformationStruct> vectorWriter =
         std::shared_ptr<VectorWriterInformationStruct>(new VectorWriterInformationStruct);
     vectorWriter->startTimeVectorWriter  = calcStartStepForToVectorWriter(input);
-    vectorWriter->startTimeVTKDataWriter = StringUtil::toInt(input->getValue("StartStepFileWriter"));
-    vectorWriter->writeVTKFiles          = StringUtil::toBool(input->getValue("WriteVTKFiles"));
+    vectorWriter->startTimeVTKDataWriter = StringUtil::toInt(input->getValue<std::string>("StartStepFileWriter"));
+    vectorWriter->writeVTKFiles          = StringUtil::toBool(input->getValue<std::string>("WriteVTKFiles"));
 
     return vectorWriter;
 }
 
-std::shared_ptr<LogFileParameterStruct> ConfigFileReader::makeLogFilePara(std::shared_ptr<input::Input> input)
+std::shared_ptr<LogFileParameterStruct> ConfigFileReader::makeLogFilePara(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::shared_ptr<LogFileParameterStruct> logFilePara =
         std::shared_ptr<LogFileParameterStruct>(new LogFileParameterStruct);
-    logFilePara->devices              = StringUtil::toIntVector(input->getValue("Devices"));
-    logFilePara->numberOfTimeSteps    = StringUtil::toInt(input->getValue("NumberOfTimeSteps"));
-    logFilePara->writeAnalyticalToVTK = StringUtil::toBool(input->getValue("WriteAnalyResultsToVTK"));
+    logFilePara->devices              = StringUtil::toIntVector(input->getValue<std::string>("Devices"));
+    logFilePara->numberOfTimeSteps    = StringUtil::toInt(input->getValue<std::string>("NumberOfTimeSteps"));
+    logFilePara->writeAnalyticalToVTK = StringUtil::toBool(input->getValue<std::string>("WriteAnalyResultsToVTK"));
 
     return logFilePara;
 }
 
-std::vector<std::string> ConfigFileReader::readKernelList(std::shared_ptr<input::Input> input)
+std::vector<std::string> ConfigFileReader::readKernelList(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
-    if (StringUtil::toBool(input->getValue("L2NormBetweenKernelsTest"))) {
-        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue("KernelsToTest"));
-        std::string beginnKernel            = input->getValue("BasicKernel_L2NormBetweenKernels");
+    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) == beginnKernel)
+            if (kernelList.at(i) == beginKernel)
                 basicKernelInKernelList = true;
         }
         if (!basicKernelInKernelList)
-            kernelList.push_back(beginnKernel);
+            kernelList.push_back(beginKernel);
 
         std::vector<std::string> kernelNames = kernelList;
 
-        while (kernelNames.at(0) != beginnKernel) {
+        while (kernelNames.at(0) != beginKernel) {
             kernelNames.push_back(kernelNames.at(0));
             std::vector<std::string>::iterator it = kernelNames.begin();
             kernelNames.erase(it);
@@ -384,7 +381,7 @@ std::vector<std::string> ConfigFileReader::readKernelList(std::shared_ptr<input:
             kernels.push_back(kernelNames.at(i));
         return kernels;
     } else {
-        std::vector<std::string> kernelList = StringUtil::toStringVector(input->getValue("KernelsToTest"));
+        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));
@@ -393,42 +390,42 @@ std::vector<std::string> ConfigFileReader::readKernelList(std::shared_ptr<input:
     }
 }
 
-unsigned int ConfigFileReader::calcStartStepForToVectorWriter(std::shared_ptr<input::Input> input)
+unsigned int ConfigFileReader::calcStartStepForToVectorWriter(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     std::vector<unsigned int> startStepsTests;
-    startStepsTests.push_back(StringUtil::toInt(input->getValue("BasicTimeStep_L2")));
-    startStepsTests.push_back(StringUtil::toInt(input->getValue("StartTimeStepCalculation_Ny")));
-    startStepsTests.push_back(StringUtil::toInt(input->getValue("StartTimeStepCalculation_Phi")));
+    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<input::Input> input)
+int ConfigFileReader::calcNumberOfSimulations(std::shared_ptr<vf::basics::ConfigurationFile> input)
 {
     int counter = 0;
 
     int tgvCounterU0 = calcNumberOfSimulationGroup(input, "TaylorGreenVortexUx");
-    tgvCounterU0 *= int(StringUtil::toDoubleVector(input->getValue("ux_TGV_Ux")).size());
+    tgvCounterU0 *= int(StringUtil::toDoubleVector(input->getValue<std::string>("ux_TGV_Ux")).size());
     counter += tgvCounterU0;
 
     int tgvCounterV0 = calcNumberOfSimulationGroup(input, "TaylorGreenVortexUz");
     ;
-    tgvCounterV0 *= int(StringUtil::toDoubleVector(input->getValue("uz_TGV_Uz")).size());
+    tgvCounterV0 *= int(StringUtil::toDoubleVector(input->getValue<std::string>("uz_TGV_Uz")).size());
     counter += tgvCounterV0;
 
     int swCounter = calcNumberOfSimulationGroup(input, "ShearWave");
     ;
-    swCounter *= int(StringUtil::toDoubleVector(input->getValue("u0_SW")).size());
+    swCounter *= int(StringUtil::toDoubleVector(input->getValue<std::string>("u0_SW")).size());
     counter += swCounter;
 
-    counter *= int(StringUtil::toDoubleVector(input->getValue("Viscosity")).size());
+    counter *= int(StringUtil::toDoubleVector(input->getValue<std::string>("Viscosity")).size());
     counter *= int(configData->kernelsToTest.size());
 
     return counter;
 }
 
-int ConfigFileReader::calcNumberOfSimulationGroup(std::shared_ptr<input::Input> input, std::string simName)
+int ConfigFileReader::calcNumberOfSimulationGroup(std::shared_ptr<vf::basics::ConfigurationFile> input, std::string simName)
 {
     int counter = 0;
     int number  = 32;
@@ -440,7 +437,7 @@ int ConfigFileReader::calcNumberOfSimulationGroup(std::shared_ptr<input::Input>
         number *= 2;
     }
     for (int i = 0; i < valueNames.size(); i++) {
-        if (StringUtil::toBool(input->getValue(valueNames.at(i))))
+        if (StringUtil::toBool(input->getValue<std::string>(valueNames.at(i))))
             counter++;
     }
     return counter;
diff --git a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
index 92f58890bcd61fd47ff27160c62a708d3967f74f..ae48c727b7f74a97a95624a576b713bf8cc11a09 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
+++ b/apps/gpu/tests/NumericalTests/Utilities/ConfigFileReaderNT/ConfigFileReaderNT.h
@@ -1,13 +1,18 @@
 #ifndef CONFIG_FILE_READER_H
 #define CONFIG_FILE_READER_H
 
-#include "Core/Input/Input.h"
+// #include "Core/Input/Input.h"
 #include "Utilities/Structs/ConfigDataStruct.h"
 
 #include <memory>
 #include <string>
 #include <vector>
 
+namespace vf::basics 
+{
+class ConfigurationFile;
+}
+
 class ConfigFileReader
 {
 public:
@@ -20,36 +25,36 @@ private:
     ConfigFileReader(const std::string aFilePath);
 
     std::ifstream openConfigFile(const std::string aFilePath);
-    bool checkConfigFile(std::shared_ptr<input::Input> input);
-    std::vector<std::string> readKernelList(std::shared_ptr<input::Input> input);
+    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<input::Input> input);
-    int calcNumberOfSimulationGroup(std::shared_ptr<input::Input> input, std::string simName);
-    unsigned int calcStartStepForToVectorWriter(std::shared_ptr<input::Input> 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<input::Input> input,
+    makeTaylorGreenVortexUxParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                                      std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
     std::vector<std::shared_ptr<TaylorGreenVortexUzParameterStruct>>
-    makeTaylorGreenVortexUzParameter(std::shared_ptr<input::Input> input,
+    makeTaylorGreenVortexUzParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                                      std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
     std::vector<std::shared_ptr<ShearWaveParameterStruct>>
-    makeShearWaveParameter(std::shared_ptr<input::Input> input,
+    makeShearWaveParameter(std::shared_ptr<vf::basics::ConfigurationFile> input,
                            std::shared_ptr<BasicSimulationParameterStruct> basicSimParameter);
 
-    std::shared_ptr<NyTestParameterStruct> makeNyTestParameter(std::shared_ptr<input::Input> input);
-    std::shared_ptr<PhiTestParameterStruct> makePhiTestParameter(std::shared_ptr<input::Input> input);
-    std::shared_ptr<L2NormTestParameterStruct> makeL2NormTestParameter(std::shared_ptr<input::Input> input);
+    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<input::Input> input);
+    makeL2NormTestBetweenKernelsParameter(std::shared_ptr<vf::basics::ConfigurationFile> input);
 
-    std::shared_ptr<BasicSimulationParameterStruct> makeBasicSimulationParameter(std::shared_ptr<input::Input> input);
-    std::vector<std::shared_ptr<GridInformationStruct>> makeGridInformation(std::shared_ptr<input::Input> 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<input::Input> input);
-    std::shared_ptr<LogFileParameterStruct> makeLogFilePara(std::shared_ptr<input::Input> input);
+    makeVectorWriterInformationStruct(std::shared_ptr<vf::basics::ConfigurationFile> input);
+    std::shared_ptr<LogFileParameterStruct> makeLogFilePara(std::shared_ptr<vf::basics::ConfigurationFile> input);
 
     std::string pathNumericalTests;
 
diff --git a/apps/gpu/tests/NumericalTests/Utilities/DataWriter/AnalyticalResults2DToVTKWriter/AnalyticalResults2DToVTKWriterImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/DataWriter/AnalyticalResults2DToVTKWriter/AnalyticalResults2DToVTKWriterImp.cpp
index a53f552702c50aed8640ac1ef47ed69b3d2f1d50..9ec59eba80b265fbf5a5c679d2c53a5928c8a6bb 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/DataWriter/AnalyticalResults2DToVTKWriter/AnalyticalResults2DToVTKWriterImp.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/DataWriter/AnalyticalResults2DToVTKWriter/AnalyticalResults2DToVTKWriterImp.cpp
@@ -38,7 +38,7 @@ void AnalyticalResults2DToVTKWriterImp::writeAnalyticalResult(std::shared_ptr<Pa
 		for (int level = para->getCoarse(); level <= para->getFine(); level++) {
 #pragma omp parallel for
 			for (int timeStep = 0; timeStep < analyticalResult->getNumberOfTimeSteps(); timeStep++) {
-				const unsigned int numberOfParts = para->getParH(level)->size_Mat_SP / para->getlimitOfNodesForVTK() + 1;
+				const unsigned int numberOfParts = para->getParH(level)->size_Mat / para->getlimitOfNodesForVTK() + 1;
 				std::vector<std::string> fname;
 				unsigned int time = analyticalResult->getTimeSteps().at(timeStep)*analyticalResult->getTimeStepLength();
 				for (int j = 1; j <= numberOfParts; j++) {
@@ -86,8 +86,8 @@ void AnalyticalResults2DToVTKWriterImp::writeTimeStep(std::shared_ptr<Parameter>
 	std::vector<double> vz = analyticalResult->getVz()[timeStep];
 
     for (unsigned int part = 0; part < fname.size(); part++){
-        if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->size_Mat_SP)
-            sizeOfNodes = para->getParH(level)->size_Mat_SP - (part * para->getlimitOfNodesForVTK());
+        if (((part + 1)*para->getlimitOfNodesForVTK()) > para->getParH(level)->size_Mat)
+            sizeOfNodes = para->getParH(level)->size_Mat - (part * para->getlimitOfNodesForVTK());
         else
             sizeOfNodes = para->getlimitOfNodesForVTK();
 
@@ -106,12 +106,12 @@ void AnalyticalResults2DToVTKWriterImp::writeTimeStep(std::shared_ptr<Parameter>
         //////////////////////////////////////////////////////////////////////////
         for (unsigned int pos = startpos; pos < endpos; pos++)
         {
-            if (para->getParH(level)->geoSP[pos] == GEO_FLUID)
+            if (para->getParH(level)->geo[pos] == GEO_FLUID)
             {
                 //////////////////////////////////////////////////////////////////////////
-                double x1 = para->getParH(level)->coordX_SP[pos];
-                double x2 = para->getParH(level)->coordY_SP[pos];
-                double x3 = para->getParH(level)->coordZ_SP[pos];
+                double x1 = para->getParH(level)->coordinateX[pos];
+                double x2 = para->getParH(level)->coordinateY[pos];
+                double x3 = para->getParH(level)->coordinateZ[pos];
                 //////////////////////////////////////////////////////////////////////////
                 number1 = pos;
                 dn1 = pos - startpos;
@@ -125,23 +125,23 @@ void AnalyticalResults2DToVTKWriterImp::writeTimeStep(std::shared_ptr<Parameter>
                 nodedata[2][dn1] = vx[numberInResults];
                 nodedata[3][dn1] = vy[numberInResults];
                 nodedata[4][dn1] = vz[numberInResults];
-                nodedata[5][dn1] = (double)para->getParH(level)->geoSP[pos];
+                nodedata[5][dn1] = (double)para->getParH(level)->geo[pos];
                 //////////////////////////////////////////////////////////////////////////
-                number2 = para->getParH(level)->neighborX_SP[number1];
-                number3 = para->getParH(level)->neighborY_SP[number2];
-                number4 = para->getParH(level)->neighborY_SP[number1];
-                number5 = para->getParH(level)->neighborZ_SP[number1];
-                number6 = para->getParH(level)->neighborZ_SP[number2];
-                number7 = para->getParH(level)->neighborZ_SP[number3];
-                number8 = para->getParH(level)->neighborZ_SP[number4];
+                number2 = para->getParH(level)->neighborX[number1];
+                number3 = para->getParH(level)->neighborY[number2];
+                number4 = para->getParH(level)->neighborY[number1];
+                number5 = para->getParH(level)->neighborZ[number1];
+                number6 = para->getParH(level)->neighborZ[number2];
+                number7 = para->getParH(level)->neighborZ[number3];
+                number8 = para->getParH(level)->neighborZ[number4];
                 //////////////////////////////////////////////////////////////////////////
-                if (para->getParH(level)->geoSP[number2] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number3] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number4] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number5] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number6] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number7] != GEO_FLUID ||
-                    para->getParH(level)->geoSP[number8] != GEO_FLUID)  neighborsAreFluid = false;
+                if (para->getParH(level)->geo[number2] != GEO_FLUID ||
+                    para->getParH(level)->geo[number3] != GEO_FLUID ||
+                    para->getParH(level)->geo[number4] != GEO_FLUID ||
+                    para->getParH(level)->geo[number5] != GEO_FLUID ||
+                    para->getParH(level)->geo[number6] != GEO_FLUID ||
+                    para->getParH(level)->geo[number7] != GEO_FLUID ||
+                    para->getParH(level)->geo[number8] != GEO_FLUID)  neighborsAreFluid = false;
                 //////////////////////////////////////////////////////////////////////////
                 if (number2 > endpos ||
                     number3 > endpos ||
diff --git a/apps/gpu/tests/NumericalTests/Utilities/DataWriter/Y2dSliceToResults/Y2dSliceToResults.cpp b/apps/gpu/tests/NumericalTests/Utilities/DataWriter/Y2dSliceToResults/Y2dSliceToResults.cpp
index d507d92b6a790c06981852251db087039062759e..b7a562bb5782367f963c81aa7dc6d3bde3557d4b 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/DataWriter/Y2dSliceToResults/Y2dSliceToResults.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/DataWriter/Y2dSliceToResults/Y2dSliceToResults.cpp
@@ -41,14 +41,14 @@ void Y2dSliceToResults::writeTimestep(std::shared_ptr<Parameter> para, unsigned
 			int posResults = CoordResults2DTo1D(posX, posZ);
 			int posPara = CoordPara3DTo1D(posX, ySliceForCalculation, posZ);
 
-			x.at(posResults) = (double)para->getParH(level)->coordX_SP[posPara] - (double)1.0;
-			y.at(posResults) = (double)para->getParH(level)->coordY_SP[posPara] - (double)1.0;
-			z.at(posResults) = (double)para->getParH(level)->coordZ_SP[posPara] - (double)1.0;
-			vx.at(posResults) = (double)para->getParH(level)->vx_SP[posPara] * (double)para->getVelocityRatio();
-			vy.at(posResults) = (double)para->getParH(level)->vy_SP[posPara] * (double)para->getVelocityRatio();
-			vz.at(posResults) = (double)para->getParH(level)->vz_SP[posPara] * (double)para->getVelocityRatio();
-			press.at(posResults) = (double)para->getParH(level)->press_SP[posPara] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
-			rho.at(posResults) = (double)para->getParH(level)->rho_SP[posPara] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
+			x.at(posResults) = (double)para->getParH(level)->coordinateX[posPara] - (double)1.0;
+			y.at(posResults) = (double)para->getParH(level)->coordinateY[posPara] - (double)1.0;
+			z.at(posResults) = (double)para->getParH(level)->coordinateZ[posPara] - (double)1.0;
+			vx.at(posResults) = (double)para->getParH(level)->velocityX[posPara] * (double)para->getVelocityRatio();
+			vy.at(posResults) = (double)para->getParH(level)->velocityY[posPara] * (double)para->getVelocityRatio();
+			vz.at(posResults) = (double)para->getParH(level)->velocityZ[posPara] * (double)para->getVelocityRatio();
+			press.at(posResults) = (double)para->getParH(level)->pressure[posPara] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
+			rho.at(posResults) = (double)para->getParH(level)->rho[posPara] / (double)3.0 * (double)para->getDensityRatio() * (double)para->getVelocityRatio() * (double)para->getVelocityRatio();
 			levels.at(posResults) = level;
 		}
 	}
diff --git a/apps/gpu/tests/NumericalTests/Utilities/InitialCondition/InitialConditionImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/InitialCondition/InitialConditionImp.cpp
index c31f8cbea82441eb41d2e39e96e502504d5fa5dd..f9046ffd028b8db6813fad71466a45ee7b367558 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/InitialCondition/InitialConditionImp.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/InitialCondition/InitialConditionImp.cpp
@@ -16,15 +16,18 @@ void InitialConditionImp::init(const int level)
 
 real InitialConditionImp::getXCoord(int i, int level)
 {
-	return (real)(para->getParH(level)->coordX_SP[i] - 1.0);
+	return para->getParH(level)->coordinateX[i] - 1.0;
+	// return (real)(para->getParH(level)->coordX_SP[i] - 1.0);
 }
 
 real InitialConditionImp::getYCoord(int i, int level)
 {
-	return (real)(para->getParH(level)->coordY_SP[i] - 1.0);
+	return para->getParH(level)->coordinateY[i] - 1.0;
+	// return (real)(para->getParH(level)->coordY_SP[i] - 1.0);
 }
 
 real InitialConditionImp::getZCoord(int i, int level)
 {
-	return (real)(para->getParH(level)->coordZ_SP[i] - 1.0);
+	return para->getParH(level)->coordinateZ[i] - 1.0;
+	// return (real)(para->getParH(level)->coordZ_SP[i] - 1.0);
 }
\ No newline at end of file
diff --git a/apps/gpu/tests/NumericalTests/Utilities/NumericalTestGridReader/NumericalTestGridReader.cpp b/apps/gpu/tests/NumericalTests/Utilities/NumericalTestGridReader/NumericalTestGridReader.cpp
index c7d9fa5b84ab077d60eab3213097c2da1d5b4dad..97ccf92dc72e253d5f38f88353ba564320e8fd65 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/NumericalTestGridReader/NumericalTestGridReader.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/NumericalTestGridReader/NumericalTestGridReader.cpp
@@ -17,11 +17,11 @@ void NumericalTestGridReader::setInitalNodeValues(const int numberOfNodes, const
 {
 	initialCondition->init(level);
 	for (int j = 0; j <= numberOfNodes; j++){
-		para->getParH(level)->vx_SP[j] = initialCondition->getInitVX(j, level);
-		para->getParH(level)->vy_SP[j] = initialCondition->getInitVY(j, level);
-		para->getParH(level)->vz_SP[j] = initialCondition->getInitVZ(j, level);
-		para->getParH(level)->rho_SP[j] = initialCondition->getInitROH(j, level);
-		para->getParH(level)->press_SP[j] = initialCondition->getInitPRESS(j, level);
+		para->getParH(level)->velocityX[j] = initialCondition->getInitVX(j, level);
+		para->getParH(level)->velocityY[j] = initialCondition->getInitVY(j, level);
+		para->getParH(level)->velocityZ[j] = initialCondition->getInitVZ(j, level);
+		para->getParH(level)->rho[j] = initialCondition->getInitROH(j, level);
+		para->getParH(level)->pressure[j] = initialCondition->getInitPRESS(j, level);
 	}
 }
 
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp
index 35b0369f966fe11dce8581f609a10078180a20bb..bf6c326ee9928c1bef171958b0cac928f9f08b2b 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulation/VirtualFluidSimulationImp.cpp
@@ -4,23 +4,26 @@
 #include "Utilities/Time/TimeTracking.h"
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
+#include "VirtualFluids_GPU/Communication/Communicator.h"
+#include "VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h"
+#include "VirtualFluids_GPU/Kernel/Utilities/KernelFactory/KernelFactory.h"
 
 #include <sstream>
 
 void VirtualFluidSimulationImp::run()
 {
 	numericalTestSuite->makeSimulationHeadOutput();
-	Simulation sim;
-	sim.setFactories(kernelFactory, preProcessorFactory);
-	sim.init(para, grid, dataWriter, cudaManager);
+	auto sim = Simulation(para, cudaManager, vf::gpu::Communicator::getInstance(), *grid.get(), new BoundaryConditionFactory());
+
+ 	// These are created by the Simulation itself
+	// sim.setFactories(kernelFactory, preProcessorFactory);
+	// sim.init(para, grid, dataWriter, cudaManager);
 
 	timeTracking->setSimulationStartTime();
 	sim.run();
 	timeTracking->setSimulationEndTime();
 
 	numericalTestSuite->startPostProcessing();
-
-	sim.free();
 }
 
 void VirtualFluidSimulationImp::setParameter(std::shared_ptr<Parameter> para)
diff --git a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp
index 1bf9a6a224937569b52739fd4619560aafd0f12d..d51261a81d9d03b61b1fccf671616847ebe4114a 100644
--- a/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp
+++ b/apps/gpu/tests/NumericalTests/Utilities/VirtualFluidSimulationFactory/VirtualFluidSimulationFactoryImp.cpp
@@ -24,11 +24,10 @@ VirtualFluidSimulationFactoryImp::VirtualFluidSimulationFactoryImp()
 
 std::shared_ptr<Parameter> VirtualFluidSimulationFactoryImp::makeParameter(std::shared_ptr<SimulationParameter> simPara)
 {
-	std::shared_ptr<Parameter> para = Parameter::make();
+	auto para = std::make_shared<Parameter>(1, 0);
 
 	para->setMaxDev(simPara->getDevices().size());
 	para->setDevices(simPara->getDevices());
-	para->setNumprocs(1);
 
 	std::string _prefix = "cells";
 	std::string gridPath = simPara->getGridPath() + "/";
@@ -102,7 +101,8 @@ std::shared_ptr<Parameter> VirtualFluidSimulationFactoryImp::makeParameter(std::
 	para->setDistY(dist);
 	para->setDistZ(dist);
 
-	para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
+	// 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());
@@ -114,14 +114,12 @@ std::shared_ptr<Parameter> VirtualFluidSimulationFactoryImp::makeParameter(std::
 
 std::shared_ptr<NumericalTestGridReader> VirtualFluidSimulationFactoryImp::makeGridReader(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaManager)
 {
-	std::shared_ptr<NumericalTestGridReader> grid = NumericalTestGridReader::getNewInstance(para, initialCondition, cudaManager);
-	return grid;
+	return NumericalTestGridReader::getNewInstance(para, initialCondition, cudaManager);
 }
 
 std::shared_ptr<CudaMemoryManager> VirtualFluidSimulationFactoryImp::makeCudaMemoryManager(std::shared_ptr<Parameter> para)
 {
-	std::shared_ptr<CudaMemoryManager> cudaManager = CudaMemoryManager::make(para);
-	return cudaManager;
+	return std::make_shared<CudaMemoryManager>(para);
 }
 
 void VirtualFluidSimulationFactoryImp::initInitialConditions(std::shared_ptr<InitialCondition> initialCondition, std::shared_ptr<Parameter> para)
@@ -133,10 +131,10 @@ std::vector<std::shared_ptr<VirtualFluidSimulation> > VirtualFluidSimulationFact
 {
 	std::vector<std::shared_ptr<VirtualFluidSimulation> > vfSimulations;
 
-	std::shared_ptr<KernelFactoryImp> kernelFactory = KernelFactoryImp::getInstance();
-	std::shared_ptr<PreProcessorFactoryImp> preProcessorFactory = PreProcessorFactoryImp::getInstance();
+	auto kernelFactory = std::make_shared<KernelFactoryImp>();
+	auto preProcessorFactory = std::make_shared<PreProcessorFactoryImp>();
 
-	for (int i = 0; i < testSim.size(); i++) {
+	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());