diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp
index 3d338f4f20ea8e824f3f619e0a95eb1fca0bbc51..8bbdd96203f7b8fa93c091e1a2caf21a35cdb8d5 100644
--- a/src/obj/NiSkinData.cpp
+++ b/src/obj/NiSkinData.cpp
@@ -95,7 +95,7 @@ NiSkinData::NiSkinData( const Ref<NiTriBasedGeom> & owner ) NI_SKIN_DATA_CONSTRU
 	Matrix44 sr_world = skinInst->GetSkeletonRoot()->GetWorldTransform();
 
 	//Inverse owner NiTriBasedGeom matrix & multiply with skeleton root matrix
-	Matrix44 overall_mat = owner_mat.Inverse() * sr_world;
+	Matrix44 overall_mat = (owner_mat * sr_world.Inverse()).Inverse();
 
 	//Store result
 	overall_mat.Decompose( translation, rotation, scale );
diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp
index 87420c2e2f356110eec9f1ceb66b64e4e5fba6ce..77a90a2a10aa10aecfabd05946cccf2fd692f46c 100644
--- a/src/obj/NiTriBasedGeom.cpp
+++ b/src/obj/NiTriBasedGeom.cpp
@@ -254,13 +254,17 @@ vector<Vector3> NiTriBasedGeom::GetSkinInfluencedVertices() const {
 	vector<Vector3> skin_verts( vertices.size());
 
 	//Transform vertices into position based on skin data
-	Matrix44 root_world = skel_root->GetWorldTransform();
+	Matrix44 skel_root_inv = skel_root->GetWorldTransform().Inverse();
 	Matrix44 geom_world = GetWorldTransform();
+	Matrix44 overall_offset = skin_data->GetOverallTransform();
+
 	for ( uint i = 0; i < skin_data->GetBoneCount(); ++i ) {
 		Matrix44 bone_world = bone_nodes[i]->GetWorldTransform();
 		Matrix44 bone_offset = skin_data->GetBoneTransform(i);
 		vector<SkinWeight> weights = skin_data->GetBoneWeights(i);
-		Matrix44 vert_trans =  bone_offset * bone_world;
+		//Matrix44 vert_trans =  bone_offset * skel_root_inv * bone_world * overall_offset * geom_world;
+		Matrix44 vert_trans = geom_world * bone_world * skel_root_inv * overall_offset * bone_offset;
+
 		for ( uint j = 0; j < weights.size(); ++j ) {
 			uint index = weights[j].index;
 			float weight = weights[j].weight;