diff --git a/NifExport/Exporter.cpp b/NifExport/Exporter.cpp
index 36ddf81960b7e7c968cd729f3c9f62c29b93a264..52c33346446aca5daa14cd9e777cce25a0e648f5 100755
--- a/NifExport/Exporter.cpp
+++ b/NifExport/Exporter.cpp
@@ -20,6 +20,17 @@ Exporter::Exporter(Interface *i)
 
 Exporter::Result Exporter::export(NiNodeRef &root, INode *node)
 {
+	BSXFlagsRef bsx = DynamicCast<BSXFlags>(CreateBlock("BSXFlags"));
+	bsx->SetName("BSX");
+	bsx->SetFlags(0x00000002);
+
+	NiStringExtraDataRef strings = DynamicCast<NiStringExtraData>(CreateBlock("NiStringExtraData"));	
+	strings->SetName("UPB");
+	strings->SetData("Ellasticity = 0.300000\r\nFriction = 0.300000\r\nUnyielding = 0\r\nProxy_Geometry = <None>\r\nUse_Display_Proxy = 0\r\nDisplay_Children = 1\r\nDisable_Collisions = 0\r\nInactive = 0\r\nDisplay_Proxy = <None>\r\nMass = 0.000000\r\nSimulation_Geometry = 2\r\nCollision_Groups = 589825\r\n");
+
+	root->AddExtraData(DynamicCast<NiExtraData>(bsx));
+	root->AddExtraData(DynamicCast<NiExtraData>(strings));
+
 	mNiRoot = root;
 	return exportTree(root, node);
 }
diff --git a/NifExport/NifExport.vcproj b/NifExport/NifExport.vcproj
index d0ad7950312c4bec91253d3efa829fab09b3ea51..793afcfe7c686be21d9d058fa9927db362c78809 100755
--- a/NifExport/NifExport.vcproj
+++ b/NifExport/NifExport.vcproj
@@ -314,6 +314,25 @@
 					</FileConfiguration>
 				</File>
 			</Filter>
+			<Filter
+				Name="TriStripper"
+				Filter="">
+				<File
+					RelativePath="TriStripper\tri_stripper.cpp">
+					<FileConfiguration
+						Name="Release|Win32">
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32">
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"/>
+					</FileConfiguration>
+				</File>
+			</Filter>
 		</Filter>
 		<Filter
 			Name="Header Files"
@@ -346,6 +365,22 @@
 					RelativePath="NvTriStrip\VertexCache.h">
 				</File>
 			</Filter>
+			<Filter
+				Name="TriStripper"
+				Filter="">
+				<File
+					RelativePath="TriStripper\cache_simulator.h">
+				</File>
+				<File
+					RelativePath="TriStripper\graph_array.h">
+				</File>
+				<File
+					RelativePath="TriStripper\heap_array.h">
+				</File>
+				<File
+					RelativePath="TriStripper\tri_stripper.h">
+				</File>
+			</Filter>
 		</Filter>
 		<Filter
 			Name="Resource Files"
diff --git a/NifExport/Strips.cpp b/NifExport/Strips.cpp
index 331bba2fe4650cbd53e77a627badddf7b98dccbf..845b92a133249518518f7106e89802871eb0ef88 100755
--- a/NifExport/Strips.cpp
+++ b/NifExport/Strips.cpp
@@ -1,76 +1,34 @@
 #include "pch.h"
 
+using namespace triangle_stripper;
+
 void Exporter::strippify(TriStrips &strips, vector<Vector3> &verts, vector<Vector3> &norms, const Triangles &tris)
 {
-	unsigned short *data = (unsigned short *)malloc(tris.size() * 3 * 2);
-
+	vector<unsigned int> idcs(tris.size()*3);
 	int i;
 	for (i=0; i<tris.size(); i++)
 	{
-		data[i * 3 + 0] = tris[i][0];
-		data[i * 3 + 1] = tris[i][1];
-		data[i * 3 + 2] = tris[i][2];
+		idcs[i * 3 + 0] = tris[i][0];
+		idcs[i * 3 + 1] = tris[i][1];
+		idcs[i * 3 + 2] = tris[i][2];
 	}
 	
-	PrimitiveGroup * groups = 0;
-	unsigned short numGroups = 0;
-	
-	// GF 3+
-	SetCacheSize(CACHESIZE_GEFORCE3);
-	// don't generate hundreds of strips
-	SetStitchStrips(true);
-	GenerateStrips(data, tris.size()*3, &groups, &numGroups);
+	tri_stripper stripper(idcs);
 
-	free( data );
-	
-	if (!groups)
-		return;
+	tri_stripper::primitives_vector groups;
+	stripper.Strip(&groups);
 
-	if (!mRemapIndices)
+	for (i=0; i<groups.size(); i++)
 	{
-		for (int g=0; g<numGroups; g++)
-		{
-			if (groups[g].type == PT_STRIP)
-			{
-				strips.push_back(TriStrip(groups[g].numIndices));
-				TriStrip &strip = strips.back();
-
-				for (int s=0; s<groups[g].numIndices; s++)
-					strip[s] = groups[g].indices[s];
-			}
-		}
-
-	} else 
-	{
-		// remap indices
-		PrimitiveGroup *rmGroups;
-		RemapIndices(groups, numGroups, verts.size(), &rmGroups);
-
-		vector<Vector3> tverts = verts;
-		vector<Vector3> tnorms = norms;
-
-		for (int g=0; g<numGroups; g++)
-		{
-			if (rmGroups[g].type == PT_STRIP)
-			{
-				strips.push_back(TriStrip(rmGroups[g].numIndices));
-				TriStrip &strip = strips.back();
-
-				for (int s=0; s<rmGroups[g].numIndices; s++)
-				{
-					strip[s] = rmGroups[g].indices[s];
-
-					unsigned short a = strip[s], b = groups[g].indices[s];
-					verts[a] = tverts[b];
-					norms[a] = tnorms[b];
-				}
-			}
-		}
-
-		delete [] rmGroups;
+		if (groups[i].m_Type != tri_stripper::PT_Triangle_Strip)
+			continue;
+		
+		strips.push_back(TriStrip(groups[i].m_Indices.size()));
+		TriStrip &strip = strips.back();
+
+		for (int j=0; j<groups[i].m_Indices.size(); j++)
+			strip[j] = groups[i].m_Indices[j];
 	}
-
-	delete [] groups;
 }
 
 void Exporter::strippify(TriStrips &strips, FaceGroup &grp)
@@ -143,7 +101,6 @@ void Exporter::strippify(TriStrips &strips, FaceGroup &grp)
 		}
 		delete [] rmGroups;
 	}
-
 	delete [] groups;
 }
 
diff --git a/NifExport/niflib/obj/NiExtraData.cpp b/NifExport/niflib/obj/NiExtraData.cpp
index e1c68a804a3c726edacd7cf3517942d12ada4612..9ba79c2018998757394dfd37dc25ea1e0d7e5a87 100755
--- a/NifExport/niflib/obj/NiExtraData.cpp
+++ b/NifExport/niflib/obj/NiExtraData.cpp
@@ -39,7 +39,7 @@ string NiExtraData::GetName() {
 	return name;
 }
 
-void NiExtraData::SetName( string & new_name ) {
+void NiExtraData::SetName( const string & new_name ) {
 	name = new_name;
 }
 
diff --git a/NifExport/niflib/obj/NiExtraData.h b/NifExport/niflib/obj/NiExtraData.h
index 4728763aef71a9650208620f2745cb28f709f08c..1c26ea788a0355e1e8c1a75b43c107fb4102b9c0 100755
--- a/NifExport/niflib/obj/NiExtraData.h
+++ b/NifExport/niflib/obj/NiExtraData.h
@@ -60,7 +60,7 @@ public:
 	 * version NIF files.
 	 * \param new_name The new name for this NiExtraData object.
 	 */
-	void SetName( string & new_name );
+	void SetName( const string & new_name );
 
 	/*!
 	 * Formats a human readable string that includes the type of the object
diff --git a/NifExport/niflib/obj/NiObjectNET.cpp b/NifExport/niflib/obj/NiObjectNET.cpp
index 6dec8f8c3136beabb3807383fc7e5e1aba5a999c..cef9866feadb036186d17b6917ed35cb59c9e5f0 100755
--- a/NifExport/niflib/obj/NiObjectNET.cpp
+++ b/NifExport/niflib/obj/NiObjectNET.cpp
@@ -41,7 +41,7 @@ string NiObjectNET::GetName() {
 	return name;
 }
 
-void NiObjectNET::SetName( string & new_name ) {
+void NiObjectNET::SetName( const string & new_name ) {
 	name = new_name;
 }
 
diff --git a/NifExport/niflib/obj/NiObjectNET.h b/NifExport/niflib/obj/NiObjectNET.h
index 268db450f746baaf456f3674c78ef2bbded5f7a2..b1e2e5d38b6a7c87b55b6b6f8475545b89547fcc 100755
--- a/NifExport/niflib/obj/NiObjectNET.h
+++ b/NifExport/niflib/obj/NiObjectNET.h
@@ -41,7 +41,7 @@ public:
 	virtual list<NiObjectRef> GetRefs() const;
 
 	string GetName();
-	void SetName( string & new_name );
+	void SetName( const string & new_name );
 	/*!
 	 * Formats a human readable string that includes the type of the object
 	 * \return A string in the form:  address(type) {name}
diff --git a/NifExport/pch.h b/NifExport/pch.h
index e0b2372367e8fdaf043b78c203a300185a592567..31b1b2276e11f0c8526bbf2197793a52a95325d5 100755
--- a/NifExport/pch.h
+++ b/NifExport/pch.h
@@ -22,8 +22,12 @@
 #include "niflib/obj/NiMaterialProperty.h"
 #include "niflib/obj/NiTexturingProperty.h"
 #include "niflib/obj/NiSourceTexture.h"
+#include "niflib/obj/BsxFlags.h"
+#include "niflib/obj/NiStringExtraData.h"
 
 #include "NvTriStrip/NvTriStrip.h"
+#include <deque>
+#include "TriStripper/tri_stripper.h"
 
 #include "../NifPlugins.h"
 #include "Exporter.h"