diff --git a/include/ComplexShape.h b/include/ComplexShape.h
index 8252bf0eb9f1ea539f1ff43c0686bcd172861a2d..28ab9fb2f0ae30a210a01e4a30c410a6f83b96e1 100644
--- a/include/ComplexShape.h
+++ b/include/ComplexShape.h
@@ -5,6 +5,7 @@ All rights reserved.  Please see niflib.h for license. */
 #define _COMPLEX_SHAPE_H_
 
 #include "Ref.h"
+#include "obj/BSDismemberSkinInstance.h"
 #include "nif_math.h"
 #include "nif_basic_types.h"
 #include "gen/BodyPartList.h"
@@ -19,6 +20,7 @@ class NiProperty;
 class NiNode;
 class NiAVObject;
 class NiTriBasedGeom;
+class BSDismemberSkinInstance;
 
 /*! Marks empty data indices */
 const unsigned int CS_NO_INDEX = 0xFFFFFFFF;
@@ -171,7 +173,9 @@ public:
 	 * \param stripify Whether or not to generate efficient triangle strips.
 	 * \param tangent_space Whether or not to generate Oblivion tangent space
 	 * information.
-	 * \return A referene to the root NiAVObject that was created.
+	 * \param min_vertex_weight Remove vertex weights bellow a given value
+	 * \param use_dismember_partitions Uses BSDismemberSkinInstance with custom partitions for dismember
+	 * \return A reference to the root NiAVObject that was created.
 	 */
 	NIFLIB_API Ref<NiAVObject> Split( 
 		NiNode * parent,
@@ -179,7 +183,8 @@ public:
 		int max_bones_per_partition = 4,
 		bool stripify = false,
 		bool tangent_space = false,
-		float min_vertex_weight = 0.001f
+		float min_vertex_weight = 0.001f,
+		bool use_dismember_partitions = false
 	) const;
 
 	/* 
@@ -294,19 +299,32 @@ public:
 	NIFLIB_API vector< Ref<NiNode> > GetSkinInfluences() const;
 
 	/*
-	 * Gets the dismember groups from the ComplexShape. These groups split the mesh into submeshes and in games like Fallout3 are responsibile for how a body ca be "dismembered"
-	 * \return The dismember groups
+	 * Gets the association between the faces in the complex shape and the corresponding body parts
+	 * \return A vector depicting the association
 	 */
-	NIFLIB_API vector<pair<BodyPartList, vector<int>>> GetDismemberGroups() const;
+	NIFLIB_API vector<int> GetDismemberPartitionsFaces() const;
 
 	/*
-	 * Sets the dismember groups from the ComplexShape. These groups split the mesh into submeshes and in games like Fallout3 are responsibile for how a body ca be "dismembered"
-	 * \param[in] The new dismember groups
+	 * Sets the association between the body parts and the faces in the complex shape
+	 * \param[in] The new association meaning that the face at the position of the index corresponds to the body part group given by the value at the position of the index of the face
 	 */
-	NIFLIB_API void SetDismemberGroups( vector< pair< BodyPartList, vector<int> > > value );
+	NIFLIB_API void SetDismemberPartitionsFaces( vector<int> value );
+
+	/*
+	 * Gets a list of the dismember groups
+	 * \return The list of the dismember groups
+	 */
+	NIFLIB_API vector<BodyPartList> GetDismemberPartitionsBodyParts() const;
+
+	/*
+	 * Gets the association between the faces in the complex shape and the corresponding body parts
+	 * \param[in] A list of the dismember groups;
+	 */
+	NIFLIB_API void SetDismemberPartitionsBodyParts( vector<BodyPartList> value);
 
 private:
-	vector<pair<BodyPartList, vector<int>>> dismemberGroups;
+	vector<BodyPartList> dismemberPartitionsBodyParts;
+	vector<int> dismemberPartitionsFaces;
 	vector<WeightedVertex> vertices;
 	vector<Color4> colors;
 	vector<Vector3> normals;
diff --git a/include/obj/NiTriBasedGeom.h b/include/obj/NiTriBasedGeom.h
index 420ec6f0340b303c3525c118f5b8d79ef95d0359..90f4806bbda26f104bd3cd0657d3057e001bc08c 100644
--- a/include/obj/NiTriBasedGeom.h
+++ b/include/obj/NiTriBasedGeom.h
@@ -11,7 +11,7 @@ All rights reserved.  Please see niflib.h for license. */
 #define _NITRIBASEDGEOM_H_
 
 //--BEGIN FILE HEAD CUSTOM CODE--//
-#include "BodyPartList.h"
+#include "../gen/BodyPartList.h"
 //--END CUSTOM CODE--//
 
 #include "NiGeometry.h"
@@ -62,12 +62,6 @@ public:
 	 */
 	NIFLIB_API void GenHardwareSkinInfo( int max_bones_per_partition = 4, int max_bones_per_vertex = 4, bool bStrippify = true, int* face2PartMap = NULL );
 
-	/*!
-	 * This generates dismember skin data for hardware acceleration.  Specifically, it creates a NiDismemberSkinPartition object based on the current skin weights.  This splits up the mesh into smaller parts that are affected by fewer bones so that they can be processed by 3D accelerator hardware.
-	 * \param[in] dismember_groups A collection of pairs of body part list - face indexes that splits the mesh into submeshes that corresponds to various body parts
-	 */
-	NIFLIB_API void GenHardwareDismemberSkinInfo( vector< pair <BodyPartList, vector < int> > > dismember_groups);
-
 	/*!
 	 * This clears any hardware acceleration skin data that was previously created.
 	 */
diff --git a/src/ComplexShape.cpp b/src/ComplexShape.cpp
index 089af530d4b6fe282b418009d7c2a01f37895c1b..0a4141c3cacba4368bd8e35686f46bbf5b5ad780 100644
--- a/src/ComplexShape.cpp
+++ b/src/ComplexShape.cpp
@@ -137,12 +137,20 @@ void ComplexShape::SetSkinInfluences( const vector< Ref<NiNode> > & n ) {
 	skinInfluences = n;
 }
 
-vector<pair<BodyPartList, vector<int>>> ComplexShape::GetDismemberGroups() const {
-	return dismemberGroups;
+vector<int> ComplexShape::GetDismemberPartitionsFaces() const {
+	return dismemberPartitionsFaces;
 }
 
-void ComplexShape::SetDismemberGroups( vector< pair< BodyPartList, vector<int> > > value ) {
-	dismemberGroups = value;
+void ComplexShape::SetDismemberPartitionsFaces( vector<int> value ) {
+	dismemberPartitionsFaces = value;
+}
+
+vector<BodyPartList> ComplexShape::GetDismemberPartitionsBodyParts() const {
+	return dismemberPartitionsBodyParts;
+}
+
+void ComplexShape::SetDismemberPartitionsBodyParts( vector<BodyPartList> value ) {
+	dismemberPartitionsBodyParts = value;
 }
 
 string ComplexShape::GetName() const {
@@ -186,6 +194,8 @@ void ComplexShape::Clear() {
 	propGroups.clear();
 	skinInfluences.clear();
 	name.clear();
+	dismemberPartitionsBodyParts.clear();
+	dismemberPartitionsFaces.clear();
 }
 
 void ComplexShape::Merge( NiAVObject * root ) {
@@ -544,13 +554,19 @@ void ComplexShape::Merge( NiAVObject * root ) {
 	//Done Merging
 }
 
-Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int max_bones_per_partition, bool stripify, bool tangent_space, float min_vertex_weight ) const {
+Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int max_bones_per_partition, bool stripify, bool tangent_space, float min_vertex_weight, bool use_dismember_partitions ) const {
 
 	//Make sure parent is not NULL
 	if ( parent == NULL ) {
 		throw runtime_error ("A parent is necessary to split a complex shape.");
 	}
 
+	if( use_dismember_partitions == true ) {
+		if(dismemberPartitionsFaces.size() != faces.size()) {
+			throw runtime_error ("The number of faces mapped to skin partitions is different from the actual face count.");
+		}
+	}
+	
 	//There will be one NiTriShape per property group
 	//with a minimum of 1
 	unsigned int num_shapes = (unsigned int)(propGroups.size());
@@ -595,7 +611,7 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 
 	parent->AddChild( root );
 
-	//Set transfrm of root
+	//Set transform of root
 	root->SetLocalTransform( transform );
 
 	//Create NiTriShapeData and fill it out with all data that is relevant
@@ -618,6 +634,12 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 		//List of triangles for the final shape to use
 		vector<Triangle> shapeTriangles;
 
+		//a vector that holds in what dismember groups or skin partition does each face belong
+		vector<BodyPartList> current_dismember_partitions;
+
+		//create a map betweem the faces and the dismember groups
+		vector<int> current_dismember_partitions_faces;
+
 		//Loop through all faces, and all points on each face
 		//to set the vertices in the CompoundVertex list
 		for ( vector<ComplexFace>::const_iterator face = faces.begin(); face != faces.end(); ++face ) {
@@ -686,19 +708,64 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 				//Next Point
 			}
 
-			//Starting from vertex 0, create a fan of triangles to fill
-			//in non-triangle polygons
-			Triangle new_face;
-			for ( unsigned int i = 0; i < shapeFacePoints.size() - 2; ++i ) {
-				new_face[0] = shapeFacePoints[0];
-				new_face[1] = shapeFacePoints[i+1];
-				new_face[2] = shapeFacePoints[i+2];
+			if(use_dismember_partitions == false) {
+				//Starting from vertex 0, create a fan of triangles to fill
+				//in non-triangle polygons
+				Triangle new_face;
+				for ( unsigned int i = 0; i < shapeFacePoints.size() - 2; ++i ) {
+					new_face[0] = shapeFacePoints[0];
+					new_face[1] = shapeFacePoints[i+1];
+					new_face[2] = shapeFacePoints[i+2];
+
+					//Push the face into the face list
+					shapeTriangles.push_back(new_face);
+				}
+
+				//Next Face
+			} else {
+				//Starting from vertex 0, create a fan of triangles to fill
+				//in non-triangle polygons
+				Triangle new_face;
+				for ( unsigned int i = 0; i < shapeFacePoints.size() - 2; ++i ) {
+					new_face[0] = shapeFacePoints[0];
+					new_face[1] = shapeFacePoints[i+1];
+					new_face[2] = shapeFacePoints[i+2];
+
+					//Push the face into the face list
+					shapeTriangles.push_back(new_face);
+
+					//all the resulting triangles belong in the the same dismember partition or better said skin partition
+					current_dismember_partitions_faces.push_back(dismemberPartitionsFaces[i]);
+				}
+			}			
+		}
 
-				//Push the face into the face list
-				shapeTriangles.push_back(new_face);
+		//Clean up the dismember skin partitions
+		//if no face points to a certain dismember partition then that dismember partition must be removed
+		if(use_dismember_partitions == true) {
+			vector<bool> used_dismember_groups;
+			for(int x = 0; x < current_dismember_partitions.size(); x++) {
+				used_dismember_groups.push_back(false);
+			}
+			for(int x = 0; x < current_dismember_partitions_faces.size(); x++) {
+				if(used_dismember_groups[current_dismember_partitions_faces[x]] == false) {
+					used_dismember_groups[current_dismember_partitions_faces[x]] = true;
+				}	
 			}
 
-			//Next Face
+			vector<BodyPartList> cleaned_up_dismember_partitions;
+			for(int x = 0; x < current_dismember_partitions.size(); x++) {
+				if (used_dismember_groups[x] == false) {
+					for(int y = 0; y < current_dismember_partitions_faces.size(); y++) {
+						if(current_dismember_partitions_faces[y] > x) {
+							current_dismember_partitions_faces[y]--;
+						}
+					}
+				} else {
+					cleaned_up_dismember_partitions.push_back(current_dismember_partitions[x]);
+				} 
+			}
+			current_dismember_partitions = cleaned_up_dismember_partitions;
 		}
 
 		//Attatch properties if any
@@ -709,7 +776,7 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 		}
 
 		//--Set Shape Data--//
-
+		
 		//lists to hold data
 		vector<Vector3> shapeVerts( compVerts.size() );
 		vector<Vector3> shapeNorms( compVerts.size() );
@@ -719,7 +786,7 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 		map<NiNodeRef, vector<SkinWeight> > shapeWeights;
 
 		//Search for a NiTexturingProperty to build list of
-		//texture cooridinate sets to create
+		//texture coordinates sets to create
 		NiPropertyRef niProp = shapes[shape_num]->GetPropertyByType( NiTexturingProperty::TYPE );
 		NiTexturingPropertyRef niTexProp;
 		if ( niProp != NULL ) {
@@ -800,7 +867,12 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 				shapeInfluences.push_back( inf->first );
 			}
 
-			shapes[shape_num]->BindSkin( shapeInfluences );
+			if(use_dismember_partitions == false) {
+				shapes[shape_num]->BindSkin( shapeInfluences );
+			} else {
+				shapes[shape_num]->BindSkinWith( shapeInfluences, BSDismemberSkinInstance::Create );
+			}
+			
 
 			for ( unsigned int inf = 0; inf < shapeInfluences.size(); ++inf ) {
 				shapes[shape_num]->SetBoneWeights( inf, shapeWeights[ shapeInfluences[inf] ] );
@@ -808,7 +880,17 @@ Ref<NiAVObject> ComplexShape::Split( NiNode * parent, Matrix44 & transform, int
 
 			shapes[shape_num]->NormalizeSkinWeights();
 
-			if ( max_bones_per_partition > 0 ) {
+			if(use_dismember_partitions == true ) {
+				int* face_map = new int[current_dismember_partitions_faces.size()];
+				for(int x = 0; x < current_dismember_partitions_faces.size(); x++) {
+					face_map[x] = current_dismember_partitions_faces[x];
+				}
+				shapes[ shape_num]->GenHardwareSkinInfo( max_bones_per_partition, 4, stripify, face_map);
+				delete[] face_map;
+
+				BSDismemberSkinInstanceRef dismember_skin = DynamicCast<BSDismemberSkinInstance>(shapes[ shape_num]->GetSkinInstance());
+				dismember_skin->SetPartitions(current_dismember_partitions);
+			} else if ( max_bones_per_partition > 0 ) {
 				shapes[shape_num]->GenHardwareSkinInfo( max_bones_per_partition, 4, stripify);
 			}
 
diff --git a/src/obj/BSDismemberSkinInstance.cpp b/src/obj/BSDismemberSkinInstance.cpp
index 3427ee47c24d9c115a1435b8446fed4e25151e83..6b0f3483f7cae6d7d14e09df0892250530db1180 100644
--- a/src/obj/BSDismemberSkinInstance.cpp
+++ b/src/obj/BSDismemberSkinInstance.cpp
@@ -127,7 +127,10 @@ vector<BodyPartList > BSDismemberSkinInstance::GetPartitions() const {
 }
 
 void BSDismemberSkinInstance::SetPartitions( const vector<BodyPartList >& value ) {
-   partitions = value;
+   partitions.clear();
+   for(int i = 0; i < value.size(); i++) {
+	   partitions.push_back(value[i]);
+   }
 }
 
 //--END CUSTOM CODE--//
diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp
index 707b25e4351f4378bc5f54f364401a64a32be530..5bd06fdbd780dfa3abd80b949959e1c9aabbd48c 100644
--- a/src/obj/NiTriBasedGeom.cpp
+++ b/src/obj/NiTriBasedGeom.cpp
@@ -131,10 +131,6 @@ void NiTriBasedGeom::GenHardwareSkinInfo( int max_bones_per_partition /*= 4*/, i
    }
 }
 
-void NiTriBasedGeom::GenHardwareDismemberSkinInfo( vector< pair <BodyPartList, vector < int> > > dismember_groups ) {
-
-}
-
 void NiTriBasedGeom::UpdateTangentSpace(int method) {
 
 	NiTriBasedGeomDataRef niTriGeomData = DynamicCast<NiTriBasedGeomData>(this->data);