diff --git a/Tests/UnitTests/TestCore/LLDataTest.h b/Tests/UnitTests/TestCore/LLDataTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..68e60d00db6c0d8b04f87b47eeba5d130fdbb36f
--- /dev/null
+++ b/Tests/UnitTests/TestCore/LLDataTest.h
@@ -0,0 +1,307 @@
+#ifndef LLDATATEST_H
+#define LLDATATEST_H
+
+#include "LLData.h"
+#include <algorithm>
+
+#include "gtest/gtest.h"
+
+class LLDataTest : public ::testing::Test
+{
+ protected:
+    LLDataTest();
+    virtual ~LLDataTest();
+
+
+    LLData<int> *int_data_0d;
+    LLData<float> *fl_data_1d;
+    LLData<double> *db_data_3d;
+};
+
+LLDataTest::LLDataTest()
+{
+	int *dim0 = new int[(size_t)0];
+	
+	int *dim1 = new int[(size_t)1];
+	dim1[0] = 10;
+
+	int *dim3 = new int[(size_t)3];
+	dim3[0] = 10;
+	dim3[1] = 15;
+	dim3[2] = 20;
+	
+	int_data_0d = new LLData<int>((size_t)0, dim0);
+	fl_data_1d  = new LLData<float>((size_t)1, dim1);
+	db_data_3d  = new LLData<double>((size_t)3, dim3);
+}
+
+LLDataTest::~LLDataTest()
+{
+}
+
+TEST_F(LLDataTest, TotalSize)
+{
+    EXPECT_EQ((size_t)1, int_data_0d->getTotalSize());
+    EXPECT_EQ((size_t)10, fl_data_1d->getTotalSize());
+    EXPECT_EQ((size_t)3000, db_data_3d->getTotalSize());
+}
+
+TEST_F(LLDataTest, GetRank)
+{
+    EXPECT_EQ((size_t)0, int_data_0d->getRank());
+    EXPECT_EQ((size_t)1, fl_data_1d->getRank());
+    EXPECT_EQ((size_t)3, db_data_3d->getRank());
+}
+
+
+
+TEST_F(LLDataTest, SetAll)
+{
+    db_data_3d->setAll(1.0);
+    EXPECT_EQ( (*db_data_3d)[0], 1.0);
+}
+
+TEST_F(LLDataTest, ScaleAll)
+{
+    db_data_3d->setAll(2.0);
+    db_data_3d->scaleAll(2.5);
+    EXPECT_EQ( (*db_data_3d)[0], 5.0);
+}
+
+TEST_F(LLDataTest, TotalSum)
+{
+    fl_data_1d->setAll(2.0);
+    EXPECT_EQ( fl_data_1d->getTotalSum(), 20.0);
+
+	db_data_3d->setAll(0.5);
+    EXPECT_EQ( db_data_3d->getTotalSum(), 1500.0);
+
+}
+
+TEST_F(LLDataTest, GetDimensions) {
+//	EXPECT_EQ( int_data_0d->getDimensions(), NULL);
+	EXPECT_EQ( fl_data_1d->getDimensions()[0], 10);
+	EXPECT_EQ( db_data_3d->getDimensions()[1], 15);
+}
+
+TEST_F(LLDataTest, DataCopyingConstructor) {
+	LLData<int> *other_int_data_0d = new LLData<int>(*int_data_0d);
+	EXPECT_TRUE(HaveSameDimensions(*int_data_0d, *other_int_data_0d));	
+
+	fl_data_1d->setAll(1.2);
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	EXPECT_TRUE(HaveSameDimensions(*fl_data_1d, *other_fl_data_1d));
+	EXPECT_EQ( (*other_fl_data_1d)[0], 1.2f);	
+	EXPECT_EQ(fl_data_1d->getTotalSum(), other_fl_data_1d->getTotalSum());	
+	
+	db_data_3d->setAll(1.17);
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	EXPECT_TRUE(HaveSameDimensions(*db_data_3d, *other_db_data_3d));
+	EXPECT_EQ( (*other_db_data_3d)[10], 1.17);	
+	EXPECT_EQ(db_data_3d->getTotalSum(), other_db_data_3d->getTotalSum());	
+	
+	delete other_int_data_0d;
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F(LLDataTest, DataAssignment) {
+	
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	fl_data_1d->setAll(1.1f);
+	(*other_fl_data_1d) =  (*fl_data_1d);
+	EXPECT_EQ( (*other_fl_data_1d)[0], 1.1f);	
+	EXPECT_EQ(fl_data_1d->getTotalSum(), other_fl_data_1d->getTotalSum());	
+	
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	db_data_3d->setAll(1.27);
+	(*other_db_data_3d) =  (*db_data_3d);
+	EXPECT_EQ( (*other_db_data_3d)[11], 1.27);	
+	EXPECT_EQ(db_data_3d->getTotalSum(), other_db_data_3d->getTotalSum());	
+	
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F(LLDataTest, Addition) {
+	
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	fl_data_1d->setAll(1.1f);
+	other_fl_data_1d->setAll(2.9f);
+	(*other_fl_data_1d) +=  (*fl_data_1d);
+	EXPECT_EQ( (*other_fl_data_1d)[0], 4.0f);	
+	EXPECT_EQ(other_fl_data_1d->getTotalSum(), 40.0f);	
+	
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	db_data_3d->setAll(1.27);
+	other_db_data_3d->setAll(0.73);
+	(*other_db_data_3d) +=  (*db_data_3d);
+	EXPECT_EQ( (*other_db_data_3d)[11], 2.0);	
+	EXPECT_EQ(other_db_data_3d->getTotalSum(), 6000.0);	
+
+	int *odim1 = new int[(size_t)1];
+	odim1[0] = 12;
+	LLData<float>  *fl_data_1d2  = new LLData<float>((size_t)1, odim1);
+	fl_data_1d2->setAll(10.0);
+
+	EXPECT_THROW((*fl_data_1d) += (*fl_data_1d2), RuntimeErrorException);
+
+	delete fl_data_1d2;
+	delete odim1;
+	
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F(LLDataTest, Substraction) {
+	
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	fl_data_1d->setAll(1.15f);
+	other_fl_data_1d->setAll(5.15f);
+	(*other_fl_data_1d) -=  (*fl_data_1d);
+	EXPECT_EQ( (*other_fl_data_1d)[0], 4.0f);	
+	EXPECT_EQ(other_fl_data_1d->getTotalSum(), 40.0f);	
+	
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	db_data_3d->setAll(1.27);
+	other_db_data_3d->setAll(1.77);
+	(*other_db_data_3d) -=  (*db_data_3d);
+	EXPECT_EQ( (*other_db_data_3d)[11], 0.5);	
+	EXPECT_EQ(other_db_data_3d->getTotalSum(), 1500.0);	
+
+	int *odim1 = new int[(size_t)1];
+	odim1[0] = 12;
+	LLData<float>  *fl_data_1d2  = new LLData<float>((size_t)1, odim1);
+	fl_data_1d2->setAll(10.0);
+
+	EXPECT_THROW((*fl_data_1d) -= (*fl_data_1d2), RuntimeErrorException);
+
+	delete fl_data_1d2;
+	delete odim1;
+	
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F(LLDataTest, Multiplication) {
+	
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	fl_data_1d->setAll(1.15f);
+	other_fl_data_1d->setAll(2.0f);
+	(*other_fl_data_1d) *=  (*fl_data_1d);
+	EXPECT_EQ( (*other_fl_data_1d)[0], 2.30f);	
+	EXPECT_EQ(other_fl_data_1d->getTotalSum(), 23.0f);	
+	
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	db_data_3d->setAll(1.25);
+	other_db_data_3d->setAll(2.0);
+	(*other_db_data_3d) *=  (*db_data_3d);
+	EXPECT_EQ( (*other_db_data_3d)[11], 2.5);	
+	EXPECT_EQ(other_db_data_3d->getTotalSum(), 7500.0);	
+
+	int *odim1 = new int[(size_t)1];
+	odim1[0] = 12;
+	LLData<float>  *fl_data_1d2  = new LLData<float>((size_t)1, odim1);
+	fl_data_1d2->setAll(10.0);
+
+	EXPECT_THROW((*fl_data_1d) *= (*fl_data_1d2), RuntimeErrorException);
+
+	delete fl_data_1d2;
+	delete odim1;
+	
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F(LLDataTest, Division) {
+	
+	LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+	fl_data_1d->setAll(1.15f);
+	other_fl_data_1d->setAll(2.3f);
+	(*other_fl_data_1d) /=  (*fl_data_1d);
+	EXPECT_EQ( (*other_fl_data_1d)[0], 2.0f);	
+	EXPECT_EQ(other_fl_data_1d->getTotalSum(), 20.0f);	
+	
+	LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+	db_data_3d->setAll(1.25);
+	other_db_data_3d->setAll(2.5);
+	(*other_db_data_3d) /=  (*db_data_3d);
+	EXPECT_EQ( (*other_db_data_3d)[11], 2.0);	
+	EXPECT_EQ(other_db_data_3d->getTotalSum(), 6000.0);	
+
+	int *odim1 = new int[(size_t)1];
+	odim1[0] = 12;
+	LLData<float>  *fl_data_1d2  = new LLData<float>((size_t)1, odim1);
+	fl_data_1d2->setAll(10.0);
+
+	EXPECT_THROW((*fl_data_1d) /= (*fl_data_1d2), RuntimeErrorException);
+
+	delete fl_data_1d2;
+	delete odim1;
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+}
+
+TEST_F (LLDataTest, HaveSameDimensions) {
+	int *odim0 = new int[(size_t)0];
+	
+	int *odim1 = new int[(size_t)1];
+	odim1[0] = 10;
+
+	int *odim3 = new int[(size_t)3];
+	odim3[0] = 10;
+	odim3[1] = 15;
+	odim3[2] = 20;
+	
+	LLData<int>    *other_int_data_0d = new LLData<int>((size_t)0, odim0);
+	LLData<float>  *other_fl_data_1d  = new LLData<float>((size_t)1, odim1);
+	LLData<double> *other_db_data_3d  = new LLData<double>((size_t)3, odim3);
+
+	EXPECT_TRUE(HaveSameDimensions(*int_data_0d, *other_int_data_0d));	
+	EXPECT_TRUE(HaveSameDimensions(*fl_data_1d, *other_fl_data_1d));	
+	EXPECT_TRUE(HaveSameDimensions(*db_data_3d, *other_db_data_3d));	
+	
+	odim3[1] = 25;
+	LLData<double> *some_other_db_data_3d  = new LLData<double>((size_t)3, odim3);
+	EXPECT_FALSE(HaveSameDimensions(*db_data_3d, *some_other_db_data_3d));	
+
+	delete other_int_data_0d;
+	delete other_fl_data_1d;
+	delete other_db_data_3d;
+	delete some_other_db_data_3d;
+	delete odim0;
+	delete odim1;
+	delete odim3;
+}
+
+TEST_F(LLDataTest, Accessors) {
+	for (size_t i=0; i < fl_data_1d->getTotalSize(); ++i) {
+		(*fl_data_1d)[i] = 0.5f*i;
+	}
+	EXPECT_EQ((*fl_data_1d)[2], 1.0f);
+	
+	int *coordinate = new int[(size_t)1];
+	coordinate[0] = 2;
+	EXPECT_EQ(fl_data_1d->atCoordinate(coordinate), 1.0f);
+	EXPECT_EQ(fl_data_1d->getTotalSum(), 22.5f);
+
+	for (size_t i=0; i < db_data_3d->getTotalSize(); ++i) {
+		(*db_data_3d)[i] = 0.2*i;
+	}
+	
+	EXPECT_EQ((*db_data_3d)[2], 0.4);
+	int *coordinate3d = new int[(size_t)3];
+	coordinate3d[0] = 0;
+	coordinate3d[1] = 0;
+	coordinate3d[2] = 2;
+
+	EXPECT_EQ(db_data_3d->atCoordinate(coordinate3d), 0.4);
+	EXPECT_EQ(db_data_3d->getTotalSum(), 899700.0);
+
+	delete coordinate;
+	delete coordinate3d;
+
+}
+
+
+#endif // LLDATATEST_H
diff --git a/Tests/UnitTests/TestCore/main.cpp b/Tests/UnitTests/TestCore/main.cpp
index 60cb69cc1dd269bf9f778c35548339c2e131414c..fae8b925097fd87e021c2e9249341da542f586fb 100644
--- a/Tests/UnitTests/TestCore/main.cpp
+++ b/Tests/UnitTests/TestCore/main.cpp
@@ -21,6 +21,7 @@
 #include "RealParameterWrapperTest.h"
 #include "SimulationTest.h"
 #include "ThreadInfoTest.h"
+#include "LLDataTest.h"
 
 
 struct ErrorStreamRedirect {