diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.cpp b/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c8f5b363ac2eed06c38bc69fcf81f4d70fc2879e
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.cpp
@@ -0,0 +1,173 @@
+#include "L2NormMathematicaAssistant.h"
+
+#include "Tests/L2Norm/LogFileData/L2NormLogFileData.h"
+#include "Utilities/LogFileData/LogFileData.h"
+#include "Utilities/LogFileData/LogFileDataGroup/LogFileDataGroup.h"
+
+#include <sstream> 
+
+
+std::shared_ptr<L2NormMathematicaAssistant> L2NormMathematicaAssistant::getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory)
+{
+	return std::shared_ptr<L2NormMathematicaAssistant>(new L2NormMathematicaAssistant(functionFactory));
+}
+
+void L2NormMathematicaAssistant::makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	std::shared_ptr<SortedDataL2Norm> mySortedData = sortLogFileData(logFileData);
+
+	makeL2NormDiffMathematicaOutput(aMathmaticaFile, mySortedData);
+	makeL2NormBasicTimeStepMathematicaOutput(aMathmaticaFile, mySortedData);
+	makeL2NormDivergentTimeStepMathematicaOutput(aMathmaticaFile, mySortedData);
+}
+
+L2NormMathematicaAssistant::L2NormMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : MathematicaAssistantImp(functionFactory)
+{
+}
+
+bool L2NormMathematicaAssistant::checkTestParameter(std::shared_ptr<L2NormLogFileData> logFileData1, std::shared_ptr<L2NormLogFileData> logFileData2)
+{
+	if (logFileData1->getDataToCalc() != logFileData2->getDataToCalc())
+		return false;
+	if (logFileData1->getNormalizeData() != logFileData2->getNormalizeData())
+		return false;
+	if (logFileData1->getBasicTimeStep() != logFileData2->getBasicTimeStep())
+		return false;
+	if (logFileData1->getDivergentTimeStep() != logFileData2->getDivergentTimeStep())
+		return false;
+
+
+	return true;
+}
+
+std::shared_ptr<SortedDataL2Norm> L2NormMathematicaAssistant::sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData)
+{
+	std::vector<std::vector<std::shared_ptr<L2NormLogFileData> > > testLogFileData;
+	std::vector<std::vector<std::string> > basicListNames;
+	for (int i = 0; i < logFileData->getLogFileData(0)->getL2NormLogFileData().size(); i++) {
+		std::vector<std::shared_ptr<L2NormLogFileData> > aTestLogFileDataGroup;
+		aTestLogFileDataGroup.push_back(logFileData->getLogFileData(0)->getL2NormLogFileData().at(i));
+		std::vector<std::string> aListNameGroup;
+		aListNameGroup.push_back(logFileData->getLogFileData(0)->getSimulationSigniture());
+		basicListNames.push_back(aListNameGroup);
+	}
+	for (int i = 0; i < logFileData->getGroupSize(); i++) {
+		for (int j = 0; j < logFileData->getLogFileData(i)->getL2NormLogFileData().size(); j++) {
+			std::string dataToCalc = logFileData->getLogFileData(i)->getL2NormLogFileData().at(j)->getDataToCalc();
+			bool added = false;
+			for (int k = 0; k < testLogFileData.size(); k++) {
+				if (checkTestParameter(logFileData->getLogFileData(i)->getL2NormLogFileData().at(j), testLogFileData.at(k).at(0))) {
+					testLogFileData.at(k).push_back(logFileData->getLogFileData(i)->getL2NormLogFileData().at(j));
+					basicListNames.at(k).push_back(logFileData->getLogFileData(i)->getSimulationSigniture());
+					added = true;
+				}
+			}
+			if (!added) {
+				std::vector<std::shared_ptr<L2NormLogFileData> > aTestLogFileDataGroup;
+				aTestLogFileDataGroup.push_back(logFileData->getLogFileData(i)->getL2NormLogFileData().at(j));
+				testLogFileData.push_back(aTestLogFileDataGroup);
+				std::vector<std::string> aListNameGroup;
+				aListNameGroup.push_back(logFileData->getLogFileData(i)->getSimulationSigniture());
+				basicListNames.push_back(aListNameGroup);
+			}
+		}
+	}
+	std::shared_ptr<SortedDataL2Norm> mySortedData = std::shared_ptr<SortedDataL2Norm>(new SortedDataL2Norm);
+	mySortedData->basicListNames = basicListNames;
+	mySortedData->testLogFileData = testLogFileData;
+
+	return mySortedData;
+}
+
+void L2NormMathematicaAssistant::makeL2NormDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2NormDiff;
+		std::vector<std::string> aBasicListNamesList;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2NormDiff.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormDiff());
+			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+		}
+		std::vector<std::string> finalListNames = finalizeListNames(aBasicListNamesList, "L2NormDiff", sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData());
+		
+		addSecondOrderOfAccuracyRef(gridLengths, l2NormDiff, finalListNames);
+		addFourthOrderOfAccuracyRef(gridLengths, l2NormDiff, finalListNames);
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, l2NormDiff, "L[dx]", "L2NormDiff[-]");
+	}
+}
+
+void L2NormMathematicaAssistant::makeL2NormAllTimeStepsMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2Norm;
+		std::vector<std::string> aBasicListNamesList;
+		std::vector<std::string> basicTimeSteps;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2Norm.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForBasicTimeStep());
+			l2Norm.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForDivergentTimeStep());
+			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+			std::ostringstream aBasicTimeStep;
+			aBasicTimeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(j)->getBasicTimeStep();
+			basicTimeSteps.push_back(aBasicTimeStep.str());
+			std::ostringstream aDivTimeStep;
+			aDivTimeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(j)->getDivergentTimeStep();
+			basicTimeSteps.push_back(aDivTimeStep.str());
+		}
+
+		std::vector<std::string> finalListNamesBasic = finalizeListNames(aBasicListNamesList, "L2NormAllTimeSteps", sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData(), basicTimeSteps);
+
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNamesBasic, gridLengths, l2Norm, "L[dx]", "L2Norm[-]");
+	}
+}
+
+void L2NormMathematicaAssistant::makeL2NormBasicTimeStepMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2NormBasic;
+		std::vector<std::string> aBasicListNamesList;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2NormBasic.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForBasicTimeStep());
+			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+		}
+		std::ostringstream basicTimeStep;
+		basicTimeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(0)->getBasicTimeStep();
+		std::vector<std::string> finalListNamesBasic = finalizeListNames(aBasicListNamesList, "L2Norm", sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData(), basicTimeStep.str());
+		
+		addSecondOrderOfAccuracyRef(gridLengths, l2NormBasic, finalListNamesBasic);
+		addFourthOrderOfAccuracyRef(gridLengths, l2NormBasic, finalListNamesBasic);
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNamesBasic, gridLengths, l2NormBasic, "L[dx]", "L2Norm[-]");
+	}
+}
+
+void L2NormMathematicaAssistant::makeL2NormDivergentTimeStepMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2NormDivergent;
+		std::vector<std::string> aBasicListNamesList;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2NormDivergent.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForDivergentTimeStep());
+			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+		}
+		std::ostringstream divTimeStep;
+		divTimeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(0)->getDivergentTimeStep();
+		std::vector<std::string> finalListNamesDiv = finalizeListNames(aBasicListNamesList, "L2Norm", sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData(), divTimeStep.str());
+		
+		addSecondOrderOfAccuracyRef(gridLengths, l2NormDivergent, finalListNamesDiv);
+		addFourthOrderOfAccuracyRef(gridLengths, l2NormDivergent, finalListNamesDiv);
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNamesDiv, gridLengths, l2NormDivergent, "L[dx]", "L2Norm[-]");
+	}
+}
+
+L2NormMathematicaAssistant::L2NormMathematicaAssistant()
+{
+}
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.h
new file mode 100644
index 0000000000000000000000000000000000000000..92e38b57f985f33f40d7f55b4c8eb3f3309daa54
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.h
@@ -0,0 +1,36 @@
+#ifndef L2NORM_MATHEMATICA_ASSISTANT_H
+#define L2NORM_MATHEMATICA_ASSISTANT_H
+
+#include "Utilities/MathematicaAssistant/MathematicaAssistantImp.h"
+
+class MathematicaFunctionFactory;
+class L2NormLogFileData;
+
+struct SortedDataL2Norm {
+	std::vector<std::vector<std::shared_ptr<L2NormLogFileData> > > testLogFileData;
+	std::vector<std::vector<std::string> > basicListNames;
+};
+
+class L2NormMathematicaAssistant : public MathematicaAssistantImp
+{
+public:
+	static std::shared_ptr<L2NormMathematicaAssistant> getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	void makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+
+	
+private:
+	L2NormMathematicaAssistant();
+	L2NormMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	bool checkTestParameter(std::shared_ptr<L2NormLogFileData> logFileData1, std::shared_ptr<L2NormLogFileData> logFileData2);
+	std::shared_ptr<SortedDataL2Norm> sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData);
+
+	void makeL2NormDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData);
+	void makeL2NormAllTimeStepsMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData);
+	void makeL2NormBasicTimeStepMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData);
+	void makeL2NormDivergentTimeStepMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2Norm> sortedData);
+
+	
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/package.include b/targets/tests/NumericalTestPostProcessing/Tests/L2Norm/MathematicaAssistant/package.include
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileData.h b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileData.h
index 69c08f0a145c6c6a1c7183722ae8c66eb379b449..218f4777b741e4f3ebb956172341338486cf11f9 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileData.h
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileData.h
@@ -9,6 +9,7 @@ class L2NormBetweenKernelsLogFileData
 public:
 	virtual std::vector<double> getBasicGridLengths() = 0;
 	virtual std::string getBasicKernel() = 0;
+	virtual std::string getDivergentKernel() = 0;
 	virtual std::string getDataToCalculate() = 0;
 	virtual int getTimeStep() = 0;
 	virtual std::vector<double> getL2NormForBasicKernel() = 0;
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.cpp b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.cpp
index 958da95676a35e45f200bd6d8ed80b99fe4e2927..cbe8a52088377a16b27f45a6f5e7361d1cd2470c 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.cpp
@@ -15,6 +15,11 @@ std::string L2NormBetweenKernelsLogFileDataImp::getBasicKernel()
 	return basicKernel;
 }
 
+std::string L2NormBetweenKernelsLogFileDataImp::getDivergentKernel()
+{
+	return divergentKernel;
+}
+
 std::string L2NormBetweenKernelsLogFileDataImp::getDataToCalculate()
 {
 	return dataToCalc;
@@ -55,6 +60,11 @@ void L2NormBetweenKernelsLogFileDataImp::setBasicKernel(std::string basicKernel)
 	this->basicKernel = basicKernel;
 }
 
+void L2NormBetweenKernelsLogFileDataImp::setDivergentKernel(std::string divergentKernel)
+{
+	this->divergentKernel = divergentKernel;
+}
+
 void L2NormBetweenKernelsLogFileDataImp::setDataToCalculate(std::string dataToCalc)
 {
 	this->dataToCalc = dataToCalc;
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.h b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.h
index b5ec2c9d21a464a236369ee732428625e54378be..2e18bb248581eca4e356c26d68779f48e471cb9d 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.h
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileDataImp.h
@@ -12,6 +12,7 @@ public:
 
 	std::vector<double> getBasicGridLengths();
 	std::string getBasicKernel();
+	std::string getDivergentKernel();
 	std::string getDataToCalculate();
 	int getTimeStep();
 	std::vector<double> getL2NormForBasicKernel();
@@ -21,6 +22,7 @@ public:
 
 	void setBasicGridLengths(std::vector<double> basicGridLengths);
 	void setBasicKernel(std::string basicKernel);
+	void setDivergentKernel(std::string divergentKernel);
 	void setDataToCalculate(std::string dataToCalc);
 	void setTimeStep(int timeStep);
 	void setL2NormForBasicKernel(std::vector<double> l2Norm);
@@ -35,6 +37,7 @@ private:
 
 	std::vector<double> basicGridLengths;
 	std::string basicKernel;
+	std::string divergentKernel;
 	std::string dataToCalc;
 	int timeStep;
 	std::vector<double> l2NormForBasicKernel;
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.cpp b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..21babc559d9dab0af80c6fa2675c7749449288fc
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.cpp
@@ -0,0 +1,139 @@
+#include "L2NormBetweenKernelsMathematicaAssistant.h"
+
+#include "Tests/L2NormBetweenKernels/LogFileData/L2NormBetweenKernelsLogFileData.h"
+#include "Utilities/LogFileData/LogFileData.h"
+#include "Utilities/LogFileData/LogFileDataGroup/LogFileDataGroup.h"
+
+#include <sstream> 
+
+
+std::shared_ptr<L2NormBetweenKernelsMathematicaAssistant> L2NormBetweenKernelsMathematicaAssistant::getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory)
+{
+	return std::shared_ptr<L2NormBetweenKernelsMathematicaAssistant>(new L2NormBetweenKernelsMathematicaAssistant(functionFactory));
+}
+
+void L2NormBetweenKernelsMathematicaAssistant::makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	std::shared_ptr<SortedDataL2NormBetweenKernels> mySortedData = sortLogFileData(logFileData);
+
+	makeL2NormMathematicaOutput(aMathmaticaFile, mySortedData);
+	makeL2NormBetweenKernelsMathematicaOutput(aMathmaticaFile, mySortedData);
+}
+
+L2NormBetweenKernelsMathematicaAssistant::L2NormBetweenKernelsMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : MathematicaAssistantImp(functionFactory)
+{
+}
+
+bool L2NormBetweenKernelsMathematicaAssistant::checkTestParameter(std::shared_ptr<L2NormBetweenKernelsLogFileData> logFileData1, std::shared_ptr<L2NormBetweenKernelsLogFileData> logFileData2)
+{
+	if (logFileData1->getBasicKernel() != logFileData2->getBasicKernel())
+		return false;
+	if (logFileData1->getNormalizeData() != logFileData2->getNormalizeData())
+		return false;
+	if (logFileData1->getTimeStep() != logFileData2->getTimeStep())
+		return false;
+	if (logFileData1->getDataToCalculate() != logFileData2->getDataToCalculate())
+		return false;
+
+
+	return true;
+}
+
+std::shared_ptr<SortedDataL2NormBetweenKernels> L2NormBetweenKernelsMathematicaAssistant::sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData)
+{
+	std::vector<std::vector<std::shared_ptr<L2NormBetweenKernelsLogFileData> > > testLogFileData;
+	std::vector<std::vector<std::string> > basicListNames;
+	for (int i = 0; i < logFileData->getLogFileData(0)->getL2NormBetweenKernelsLogFileData().size(); i++) {
+		std::vector<std::shared_ptr<L2NormBetweenKernelsLogFileData> > aTestLogFileDataGroup;
+		aTestLogFileDataGroup.push_back(logFileData->getLogFileData(0)->getL2NormBetweenKernelsLogFileData().at(i));
+		std::vector<std::string> aListNameGroup;
+		aListNameGroup.push_back(logFileData->getLogFileData(0)->getSimulationSigniture());
+		basicListNames.push_back(aListNameGroup);
+	}
+	for (int i = 0; i < logFileData->getGroupSize(); i++) {
+		for (int j = 0; j < logFileData->getLogFileData(i)->getL2NormBetweenKernelsLogFileData().size(); j++) {
+			std::string dataToCalc = logFileData->getLogFileData(i)->getL2NormBetweenKernelsLogFileData().at(j)->getDataToCalculate();
+			bool added = false;
+			for (int k = 0; k < testLogFileData.size(); k++) {
+				if (checkTestParameter(logFileData->getLogFileData(i)->getL2NormBetweenKernelsLogFileData().at(j), testLogFileData.at(k).at(0))) {
+					testLogFileData.at(k).push_back(logFileData->getLogFileData(i)->getL2NormBetweenKernelsLogFileData().at(j));
+					basicListNames.at(k).push_back(logFileData->getLogFileData(i)->getSimulationSigniture());
+					added = true;
+				}
+			}
+			if (!added) {
+				std::vector<std::shared_ptr<L2NormBetweenKernelsLogFileData> > aTestLogFileDataGroup;
+				aTestLogFileDataGroup.push_back(logFileData->getLogFileData(i)->getL2NormBetweenKernelsLogFileData().at(j));
+				testLogFileData.push_back(aTestLogFileDataGroup);
+				std::vector<std::string> aListNameGroup;
+				aListNameGroup.push_back(logFileData->getLogFileData(i)->getSimulationSigniture());
+				basicListNames.push_back(aListNameGroup);
+			}
+		}
+	}
+	std::shared_ptr<SortedDataL2NormBetweenKernels> mySortedData = std::shared_ptr<SortedDataL2NormBetweenKernels>(new SortedDataL2NormBetweenKernels);
+	mySortedData->basicListNames = basicListNames;
+	mySortedData->testLogFileData = testLogFileData;
+
+	return mySortedData;
+}
+
+void L2NormBetweenKernelsMathematicaAssistant::makeL2NormMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2NormBetweenKernels> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2Norm;
+		std::vector<std::string> aListNamesList;
+		std::vector<std::string> timeSteps;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2Norm.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForBasicKernel());
+			l2Norm.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormForDivergentKernel());
+			aListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+
+			std::string divergentKernel = sortedData->basicListNames.at(i).at(j);
+			int sizeOfString = sortedData->testLogFileData.at(i).at(j)->getDivergentKernel().size();
+			divergentKernel.erase(divergentKernel.begin(), divergentKernel.begin() + sizeOfString);
+			divergentKernel = sortedData->testLogFileData.at(i).at(j)->getBasicKernel() + divergentKernel;
+			aListNamesList.push_back(divergentKernel);
+
+			std::ostringstream timeStep;
+			timeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(j)->getTimeStep();
+			timeSteps.push_back(timeStep.str());
+			timeSteps.push_back(timeStep.str());
+		}
+		
+		std::vector<std::string> finalListNames = finalizeListNames(aListNamesList, "L2Norm", sortedData->testLogFileData.at(i).at(0)->getDataToCalculate(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData(), timeSteps);
+
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, l2Norm, "L[dx]", "L2Norm[-]");
+	}
+}
+
+void L2NormBetweenKernelsMathematicaAssistant::makeL2NormBetweenKernelsMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2NormBetweenKernels> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		std::vector<std::vector<double> > gridLengths;
+		std::vector<std::vector<double> > l2NormBK;
+		std::vector<std::string> aListNamesList;
+		std::vector<std::string> timeSteps;
+		std::vector<std::string> basicKernel;
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			gridLengths.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicGridLengths());
+			l2NormBK.push_back(sortedData->testLogFileData.at(i).at(j)->getL2NormBetweenKernels());
+			aListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
+			basicKernel.push_back(sortedData->testLogFileData.at(i).at(j)->getBasicKernel());
+			std::ostringstream timeStep;
+			timeStep << "TimeStep" << sortedData->testLogFileData.at(i).at(j)->getTimeStep();
+			timeSteps.push_back(timeStep.str());
+		}
+
+		std::vector<std::string> finalListNames = finalizeListNames(aListNamesList, "L2NormBetweenKernels", sortedData->testLogFileData.at(i).at(0)->getDataToCalculate(), sortedData->testLogFileData.at(i).at(0)->getNormalizeData(), timeSteps, basicKernel);
+
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, l2NormBK, "L[dx]", "L2Norm[-]");
+	}
+}
+
+L2NormBetweenKernelsMathematicaAssistant::L2NormBetweenKernelsMathematicaAssistant()
+{
+}
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.h
new file mode 100644
index 0000000000000000000000000000000000000000..e0a329876ecd43719d4a7f8a63b03d234fff0923
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.h
@@ -0,0 +1,34 @@
+#ifndef L2NORM_BK_MATHEMATICA_ASSISTANT_H
+#define L2NORM_BK_MATHEMATICA_ASSISTANT_H
+
+#include "Utilities/MathematicaAssistant/MathematicaAssistantImp.h"
+
+class MathematicaFunctionFactory;
+class L2NormBetweenKernelsLogFileData;
+
+struct SortedDataL2NormBetweenKernels {
+	std::vector<std::vector<std::shared_ptr<L2NormBetweenKernelsLogFileData> > > testLogFileData;
+	std::vector<std::vector<std::string> > basicListNames;
+};
+
+class L2NormBetweenKernelsMathematicaAssistant : public MathematicaAssistantImp
+{
+public:
+	static std::shared_ptr<L2NormBetweenKernelsMathematicaAssistant> getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	void makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+
+	
+private:
+	L2NormBetweenKernelsMathematicaAssistant();
+	L2NormBetweenKernelsMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	bool checkTestParameter(std::shared_ptr<L2NormBetweenKernelsLogFileData> logFileData1, std::shared_ptr<L2NormBetweenKernelsLogFileData> logFileData2);
+	std::shared_ptr<SortedDataL2NormBetweenKernels> sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData);
+
+	void makeL2NormMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2NormBetweenKernels> sortedData);
+	void makeL2NormBetweenKernelsMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataL2NormBetweenKernels> sortedData);
+
+	
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/package.include b/targets/tests/NumericalTestPostProcessing/Tests/L2NormBetweenKernels/MathematicaAssistant/package.include
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.cpp b/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.cpp
index 2827ce438069abee1580372d2563cf051bc22717..4a976bd0db12fd3208b09a090802a955b4dd32e0 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.cpp
@@ -19,7 +19,7 @@ void NyMathematicaAssistant::makeMathematicaOutput(std::shared_ptr<LogFileDataGr
 	makeNyDiffMathematicaOutput(aMathmaticaFile, mySortedData);
 }
 
-NyMathematicaAssistant::NyMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : functionFactory(functionFactory)
+NyMathematicaAssistant::NyMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : MathematicaAssistantImp(functionFactory)
 {
 }
 
@@ -74,34 +74,6 @@ std::shared_ptr<SortedDataNy> NyMathematicaAssistant::sortLogFileData(std::share
 	return mySortedData;
 }
 
-void NyMathematicaAssistant::addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double> > xAxesData, std::vector<std::vector<double> > yAxesData, std::string labelXAxes, std::string labelYAxes)
-{
-	std::vector<std::vector<std::shared_ptr<DataPoint> > > dataPointGroup;
-
-	for (int i = 0; i < xAxesData.size(); i++) {
-		std::vector<std::shared_ptr<DataPoint> > dataPoints;
-		for (int j = 0; j < xAxesData.at(i).size(); j++)
-			dataPoints.push_back(DataPoint::getNewInstance(xAxesData.at(i).at(j), yAxesData.at(i).at(j)));
-		dataPointGroup.push_back(dataPoints);
-	}
-	std::vector<std::shared_ptr<MathematicaPointList> > pointList;
-	for (int i = 0; i < dataPointGroup.size(); i++) {
-		std::shared_ptr<MathematicaPointList> aPointList = functionFactory->makeMathematicaPointList(aMathmaticaFile, listNames.at(i), dataPointGroup.at(i));
-		pointList.push_back(aPointList);
-	}
-	std::shared_ptr<MathematicaListPlot> listLogLogPlot = functionFactory->makeMathematicaListPlot(aMathmaticaFile, pointList, "ListLogLogPlot", labelXAxes, labelYAxes);
-}
-
-std::vector<std::string> NyMathematicaAssistant::finalizeListNames(std::vector<std::string> basicListNames, std::string dataToCalc, std::string testName)
-{
-	std::vector<std::string> finalListNames;
-
-	for (int i = 0; i < basicListNames.size(); i++)
-		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc);
-
-	return finalListNames;
-}
-
 void NyMathematicaAssistant::makeNyDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataNy> sortedData)
 {
 	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
@@ -113,8 +85,25 @@ void NyMathematicaAssistant::makeNyDiffMathematicaOutput(std::shared_ptr<Mathema
 			nyDiff.push_back(sortedData->testLogFileData.at(i).at(j)->getNyDiff());
 			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
 		}
-		std::vector<std::string> finalListNames = finalizeListNames(aBasicListNamesList, sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), "NyDiff");
-		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, nyDiff, "L[dx]", "Err Ny");
+		
+		std::vector<std::string> finalListNames = finalizeListNames(aBasicListNamesList, "NyDiff", sortedData->testLogFileData.at(i).at(0)->getDataToCalc());
+		addSecondOrderOfAccuracyRef(gridLengths, nyDiff, finalListNames);
+		addFourthOrderOfAccuracyRef(gridLengths, nyDiff, finalListNames); 
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, nyDiff, "L[dx]", "Err Ny[-]");
+	}
+}
+
+void NyMathematicaAssistant::makeOrderOfAccuracyMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataNy> sortedData)
+{
+	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			std::vector<std::vector<double>> ooA = sortedData->testLogFileData.at(i).at(j)->getOrderOfAccuracy();
+			std::string basicListName = sortedData->basicListNames.at(i).at(j);
+			std::string dataToCalc = sortedData->testLogFileData.at(i).at(j)->getDataToCalc();
+			std::string finalListName = finalizeListName(basicListName, "NyDiffOrderOfAccuracy", dataToCalc);
+
+			addListOfListsToMathematicaFile(aMathmaticaFile, finalListName, ooA);
+		}
 	}
 }
 
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h
index 575d9884c0cac55f00542c5cc583a60198b0e5b1..591cfd47220345883ce1e08084d6fc08bf4be4b7 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h
+++ b/targets/tests/NumericalTestPostProcessing/Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h
@@ -25,10 +25,9 @@ private:
 
 	bool checkTestParameter(std::shared_ptr<NyLogFileData> logFileData1, std::shared_ptr<NyLogFileData> logFileData2);
 	std::shared_ptr<SortedDataNy> sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData);
-	void addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double> > xAxesData, std::vector<std::vector<double> > yAxesData, std::string labelXAxes, std::string labelYAxes);
-	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string dataToCalc, std::string testName);
+
 	void makeNyDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataNy> sortedData);
+	void makeOrderOfAccuracyMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataNy> sortedData);
 
-	std::shared_ptr<MathematicaFunctionFactory> functionFactory;
 };
 #endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.cpp b/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.cpp
index d94434b8066a8e9651f505629bc81c90dae7b919..9fd24e63d07321be1e0591c58370ca8dfd13786f 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.cpp
@@ -1,11 +1,9 @@
 #include "PhiMathematicaAssistant.h"
 
 #include "Tests/PhiTest/LogFileData/PhiLogFileData.h"
-
-#include "Utilities/DataPoint/DataPoint.h"
 #include "Utilities/LogFileData/LogFileData.h"
 #include "Utilities/LogFileData/LogFileDataGroup/LogFileDataGroup.h"
-#include "Utilities/MathematicaFunctionFactory/MathematicaFunctionFactory.h"
+
 
 std::shared_ptr<PhiMathematicaAssistant> PhiMathematicaAssistant::getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory)
 {
@@ -17,9 +15,11 @@ void PhiMathematicaAssistant::makeMathematicaOutput(std::shared_ptr<LogFileDataG
 	std::shared_ptr<SortedDataPhi> mySortedData = sortLogFileData(logFileData);
 
 	makePhiDiffMathematicaOutput(aMathmaticaFile, mySortedData);
+	makeOrderOfAccuracyMathematicaOutput(aMathmaticaFile, mySortedData);
+
 }
 
-PhiMathematicaAssistant::PhiMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : functionFactory(functionFactory)
+PhiMathematicaAssistant::PhiMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : MathematicaAssistantImp(functionFactory)
 {
 }
 
@@ -74,39 +74,6 @@ std::shared_ptr<SortedDataPhi> PhiMathematicaAssistant::sortLogFileData(std::sha
 	return mySortedData;
 }
 
-void PhiMathematicaAssistant::addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double> > xAxesData, std::vector<std::vector<double> > yAxesData, std::string labelXAxes, std::string labelYAxes)
-{
-	std::vector<std::vector<std::shared_ptr<DataPoint> > > dataPointGroup;
-
-	for (int i = 0; i < xAxesData.size(); i++) {
-		std::vector<std::shared_ptr<DataPoint> > dataPoints;
-		for (int j = 0; j < xAxesData.at(i).size(); j++)
-			dataPoints.push_back(DataPoint::getNewInstance(xAxesData.at(i).at(j), yAxesData.at(i).at(j)));
-		dataPointGroup.push_back(dataPoints);
-	}
-	std::vector<std::shared_ptr<MathematicaPointList> > pointList;
-	for (int i = 0; i < dataPointGroup.size(); i++) {
-		std::shared_ptr<MathematicaPointList> aPointList = functionFactory->makeMathematicaPointList(aMathmaticaFile, listNames.at(i), dataPointGroup.at(i));
-		pointList.push_back(aPointList);
-	}
-	std::shared_ptr<MathematicaListPlot> listLogLogPlot = functionFactory->makeMathematicaListPlot(aMathmaticaFile, pointList, "ListLogLogPlot", labelXAxes, labelYAxes);
-}
-
-void PhiMathematicaAssistant::addListOfListsToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::string listNames, std::vector<std::vector<double>> listOfLists)
-{
-	functionFactory->makeMathematicaListOfLists(aMathmaticaFile, listNames, listOfLists);
-}
-
-std::vector<std::string> PhiMathematicaAssistant::finalizeListNames(std::vector<std::string> basicListNames, std::string dataToCalc, std::string testName)
-{
-	std::vector<std::string> finalListNames;
-
-	for (int i = 0; i < basicListNames.size(); i++)
-		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc);
-
-	return finalListNames;
-}
-
 void PhiMathematicaAssistant::makePhiDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataPhi> sortedData)
 {
 	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
@@ -118,15 +85,24 @@ void PhiMathematicaAssistant::makePhiDiffMathematicaOutput(std::shared_ptr<Mathe
 			phiDiff.push_back(sortedData->testLogFileData.at(i).at(j)->getPhiDiff());
 			aBasicListNamesList.push_back(sortedData->basicListNames.at(i).at(j));
 		}
-		std::vector<std::string> finalListNames = finalizeListNames(aBasicListNamesList, sortedData->testLogFileData.at(i).at(0)->getDataToCalc(), "PhiDiff");
-		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, phiDiff, "L[dx]", "Err Phi");
+		std::vector<std::string> finalListNames = finalizeListNames(aBasicListNamesList, "PhiDiff", sortedData->testLogFileData.at(i).at(0)->getDataToCalc());
+		addSecondOrderOfAccuracyRef(gridLengths, phiDiff, finalListNames);
+		addFourthOrderOfAccuracyRef(gridLengths, phiDiff, finalListNames);
+		addListLogLogPlotToMathematicaFile(aMathmaticaFile, finalListNames, gridLengths, phiDiff, "L[dx]", "Err Phi[-]");
 	}
 }
 
 void PhiMathematicaAssistant::makeOrderOfAccuracyMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataPhi> sortedData)
 {
 	for (int i = 0; i < sortedData->testLogFileData.size(); i++) {
-		
+		for (int j = 0; j < sortedData->testLogFileData.at(i).size(); j++) {
+			std::vector<std::vector<double>> ooA = sortedData->testLogFileData.at(i).at(j)->getOrderOfAccuracy();
+			std::string basicListName = sortedData->basicListNames.at(i).at(j);
+			std::string dataToCalc = sortedData->testLogFileData.at(i).at(j)->getDataToCalc();
+			std::string finalListName = finalizeListName(basicListName, "PhiDiffOrderOfAccuracy", dataToCalc);
+
+			addListOfListsToMathematicaFile(aMathmaticaFile, finalListName, ooA);
+		}
 	}
 }
 
diff --git a/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h
index a8696261d006c5e3eeec18626d949a89d96dd54d..f84d6c1ba726458af54a30d44916e41247a09368 100644
--- a/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h
+++ b/targets/tests/NumericalTestPostProcessing/Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h
@@ -25,12 +25,10 @@ private:
 
 	bool checkTestParameter(std::shared_ptr<PhiLogFileData> logFileData1, std::shared_ptr<PhiLogFileData> logFileData2);
 	std::shared_ptr<SortedDataPhi> sortLogFileData(std::shared_ptr<LogFileDataGroup> logFileData);
-	void addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double> > xAxesData, std::vector<std::vector<double> > yAxesData, std::string labelXAxes, std::string labelYAxes);
-	void addListOfListsToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::string listNames, std::vector<std::vector<double> > listOfLists);
-	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string dataToCalc, std::string testName);
+	
+	
 	void makePhiDiffMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataPhi> sortedData);
 	void makeOrderOfAccuracyMathematicaOutput(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::shared_ptr<SortedDataPhi> sortedData);
 
-	std::shared_ptr<MathematicaFunctionFactory> functionFactory;
 };
 #endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistant.h b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistant.h
index 035eaf74aeb16c2037b9c7aec35f28597ba9f333..b1d7f7417e9e149689bcbfb4afc7bb41134bf5ed 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistant.h
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistant.h
@@ -6,13 +6,15 @@
 #include <memory>
 #include <vector>
 
+enum DataCombination{ EqualSimulationsForDifferentKernels , EqualKernelSimulationsForDifferentViscosities};
+
 class LogFileData;
 class LogFileDataGroup;
 
 class LogFileDataAssistant
 {
 public:
-	virtual std::vector<std::shared_ptr<LogFileDataGroup> > findEqualSimulationsForDifferentKernels(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation) = 0;
-	virtual std::vector<std::shared_ptr<LogFileDataGroup> > findEqualKernelSimulationsForDifferentViscosities(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation) = 0;
+	virtual std::vector<std::shared_ptr<LogFileDataGroup> > findDataCombination(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation, DataCombination combination) = 0;
+
 };
 #endif
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.cpp
index 69c743f6b9ec9de69ce20f55faaf3674e6287004..da3b2a198dbe1e8fb7790f1645790590e05204a6 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.cpp
@@ -96,6 +96,25 @@ std::shared_ptr<LogFileDataAssistant> LogFileDataAssistantImp::getNewInstance()
 	return std::shared_ptr<LogFileDataAssistant>(new LogFileDataAssistantImp());
 }
 
+std::vector<std::shared_ptr<LogFileDataGroup>> LogFileDataAssistantImp::findDataCombination(std::vector<std::shared_ptr<LogFileData>> allLogFileData, BasicSimulation simulation, DataCombination combination)
+{
+	std::vector<std::shared_ptr<LogFileDataGroup>> myLogFileDataGroup;
+
+	switch (combination)
+	{
+	case EqualSimulationsForDifferentKernels:
+		myLogFileDataGroup = findEqualSimulationsForDifferentKernels(allLogFileData, simulation);
+		break;
+	case EqualKernelSimulationsForDifferentViscosities:
+		myLogFileDataGroup = findEqualKernelSimulationsForDifferentViscosities(allLogFileData, simulation);
+		break;
+	default:
+		break;
+	}
+
+	return myLogFileDataGroup;
+}
+
 std::vector<std::shared_ptr<LogFileDataGroup>> LogFileDataAssistantImp::findEqualSimulationsForDifferentKernels(std::vector<std::shared_ptr<LogFileData>> allLogFileData, BasicSimulation simulation)
 {
 	std::shared_ptr<LogFileDataAssistantStrategy> strategy = assistentStrategyFactory->makeLogFileDataAssistantStrategy(simulation);
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.h b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.h
index f54e357d9d8becd8bb521252f509a5066895a89e..1783a104c4a56bfeddf79aef2778d380964d392c 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.h
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileDataAssistant/LogFileDataAssistantImp.h
@@ -11,13 +11,17 @@ class LogFileDataAssistantImp : public LogFileDataAssistant
 public:
 	static std::shared_ptr<LogFileDataAssistant> getNewInstance();
 
-	std::vector<std::shared_ptr<LogFileDataGroup> > findEqualSimulationsForDifferentKernels(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation);
-	std::vector<std::shared_ptr<LogFileDataGroup> > findEqualKernelSimulationsForDifferentViscosities(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation);
+
+	std::vector<std::shared_ptr<LogFileDataGroup> > findDataCombination(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation, DataCombination combination);
+	
 
 
 protected:
 	LogFileDataAssistantImp();
 	
+	std::vector<std::shared_ptr<LogFileDataGroup> > findEqualSimulationsForDifferentKernels(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation);
+	std::vector<std::shared_ptr<LogFileDataGroup> > findEqualKernelSimulationsForDifferentViscosities(std::vector<std::shared_ptr<LogFileData> > allLogFileData, BasicSimulation simulation);
+
 	std::vector<std::shared_ptr<LogFileData> > getSimulationGroupLogFileData(std::string simName, std::vector<std::shared_ptr<LogFileData> > allLogFileData);
 	std::vector<std::vector<std::shared_ptr<LogFileData> > > sortLogFileDataAfterKernels(std::vector<std::shared_ptr<LogFileData> > logFileData);
 	
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
index f1dc47d8d90644eafa27a02e952c771e3326b463..1e80f43264758dda06907d7db566632639ccf661 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/LogFileReader/LogFileReader.cpp
@@ -52,6 +52,8 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 	logFileData->setSimName(StringUtil::toString(input->getValue("SimulationName")));
 
 
+
+
 	std::ostringstream simSigniture;
 	if (logFileData->getSimName() == "ShearWave") {
 		std::vector<double> shearWaveLx = StringUtil::toDoubleVector(input->getValue("Lx"));
@@ -143,7 +145,7 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		simTime.push_back(StringUtil::toInt(simTimeString));
 		resultsCheckTime.push_back(StringUtil::toDouble(resultCheckTimeString));
 		testTime.push_back(StringUtil::toDouble(testTimeString));
-		analyticalVTKWritingTimeString.push_back(StringUtil::toInt(analyticalVTKWritingTimeString));
+		analyticalVTKWritingTime.push_back(StringUtil::toInt(analyticalVTKWritingTimeString));
 	}
 
 	logFileData->setVTKFileWriting(StringUtil::toBool(input->getValue("VTKFileWriting")));
@@ -185,7 +187,6 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 					phiDiff.push_back(StringUtil::toDouble(input->getValue(phiDiffString.str())));
 				}
 
-
 				for (int k = j + 1; k < logFileData->getBasicGridLengths().size(); k++) {
 					std::vector<double> aOrderOfAccuracyGroup;
 					std::ostringstream phiDiffOOA, phiDiffBasicOOA;
@@ -346,14 +347,16 @@ std::shared_ptr<LogFileData> LogFileReader::readLogFileToLogFileData(std::string
 		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<double> l2NormBasicKernel;
-		std::vector<double> l2NormDivergentKernel;
-		std::vector<double> l2NormBetweenKernels;
+
 		for (int i = 0; i < dataToCalc.size(); i++) {
 			for (int j = 0; j < timeSteps.size(); j++) {
 				for (int k = 0; k < normalizeData.size(); k++) {
+					std::vector<double> l2NormBasicKernel;
+					std::vector<double> l2NormDivergentKernel;
+					std::vector<double> l2NormBetweenKernels;
 					std::shared_ptr<L2NormBetweenKernelsLogFileDataImp> aL2NormLogFileData = L2NormBetweenKernelsLogFileDataImp::getNewInstance();
 					aL2NormLogFileData->setBasicKernel(StringUtil::toString(input->getValue("BasicKernel_L2Norm_BK")));
+					aL2NormLogFileData->setDivergentKernel(logFileData->getKernel());
 					aL2NormLogFileData->setDataToCalculate(dataToCalc.at(i));
 					aL2NormLogFileData->setTimeStep(timeSteps.at(j));
 					aL2NormLogFileData->setNormalizeData(normalizeData.at(k));
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistant.h
index 96d38560aad89df94286a58eebdc574440ccb31c..7d6f326366f2f7001ba3db1192ee7472ba0a9041 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistant.h
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistant.h
@@ -4,6 +4,8 @@
 #include <memory>
 #include <vector>
 
+enum Assistant{Phi, Ny, L2Norm, L2NormBetweenKernels, Time };
+
 class LogFileDataGroup;
 class MathematicaFile;
 
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactory.h b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..9afdf455b948fe669d9a95f33e66668db77fae81
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactory.h
@@ -0,0 +1,17 @@
+#ifndef MATHEMATICA_ASSISTANT_FACTORY_H
+#define MATHEMATICA_ASSISTANT_FACTORY_H
+
+#include "../MathematicaAssistant.h"
+
+#include <memory>
+#include <vector>
+
+class MathematicaFunctionFactory;
+
+class MathematicaAssistantFactory
+{
+public:
+	virtual std::vector<std::shared_ptr<MathematicaAssistant> > makeMathematicaAssistants(std::vector<Assistant> types, std::shared_ptr<MathematicaFunctionFactory> functionFactory) = 0;
+
+};
+#endif
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..86d6262c71d2c35b85649de1fe744e1085ad7c1e
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.cpp
@@ -0,0 +1,52 @@
+#include "MathematicaAssistantFactoryImp.h"
+
+#include "Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h"
+#include "Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h"
+#include "Tests/L2Norm/MathematicaAssistant/L2NormMathematicaAssistant.h"
+#include "Tests/L2NormBetweenKernels/MathematicaAssistant/L2NormBetweenKernelsMathematicaAssistant.h"
+
+#include "Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.h"
+
+std::shared_ptr<MathematicaAssistantFactory> MathematicaAssistantFactoryImp::getNewInstance()
+{
+	return std::shared_ptr<MathematicaAssistantFactory>(new MathematicaAssistantFactoryImp());
+}
+
+std::vector<std::shared_ptr<MathematicaAssistant>> MathematicaAssistantFactoryImp::makeMathematicaAssistants(std::vector<Assistant> types, std::shared_ptr<MathematicaFunctionFactory> functionFactory)
+{
+	std::vector<std::shared_ptr<MathematicaAssistant>> myAssistants;
+
+	for(int i = 0; i < types.size(); i++){
+		switch (types.at(i))
+		{
+		case Phi:
+			myAssistants.push_back(PhiMathematicaAssistant::getNewInstance(functionFactory));
+			break;
+		case Ny:
+			myAssistants.push_back(NyMathematicaAssistant::getNewInstance(functionFactory));
+			break;
+		case L2Norm:
+			myAssistants.push_back(L2NormMathematicaAssistant::getNewInstance(functionFactory));
+			break;
+		case L2NormBetweenKernels:
+			myAssistants.push_back(L2NormBetweenKernelsMathematicaAssistant::getNewInstance(functionFactory));
+			break;
+		case Time:
+			myAssistants.push_back(TimeMathematicaAssistant::getNewInstance(functionFactory));
+			break;
+		default:
+			break;
+		}
+
+	}
+
+
+	return myAssistants;
+}
+
+MathematicaAssistantFactoryImp::MathematicaAssistantFactoryImp()
+{
+}
+
+
+
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.h b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.h
new file mode 100644
index 0000000000000000000000000000000000000000..6acacadc59ce1db5c3b9590b8e1ef663e0084398
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.h
@@ -0,0 +1,16 @@
+#ifndef MATHEMATICA_ASSISTANT_FACTORY_IMP_H
+#define MATHEMATICA_ASSISTANT_FACTORY_IMP_H
+
+#include "MathematicaAssistantFactory.h"
+
+class MathematicaAssistantFactoryImp : public MathematicaAssistantFactory
+{
+public:
+	static std::shared_ptr<MathematicaAssistantFactory> getNewInstance();
+
+	std::vector<std::shared_ptr<MathematicaAssistant> > makeMathematicaAssistants(std::vector<Assistant> types, std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+private: 
+	MathematicaAssistantFactoryImp();
+};
+#endif
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/package.include b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantFactory/package.include
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.cpp
index 3aa5bbf326d0f4955cd456d296c6fedc78dd0679..cc12fbe77914e9757e560e7c108b4ac51de5cb90 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.cpp
@@ -1,5 +1,148 @@
 #include "MathematicaAssistantImp.h"
 
+#include "Utilities/DataPoint/DataPoint.h"
+#include "Utilities/MathematicaFunctionFactory/MathematicaFunctionFactory.h"
+
 MathematicaAssistantImp::MathematicaAssistantImp()
 {
 }
+
+MathematicaAssistantImp::MathematicaAssistantImp(std::shared_ptr<MathematicaFunctionFactory> functionFactory)
+{
+	this->functionFactory = functionFactory;
+}
+
+std::vector<std::string> MathematicaAssistantImp::finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc)
+{
+	std::vector<std::string> finalListNames;
+
+	for (int i = 0; i < basicListNames.size(); i++)
+		finalListNames.push_back(finalizeListName(basicListNames.at(i), testName, dataToCalc));
+
+	return finalListNames;
+}
+
+std::vector<std::string> MathematicaAssistantImp::finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData)
+{
+	std::vector<std::string> finalListNames;
+
+	for (int i = 0; i < basicListNames.size(); i++)
+		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc + normalizeData);
+
+	return finalListNames;
+}
+
+std::vector<std::string> MathematicaAssistantImp::finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::string timeStep)
+{
+	std::vector<std::string> finalListNames;
+
+	for (int i = 0; i < basicListNames.size(); i++)
+		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc + normalizeData + timeStep);
+
+	return finalListNames;
+}
+
+std::vector<std::string> MathematicaAssistantImp::finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::vector<std::string> timeSteps)
+{
+	std::vector<std::string> finalListNames;
+
+	for (int i = 0; i < basicListNames.size(); i++)
+		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc + normalizeData + timeSteps.at(i));
+
+	return finalListNames;
+}
+
+std::vector<std::string> MathematicaAssistantImp::finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::vector<std::string> timeSteps, std::vector<std::string> basicKernels)
+{
+	std::vector<std::string> finalListNames;
+
+	for (int i = 0; i < basicListNames.size(); i++)
+		finalListNames.push_back(testName + basicListNames.at(i) + dataToCalc + normalizeData + timeSteps.at(i) + basicKernels.at(i));
+
+	return finalListNames;
+}
+
+std::string MathematicaAssistantImp::finalizeListName(std::string basicListName, std::string testName, std::string dataToCalc)
+{
+	return testName + basicListName + dataToCalc;
+}
+
+void MathematicaAssistantImp::addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double>> xAxesData, std::vector<std::vector<double>> yAxesData, std::string labelXAxes, std::string labelYAxes)
+{
+	std::vector<std::vector<std::shared_ptr<DataPoint> > > dataPointGroup;
+
+	for (int i = 0; i < xAxesData.size(); i++) {
+		std::vector<std::shared_ptr<DataPoint> > dataPoints;
+		for (int j = 0; j < xAxesData.at(i).size(); j++)
+			dataPoints.push_back(DataPoint::getNewInstance(xAxesData.at(i).at(j), yAxesData.at(i).at(j)));
+		dataPointGroup.push_back(dataPoints);
+	}
+	std::vector<std::shared_ptr<MathematicaPointList> > pointList;
+	for (int i = 0; i < dataPointGroup.size(); i++) {
+		std::shared_ptr<MathematicaPointList> aPointList = functionFactory->makeMathematicaPointList(aMathmaticaFile, listNames.at(i), dataPointGroup.at(i));
+		pointList.push_back(aPointList);
+	}
+	std::shared_ptr<MathematicaListPlot> listLogLogPlot = functionFactory->makeMathematicaListPlot(aMathmaticaFile, pointList, "ListLogLogPlot", labelXAxes, labelYAxes);
+}
+
+void MathematicaAssistantImp::addListOfListsToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::string listNames, std::vector<std::vector<double>> listOfLists)
+{
+	functionFactory->makeMathematicaListOfLists(aMathmaticaFile, listNames, listOfLists);
+}
+
+void MathematicaAssistantImp::addSecondOrderOfAccuracyRef(std::vector<std::vector<double>>& xAxesData, std::vector<std::vector<double>>& yAxesData, std::vector<std::string>& listNames)
+{
+	int  maxLength = 0;
+	int maxLengthAtNumber = 0;
+	for (int i = 0; i < xAxesData.size(); i++) {
+		if (xAxesData.at(i).size() > maxLength) {
+			maxLength = xAxesData.at(i).size();
+			maxLengthAtNumber = i;
+		}
+	}
+	std::vector<double> x = xAxesData.at(maxLengthAtNumber);
+	
+	double maxData = 0.0;
+	for (int i = 0; i < yAxesData.size(); i++) {
+		for (int j = 0; j < yAxesData.at(i).size(); j++) {
+			if (yAxesData.at(i).at(j) > maxData)
+				maxData = yAxesData.at(i).at(j);
+		}
+	}
+
+	std::vector<double> sec = { maxData * 10.0 };
+	for (int l = 1; l < x.size(); l++) 
+		sec.push_back(sec.at(l - 1) / exp(-2.0 * log(x.at(l - 1) / x.at(l))));
+	xAxesData.push_back(x);
+	yAxesData.push_back(sec);
+	listNames.push_back("SecondOrderOfAccuracy");
+}
+
+void MathematicaAssistantImp::addFourthOrderOfAccuracyRef(std::vector<std::vector<double>>& xAxesData, std::vector<std::vector<double>>& yAxesData, std::vector<std::string>& listNames)
+{
+	int  maxLength = 0;
+	int maxLengthAtNumber = 0;
+	for (int i = 0; i < xAxesData.size(); i++) {
+		if (xAxesData.at(i).size() > maxLength) {
+			maxLength = xAxesData.at(i).size();
+			maxLengthAtNumber = i;
+		}
+	}
+	std::vector<double> x = xAxesData.at(maxLengthAtNumber);
+
+	double maxData = 0.0;
+	for (int i = 0; i < yAxesData.size(); i++) {
+		for (int j = 0; j < yAxesData.at(i).size(); j++) {
+			if (yAxesData.at(i).at(j) > maxData)
+				maxData = yAxesData.at(i).at(j);
+		}
+	}
+	std::vector<double> fourth = { maxData / 100.0 };
+	for (int l = 1; l < x.size(); l++) 
+		fourth.push_back(fourth.at(l - 1) / exp(-4.0 * log(x.at(l - 1) / x.at(l))));
+
+
+	xAxesData.push_back(x);
+	yAxesData.push_back(fourth);
+	listNames.push_back("FourthOrderOfAccuracy");
+}
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.h b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.h
index b508f01ae9cd1c3b10891e21873146d33303b16f..ab0970dd331cf899cb8fb19e60da87f6415bc767 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.h
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/MathematicaAssistantImp.h
@@ -3,6 +3,8 @@
 
 #include "MathematicaAssistant.h"
 
+class MathematicaFunctionFactory;
+
 class MathematicaAssistantImp : public MathematicaAssistant
 {
 public:
@@ -10,5 +12,21 @@ public:
 
 protected:
 	MathematicaAssistantImp();
+	MathematicaAssistantImp(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc);
+	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData);
+	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::string timeStep);
+	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::vector<std::string> timeSteps);
+	std::vector<std::string> finalizeListNames(std::vector<std::string> basicListNames, std::string testName, std::string dataToCalc, std::string normalizeData, std::vector<std::string> timeSteps, std::vector<std::string> basicKernels);
+	std::string finalizeListName(std::string basicListName, std::string testName, std::string dataToCalc);
+
+	void addListLogLogPlotToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::string> listNames, std::vector<std::vector<double> > xAxesData, std::vector<std::vector<double> > yAxesData, std::string labelXAxes, std::string labelYAxes);
+	void addListOfListsToMathematicaFile(std::shared_ptr<MathematicaFile> aMathmaticaFile, std::string listName, std::vector<std::vector<double> > listOfLists);
+
+	void addSecondOrderOfAccuracyRef(std::vector<std::vector<double> > &xAxesData, std::vector<std::vector<double> > &yAxesData, std::vector<std::string> &listNames);
+	void addFourthOrderOfAccuracyRef(std::vector<std::vector<double> > &xAxesData, std::vector<std::vector<double> > &yAxesData, std::vector<std::string> &listNames);
+
+	std::shared_ptr<MathematicaFunctionFactory> functionFactory;
 };
 #endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..816171a00ed88a596a7b5efe6bc525de6e3eaf77
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.cpp
@@ -0,0 +1,83 @@
+#include "TimeMathematicaAssistant.h"
+
+#include "Utilities/LogFileData/LogFileDataGroup/LogFileDataGroup.h"
+#include "Utilities/LogFileData/LogFileData.h"
+
+#include "Utilities/DataPoint/DataPoint.h"
+#include "Utilities/MathematicaFunctionFactory/MathematicaFunctionFactory.h"
+
+std::shared_ptr<TimeMathematicaAssistant> TimeMathematicaAssistant::getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory)
+{
+	return std::shared_ptr<TimeMathematicaAssistant>(new TimeMathematicaAssistant(functionFactory));
+}
+
+TimeMathematicaAssistant::TimeMathematicaAssistant()
+{
+
+}
+
+TimeMathematicaAssistant::TimeMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory) : MathematicaAssistantImp(functionFactory)
+{
+
+}
+
+void TimeMathematicaAssistant::makeSimulationTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	std::vector<std::vector<double> > simTimes(logFileData->getGroupSize());
+	for (int i = 0; i < logFileData->getGroupSize(); i++)
+		for(int j = 0; j < logFileData->getLogFileData(i)->getSimTime().size(); j++)
+			simTimes.at(i).push_back((double)logFileData->getLogFileData(i)->getSimTime().at(j));
+
+	makeTimeMathematicaOutput(logFileData, aMathmaticaFile, simTimes, "SimulationTime");
+}
+
+void TimeMathematicaAssistant::makeTestTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	std::vector<std::vector<double> > testTimes;
+	for (int i = 0; i < logFileData->getGroupSize(); i++)
+		testTimes.push_back(logFileData->getLogFileData(i)->getTestTime());
+
+	makeTimeMathematicaOutput(logFileData, aMathmaticaFile, testTimes, "TestTime");
+}
+
+void TimeMathematicaAssistant::makeAnalyticalWriteTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	std::vector<std::vector<double> > analyticalWriteTime(logFileData->getGroupSize());
+	for (int i = 0; i < logFileData->getGroupSize(); i++)
+		for (int j = 0; j < logFileData->getLogFileData(i)->getAnalyticalVTKWritingTime().size(); j++)
+			analyticalWriteTime.at(i).push_back((double)logFileData->getLogFileData(i)->getAnalyticalVTKWritingTime().at(j));
+
+	makeTimeMathematicaOutput(logFileData, aMathmaticaFile, analyticalWriteTime, "AnalyticalVTKWritingTime");
+}
+
+void TimeMathematicaAssistant::makeTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::vector<double>> times, std::string timeName)
+{
+	std::vector<std::vector<double> > grids;
+	std::vector<std::string> listNames;
+	for (int i = 0; i < logFileData->getGroupSize(); i++) {
+		grids.push_back(logFileData->getLogFileData(i)->getBasicGridLengths());
+		listNames.push_back(logFileData->getLogFileData(i)->getSimulationSigniture() + timeName);
+	}
+
+	std::vector<std::vector<std::shared_ptr<DataPoint> > > dataPointGroup;
+
+	for (int j = 0; j < grids.size(); j++) {
+		std::vector<std::shared_ptr<DataPoint> > dataPoints;
+		for (int k = 0; k < times.at(j).size(); k++)
+			dataPoints.push_back(DataPoint::getNewInstance(grids.at(j).at(k), times.at(j).at(k)));
+		dataPointGroup.push_back(dataPoints);
+	}
+	std::vector<std::shared_ptr<MathematicaPointList> > pointList;
+	for (int j = 0; j < dataPointGroup.size(); j++) {
+		std::shared_ptr<MathematicaPointList> aPointList = functionFactory->makeMathematicaPointList(aMathmaticaFile, listNames.at(j), dataPointGroup.at(j));
+		pointList.push_back(aPointList);
+	}
+	std::shared_ptr<MathematicaListPlot> listLogLogPlot = functionFactory->makeMathematicaListPlot(aMathmaticaFile, pointList, "ListLogLogPlot", "L[dx]", "Time [sec]");
+}
+
+void TimeMathematicaAssistant::makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile)
+{
+	makeSimulationTimeMathematicaOutput(logFileData, aMathmaticaFile);
+	makeTestTimeMathematicaOutput(logFileData, aMathmaticaFile);
+	makeAnalyticalWriteTimeMathematicaOutput(logFileData, aMathmaticaFile);
+}
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.h b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.h
new file mode 100644
index 0000000000000000000000000000000000000000..46daab517d6e614531a2c4ffab2345a486c75a3c
--- /dev/null
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/TimeMathematicaAssistant.h
@@ -0,0 +1,27 @@
+#ifndef TIME_MATHEMATICA_ASSISTANT_H
+#define TIME_MATHEMATICA_ASSISTANT_H
+
+#include "Utilities/MathematicaAssistant/MathematicaAssistantImp.h"
+
+class MathematicaFunctionFactory;
+class MathematicaFile;
+
+class TimeMathematicaAssistant : public MathematicaAssistantImp
+{
+public:
+	static std::shared_ptr<TimeMathematicaAssistant> getNewInstance(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	void makeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+
+private:
+	TimeMathematicaAssistant();
+	TimeMathematicaAssistant(std::shared_ptr<MathematicaFunctionFactory> functionFactory);
+
+	void makeSimulationTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+	void makeTestTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+	void makeAnalyticalWriteTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile);
+
+	void makeTimeMathematicaOutput(std::shared_ptr<LogFileDataGroup> logFileData, std::shared_ptr<MathematicaFile> aMathmaticaFile, std::vector<std::vector<double> > times, std::string timeName);
+
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/package.include b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaAssistant/TimeAssistant/package.include
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/LinePlot/MathematicaListPlotImp.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/LinePlot/MathematicaListPlotImp.cpp
index 0e940e22751d7097affe2ad28b7e3faf1fb6e19e..e8508061686cba1092f0f85012d3a9b81b6fc439 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/LinePlot/MathematicaListPlotImp.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/LinePlot/MathematicaListPlotImp.cpp
@@ -23,7 +23,7 @@ MathematicaListPlotImp::MathematicaListPlotImp(std::vector<std::shared_ptr<Mathe
 		else
 			mathematicaFunction << pointList.at(i)->getListName() << "\"}";
 	}
-	mathematicaFunction << ", AxesLabel -> {" << xAxes << ", " << yAxes << "}, Joined -> True, PlotMarkers->Automatic, PlotStyle -> Dashed]";
+	mathematicaFunction << ", AxesLabel -> {\"" << xAxes << "\", \"" << yAxes << "\"}, Joined -> True, PlotMarkers->Automatic, PlotStyle -> Dashed]";
 }
 
 MathematicaListPlotImp::MathematicaListPlotImp()
diff --git a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/ListOfLists/MathematicaListOfListsImp.cpp b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/ListOfLists/MathematicaListOfListsImp.cpp
index bc236d6495fc82e9c87a5e10fe33684306dbecd0..58a4128fbd1ae54f59c625cb7b7ca4f851885962 100644
--- a/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/ListOfLists/MathematicaListOfListsImp.cpp
+++ b/targets/tests/NumericalTestPostProcessing/Utilities/MathematicaFunction/ListOfLists/MathematicaListOfListsImp.cpp
@@ -17,16 +17,16 @@ MathematicaListOfListsImp::MathematicaListOfListsImp(std::string listName, std::
 	mathematicaFunction << std::fixed << std::setprecision(std::numeric_limits<double>::digits10 + 1);
 	mathematicaFunction << listName << "= {";
 
-	for (int i = 0; listOfLists.size(); i++) {
+	for (int i = 0; i < listOfLists.size(); i++) {
 		mathematicaFunction << "{";
-		if (i > 0)
-			mathematicaFunction << ", ";
 		for (int j = 0; j < listOfLists.at(i).size(); j++){
-			if (i > 0)
+			if (j > 0)
 				mathematicaFunction << ", ";
 			mathematicaFunction << listOfLists.at(i).at(j);
 		}
 		mathematicaFunction << "}";
+		if(i < listOfLists.size() - 1)
+			mathematicaFunction << ", ";
 	}
 	mathematicaFunction << "};";
 }
diff --git a/targets/tests/NumericalTestPostProcessing/main.cpp b/targets/tests/NumericalTestPostProcessing/main.cpp
index 3122355776a3c973ca6bc797376afc630a810011..1ffb891cae9c8a936d82f85cead2442706dc25b4 100644
--- a/targets/tests/NumericalTestPostProcessing/main.cpp
+++ b/targets/tests/NumericalTestPostProcessing/main.cpp
@@ -1,7 +1,5 @@
 #include "Simulation/BasicSimulation.h"
 
-#include "Tests/PhiTest/MathematicaAssistant/PhiMathematicaAssistant.h"
-#include "Tests/NyTest/MathematicaAssistant/NyMathematicaAssistant.h"
 
 #include "Utilities/LogFileData/LogFileData.h"
 #include "Utilities/LogFileData/LogFileDataGroup/LogFileDataGroup.h"
@@ -9,6 +7,8 @@
 #include "Utilities/LogFileDataAssistant/LogFileDataAssistantImp.h"
 #include "Utilities/MathematicaFile/MathematicaFile.h"
 #include "Utilities/MathematicaFunctionFactory/MathematicaFunctionFactoryImp.h"
+#include "Utilities/MathematicaAssistant/MathematicaAssistantFactory/MathematicaAssistantFactoryImp.h"
+#include "Utilities/MathematicaAssistant/MathematicaAssistant.h"
 
 #include <memory>
 #include <cfloat>
@@ -22,28 +22,44 @@
 
 int main(int argc, char **argv)
 {
-	BasicSimulation simulation = ShearWave;
-	//BasicSimulation simulation = TaylorGreenVortexUx;
-	//BasicSimulation simulation = TaylorGreenVortexUz;
+	std::vector<BasicSimulation> simulation;
+	simulation.push_back(ShearWave);
+	//simulation.push_back(TaylorGreenVortexUx);
+	//simulation.push_back(TaylorGreenVortexUz);
 
-	std::shared_ptr<LogFileReader> logFileReader = LogFileReader::getInstance();
-	//std::shared_ptr<LogFileData> logFileData = logFileReader->readLogFileToLogFileData("C:/Users/Timon/Documents/studienarbeitIRMB/logFiles/NumericalTestLogFiles/TaylorGreenVortexUx/viscosity_0.001/ux_ 0.016_Amplitude_ 0.005/CumulantAA2016CompSP27/logfile_20190211_153133_CumulantAA2016CompSP27_vis_0.001.txt");
-	std::vector<std::shared_ptr<LogFileData> > logFileDataVector = logFileReader->readLogFilesInDirectoryToLogFileData("C:/Users/Timon/Desktop/logFiles");
+	std::vector<Assistant> assistants;
+	//assistants.push_back(Phi);
+	//assistants.push_back(Ny);
+	//assistants.push_back(L2Norm);
+	//assistants.push_back(L2NormBetweenKernels);
+	assistants.push_back(Time);
+
+	std::vector<DataCombination> combination;
+	combination.push_back(EqualSimulationsForDifferentKernels);
+	//combination.push_back(EqualKernelSimulationsForDifferentViscosities);
 
-	std::shared_ptr<LogFileDataAssistant> assistent = LogFileDataAssistantImp::getNewInstance();
-	std::vector<std::shared_ptr<LogFileDataGroup> > logFileDataSorted = assistent->findEqualSimulationsForDifferentKernels(logFileDataVector, simulation);
-	//std::vector<std::vector<std::shared_ptr<LogFileData> > > logFileDataSorted = assistent->findEqualKernelSimulationsForDifferentViscosities(logFileDataVector, simulation);
+
+	std::shared_ptr<LogFileReader> logFileReader = LogFileReader::getInstance();
+	std::vector<std::shared_ptr<LogFileData> > logFileDataVector = logFileReader->readLogFilesInDirectoryToLogFileData("C:/Users/Timon/Documents/studienarbeitIRMB/logFiles");
 
 	std::shared_ptr<MathematicaFile> aMathmaticaFile = MathematicaFile::getNewInstance("C:/Users/Timon/Desktop");
+
+	std::shared_ptr<LogFileDataAssistant> assistentLogFile = LogFileDataAssistantImp::getNewInstance();
+
 	std::shared_ptr<MathematicaFunctionFactory> functionFactory = MathematicaFunctionFactoryImp::getNewInstance();
+	std::shared_ptr<MathematicaAssistantFactory> assistantFactory = MathematicaAssistantFactoryImp::getNewInstance();
+	std::vector<std::shared_ptr<MathematicaAssistant> > mathematicaAssistants = assistantFactory->makeMathematicaAssistants(assistants, functionFactory);
 
-	std::shared_ptr<PhiMathematicaAssistant> mathematicaAssistantPhi = PhiMathematicaAssistant::getNewInstance(functionFactory);
-	std::shared_ptr<NyMathematicaAssistant> mathematicaAssistantNy = NyMathematicaAssistant::getNewInstance(functionFactory);
-	
-	for (int i = 0; i < logFileDataSorted.size(); i++) {
-		mathematicaAssistantPhi->makeMathematicaOutput(logFileDataSorted.at(i), aMathmaticaFile);
-		mathematicaAssistantNy->makeMathematicaOutput(logFileDataSorted.at(i), aMathmaticaFile);
+	for (int sim = 0; sim < simulation.size(); sim++) {
+		for (int comb = 0; comb < combination.size(); comb++) {
+			std::vector<std::shared_ptr<LogFileDataGroup> > logFileDataSorted = assistentLogFile->findDataCombination(logFileDataVector, simulation.at(sim), combination.at(comb));
+			for (int i = 0; i < logFileDataSorted.size(); i++) {
+				for (int j = 0; j < mathematicaAssistants.size(); j++)
+					mathematicaAssistants.at(j)->makeMathematicaOutput(logFileDataSorted.at(i), aMathmaticaFile);
+			}
+		}
 	}
+	
 		
 	aMathmaticaFile->finishFile();
 	return 0;