diff --git a/targets/tests/NumericalTests/Utilities/Test/SimulationObserver.h b/targets/tests/NumericalTests/Utilities/Test/SimulationObserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..46e771d746a5f932a9de81e309290180d052fb95
--- /dev/null
+++ b/targets/tests/NumericalTests/Utilities/Test/SimulationObserver.h
@@ -0,0 +1,12 @@
+#ifndef SIMULATION_OBSERVER_H
+#define SIMULATION_OBSERVER_H
+
+class SimulationObserver
+{
+public:
+	virtual void update() = 0;
+
+private:
+
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTests/Utilities/Test/Test.h b/targets/tests/NumericalTests/Utilities/Test/Test.h
new file mode 100644
index 0000000000000000000000000000000000000000..ff3840ca5be0448e444cad296bb84794e116fca8
--- /dev/null
+++ b/targets/tests/NumericalTests/Utilities/Test/Test.h
@@ -0,0 +1,25 @@
+#ifndef TEST_H
+#define TEST_H
+
+#include "SimulationObserver.h"
+
+#include <memory>
+#include <vector>
+#include <string>
+
+class TestSimulation;
+class SimulationInfo;
+
+class Test : public SimulationObserver 
+{
+public:
+	virtual void update() = 0;
+	virtual void addSimulation(std::shared_ptr< TestSimulation> sim, std::shared_ptr< SimulationInfo> simInfo) = 0;
+	virtual std::string getLogFileOutput() = 0;
+	virtual std::vector< bool> getPassedTests() = 0;
+	virtual void makeOutput() = 0;
+
+private:
+
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTests/Utilities/Test/TestImp.cpp b/targets/tests/NumericalTests/Utilities/Test/TestImp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b9df1ebaec1d8b62407fe9fd05b0d165387ee79
--- /dev/null
+++ b/targets/tests/NumericalTests/Utilities/Test/TestImp.cpp
@@ -0,0 +1,46 @@
+#include "TestImp.h"
+
+#include "Utilities\TestSimulation\TestSimulation.h"
+
+void TestImp::update()
+{
+	for (int i = 0; i < simulations.size(); i++)
+	{
+		if(simulationRun.at(i) == false)
+		{
+			if (simulations.at(i)->getSimulationRun())
+			{
+				simulationRun.at(i) = true;
+				simResults.at(i) = simulations.at(i)->getSimulationResults();
+			}
+		}
+	}
+
+	if (CheckAllSimulationRun())
+		evaluate();				
+}
+
+void TestImp::addSimulation(std::shared_ptr<TestSimulation> sim, std::shared_ptr< SimulationInfo> simInfo)
+{
+	simulations.push_back(sim);
+	simInfos.push_back(simInfo);
+	simulationRun.push_back(false);
+	simResults.resize(simResults.size() + 1);
+}
+
+TestImp::TestImp()
+{
+	simulationRun.resize(0);
+	simulations.resize(0);
+	simResults.resize(0);
+	simInfos.resize(0);
+}
+
+bool TestImp::CheckAllSimulationRun()
+{
+	for(int i=0; i< simulationRun.size(); i++)
+		if(simulationRun.at(i)==false)
+			return false;
+	
+	return true;
+}
diff --git a/targets/tests/NumericalTests/Utilities/Test/TestImp.h b/targets/tests/NumericalTests/Utilities/Test/TestImp.h
new file mode 100644
index 0000000000000000000000000000000000000000..9086b97ddb24a66cc372b93b142629998c95c401
--- /dev/null
+++ b/targets/tests/NumericalTests/Utilities/Test/TestImp.h
@@ -0,0 +1,30 @@
+#ifndef TEST_IMP_H
+#define TEST_IMP_H
+
+#include "Utilities\Test\Test.h"
+
+#include <vector>
+
+class TestSimulation;
+class SimulationResults;
+class SimulationInfo;
+
+class TestImp : public Test
+{
+public:
+	void update();
+	void addSimulation(std::shared_ptr< TestSimulation> sim, std::shared_ptr< SimulationInfo> simInfo);
+
+	virtual void evaluate() = 0;
+	
+protected:
+	TestImp();
+	bool CheckAllSimulationRun();
+
+
+	std::vector< bool> simulationRun;
+	std::vector< std::shared_ptr< TestSimulation>> simulations;
+	std::vector< std::shared_ptr< SimulationResults>> simResults;
+	std::vector< std::shared_ptr< SimulationInfo>> simInfos;
+};
+#endif 
\ No newline at end of file
diff --git a/targets/tests/NumericalTests/Utilities/Test/package.include b/targets/tests/NumericalTests/Utilities/Test/package.include
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391