diff --git a/QtMeshViewer/Header/MshFile.h b/QtMeshViewer/Header/MshFile.h
index b2423407a59e74167b41c817706a85806a26b2c9..7dc1744754c29958c4588b01b3bf1d4f5933b913 100644
--- a/QtMeshViewer/Header/MshFile.h
+++ b/QtMeshViewer/Header/MshFile.h
@@ -44,4 +44,5 @@ private:
 	void readUV(Segment* dataDestination, std::streampos position);
 
 	QMatrix4x4 getParentMatrix(std::string parent) const;
+	QQuaternion getParentRotation(std::string parent) const;
 };
\ No newline at end of file
diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp
index 714d534ba601b67baee396525173c182bd3daf0a..981390487258fc5781137447fd559376f58962d6 100644
--- a/QtMeshViewer/Source/GeometryEngine.cpp
+++ b/QtMeshViewer/Source/GeometryEngine.cpp
@@ -10,8 +10,6 @@ GeometryEngine::GeometryEngine()
 	: m_indexBuf(QOpenGLBuffer::IndexBuffer)
 {
 	initializeOpenGLFunctions();
-
-	loadFile("..\\Release\\Msh\\cubeTex.msh");
 }
 
 GeometryEngine::~GeometryEngine()
@@ -63,9 +61,10 @@ void GeometryEngine::loadFile(const char* filePath)
 				new_info.modelMatrix = modelIterator->m4x4Translation;
 				new_info.modelMatrix.rotate(modelIterator->quadRotation);
 
-				// add offset to indices
-				for (auto& it : segmentIterator->indices)
-					it += vertexOffset;
+				// add offset to indices, no need to do it for the first one (maybe it's very big)
+				if(vertexOffset != 0)
+					for (auto& it : segmentIterator->indices)
+						it += vertexOffset;
 
 				// save data
 				vertexData += segmentIterator->vertices;
diff --git a/QtMeshViewer/Source/MshFile.cpp b/QtMeshViewer/Source/MshFile.cpp
index 290aad9aaa92bf45da7beb2aeee917b1999dd1ab..49c41d9dc085bf8874ca7b9c85ec517a46737fad 100644
--- a/QtMeshViewer/Source/MshFile.cpp
+++ b/QtMeshViewer/Source/MshFile.cpp
@@ -291,14 +291,14 @@ void MshFile::analyseModlChunks(Model * dataDestination, std::list<ChunkHeader*>
 			for (int i = 0; i < 3; i++)
 				m_file.read(F2V(tmp_trans[i]), sizeof(float));
 
-			// modify the matrix
+			// modify the matrix and quaternion
 			dataDestination->m4x4Translation.scale(tmp_scale[0], tmp_scale[1], tmp_scale[2]);
 			dataDestination->m4x4Translation.translate(tmp_trans[0], tmp_trans[1], tmp_trans[2]);
 			dataDestination->quadRotation.setVector(QVector3D(tmp_rotation[0], tmp_rotation[1], tmp_rotation[2]));
 			dataDestination->quadRotation.setScalar(tmp_rotation[3]);
 
 			dataDestination->m4x4Translation = getParentMatrix(dataDestination->parent) * dataDestination->m4x4Translation;
-
+			dataDestination->quadRotation = getParentRotation(dataDestination->parent) * dataDestination->quadRotation;
 		}
 
 		// geometry data
@@ -406,10 +406,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
 		else if (!strcmp("STRP", it->name))
 		{
 			// don't get null, bone, shadowMesh and hidden mesh indices
-			if (m_currentType == null ||
-				m_currentType == bone ||
-				m_currentType == shadowMesh ||
-				m_currentRenderFlag == 1)
+			if (m_currentType == null || m_currentType == bone || m_currentType == shadowMesh || m_currentRenderFlag == 1)
 				continue;
 
 			// jump to the data section and read the size;
@@ -455,7 +452,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
 						for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++)
 							// ..calculate the edge indices
 							for (int triEdge = 0; triEdge < 3; triEdge++)
-								new_segment->indices.push_back((GLuint)tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
+								new_segment->indices.push_back(tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
 					}
 
 				}	// if 2 high bits are set
@@ -475,7 +472,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
 				for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++)
 					// ..calculate the edge indices
 					for (int triEdge = 0; triEdge < 3; triEdge++)
-						new_segment->indices.push_back((GLuint)tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
+						new_segment->indices.push_back(tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]);
 			}
 		}
 	}
@@ -610,7 +607,6 @@ QMatrix4x4 MshFile::getParentMatrix(std::string parent) const
 	{
 		if (!strcmp(parent.c_str(), it->name.c_str()))
 		{
-			//TODO: the other way around??
 			matrix = getParentMatrix(it->parent) * it->m4x4Translation;
 			break;
 		}
@@ -618,3 +614,19 @@ QMatrix4x4 MshFile::getParentMatrix(std::string parent) const
 
 	return matrix;
 }
+
+QQuaternion MshFile::getParentRotation(std::string parent) const
+{
+	QQuaternion rotation;
+
+	for (auto& it : *m_models)
+	{
+		if (!strcmp(parent.c_str(), it->name.c_str()))
+		{
+			rotation = getParentRotation(it->parent) * it->quadRotation;
+			break;
+		}
+	}
+
+	return rotation;
+}
diff --git a/QtMeshViewer/main.cpp b/QtMeshViewer/main.cpp
index 5621a5942c1d74f8d0b7acd95a0298c1153506f7..6eb27bae28754321633b6bd1512fc7e700f391d6 100644
--- a/QtMeshViewer/main.cpp
+++ b/QtMeshViewer/main.cpp
@@ -1,11 +1,13 @@
 #include "Header\MainWindow.h"
 #include <QtWidgets/QApplication>
 
+
 int main(int argc, char *argv[])
 {
 	QApplication a(argc, argv);
 
 	MainWindow w;
 	w.show();
+
 	return a.exec();
 }
diff --git a/Release/Msh/rotTest.msh b/Release/Msh/rotTest.msh
new file mode 100644
index 0000000000000000000000000000000000000000..b946224eafc7e69557cafa6970371c0a48fe0832
Binary files /dev/null and b/Release/Msh/rotTest.msh differ