diff --git a/src/ComplexShape.cpp b/src/ComplexShape.cpp
index a5d3237db1d784e3419de3a266dbdc372a7fe7b3..b2988dac042066e26f2f279b10e5f789091c6be4 100644
--- a/src/ComplexShape.cpp
+++ b/src/ComplexShape.cpp
@@ -531,18 +531,36 @@ void ComplexShape::Merge( NiAVObject * root ) {
 
 				for(int y = 0; y < skin_partition->GetNumPartitions(); y++) {
 					vector<Triangle> partition_triangles = skin_partition->GetTriangles(y);
+					vector<unsigned short> partition_vertex_map = skin_partition->GetVertexMap(y);
+					bool has_vertex_map = false;
+
+					if(partition_vertex_map.size() > 0) {
+						has_vertex_map = true;
+					}
 
 					for(int z = 0; z < partition_triangles.size(); z++) {
 						int w = faces.size() - shapeTris.size();
-						int merged_x = lookUp[partition_triangles[z].v1].vertIndex;
-						int merged_y = lookUp[partition_triangles[z].v2].vertIndex;
-						int merged_z = lookUp[partition_triangles[z].v3].vertIndex;
+
+						int merged_x;
+						int merged_y;
+						int merged_z;
+
+						if(has_vertex_map == true) {
+							merged_x = lookUp[partition_vertex_map[partition_triangles[z].v1]].vertIndex;
+							merged_y = lookUp[partition_vertex_map[partition_triangles[z].v2]].vertIndex;
+							merged_z = lookUp[partition_vertex_map[partition_triangles[z].v3]].vertIndex;
+						} else {
+							merged_x = lookUp[partition_triangles[z].v1].vertIndex;
+							merged_y = lookUp[partition_triangles[z].v2].vertIndex;
+							merged_z = lookUp[partition_triangles[z].v3].vertIndex;
+						}
 
 						for(; w < faces.size(); w++) {
 							ComplexFace current_face = faces[w];
-							bool is_same_face = false;
 
-							if(current_face.points[0].vertexIndex == merged_x) {
+							//keep this commented code is case my theory that all triangles must have vertices arranged in a certain way and that you can't rearrange vertices in a triangle
+
+							/*if(current_face.points[0].vertexIndex == merged_x) {
 								if(current_face.points[1].vertexIndex == merged_y && current_face.points[2].vertexIndex == merged_z) {
 									is_same_face = true;
 									break;
@@ -566,14 +584,16 @@ void ComplexShape::Merge( NiAVObject * root ) {
 									is_same_face = true;
 									break;
 								}
-							}
-						}
+							} */
 
-						if(w < faces.size() && w >= faces.size() - shapeTris.size()) {
-							current_body_parts_faces[w - shapeTris.size()] = y;
-						} else {
-							throw runtime_error("Could not find a skin partition face inside the complex shape faces");
+							if(current_face.points[0].vertexIndex == merged_x && current_face.points[1].vertexIndex == merged_y && current_face.points[2].vertexIndex == merged_z) {
+								break;
+							}
 						}
+						
+						if(w - (faces.size() - shapeTris.size()) < shapeTris.size()) {
+							current_body_parts_faces[w - (faces.size() - shapeTris.size())] = y;
+						} 
 					}
 				}