diff --git a/include/obj/NiGeometry.h b/include/obj/NiGeometry.h
index e668a4ca0c0e1c0aa8102211c35acb8ff694dc60..8ea5f317184e1fd73a34554000a08edf840edb76 100644
--- a/include/obj/NiGeometry.h
+++ b/include/obj/NiGeometry.h
@@ -169,7 +169,7 @@ protected:
 	/*! The shader name. */
 	string shaderName;
 	/*! Unknown link, usually -1. */
-	Ref<NiObject > unknownLink;
+	NiObject * unknownLink;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiMeshPSysData.h b/include/obj/NiMeshPSysData.h
index c14eb8359dfb9138dbfac59a9e9ffd96e7fcb628..d830684fc11fb4fee05a546cc93596779066fa98 100644
--- a/include/obj/NiMeshPSysData.h
+++ b/include/obj/NiMeshPSysData.h
@@ -20,7 +20,6 @@ All rights reserved.  Please see niflib.h for license. */
 namespace Niflib {
 
 // Forward define of referenced NIF objects
-class NiObject;
 class NiNode;
 class NiMeshPSysData;
 typedef Ref<NiMeshPSysData> NiMeshPSysDataRef;
@@ -64,15 +63,18 @@ protected:
 	/*!
 	 * Unknown. Seems to refer to particle modifiers, however at least one file has a
 	 * NiNode here.  May indicate that this is really two separate links in different
-	 * versions or some other problem.
+	 * versions or some other problem.  Several files have number of verts here.
 	 */
-	Ref<NiObject > modifier;
+	unsigned int unknownModifier;
 	/*! Unknown. */
 	byte unknownByte2;
 	/*! The number of unknown links that follow. */
 	mutable unsigned int numUnknownLinks;
-	/*! Unknown. Seems to refer to particle modifiers. */
-	vector<Ref<NiObject > > unknownLinks;
+	/*!
+	 * Unknown. Seems to refer to particle modifiers.  Sometimes matches vertices
+	 * count.
+	 */
+	vector<unsigned int > unknownLinks;
 	/*! Repeat of Vertex Count? */
 	unsigned int numVertices2;
 	/*! Unknown. 0? */
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index befd911b0ccd51ed32345c96c7f14c152b138cde..d83a7be9002826c7e8a20faf2b8779b88b86be45 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -53,8 +53,6 @@ NiObject * NiAVObject::Create() {
 	return new NiAVObject;
 }
 
-extern "C" int __stdcall IsDebuggerPresent();
-
 void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	//--BEGIN PRE-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -63,12 +61,6 @@ void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, const NifIn
 	NiObjectNET::Read( in, link_stack, info );
 	NifStream( flags, in, info );
 	NifStream( translation, in, info );
-
-	//if (name.compare("Bip01 R Finger01") == 0) {
-	//	if (IsDebuggerPresent()) 
-	//		__asm{ int 3 };
-	//}
-
 	NifStream( rotation, in, info );
 	NifStream( scale, in, info );
 	if ( info.version <= 0x04020200 ) {
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index a0275f9349e161ab94f618d56404afd0b20cdcd6..32d23f27fb54b566bdc69352fae36d7c72b78f5b 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -63,13 +63,6 @@ void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
-		NifStream( numUnknownInts, in, info );
-		unknownInts.resize(numUnknownInts);
-		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], in, info );
-		};
-	};
 	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 10 ) ) {
 		NifStream( numUnknownInts, in, info );
 		unknownInts.resize(numUnknownInts);
@@ -126,12 +119,6 @@ void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigne
 			}
 		};
 	};
-	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
-		NifStream( numUnknownInts, out, info );
-		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], out, info );
-		};
-	};
 	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 10 ) ) {
 		NifStream( numUnknownInts, out, info );
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
diff --git a/src/obj/NiGeometry.cpp b/src/obj/NiGeometry.cpp
index 8e6bd9a6c9d9b4655c1caff2bcfd79f0ab26289e..4554f06e701297428d12d02ac67a4e7fafa50afc 100644
--- a/src/obj/NiGeometry.cpp
+++ b/src/obj/NiGeometry.cpp
@@ -159,8 +159,6 @@ std::list<NiObjectRef> NiGeometry::GetRefs() const {
 		refs.push_back(StaticCast<NiObject>(data));
 	if ( skinInstance != NULL )
 		refs.push_back(StaticCast<NiObject>(skinInstance));
-	if ( unknownLink != NULL )
-		refs.push_back(StaticCast<NiObject>(unknownLink));
 	return refs;
 }
 
diff --git a/src/obj/NiGeometryData.cpp b/src/obj/NiGeometryData.cpp
index f8d71ce48bf9d3462f90117306350458671a3e5e..e0a6e5f2ee5bc2616d76dec241b020e991952daf 100644
--- a/src/obj/NiGeometryData.cpp
+++ b/src/obj/NiGeometryData.cpp
@@ -20,7 +20,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiGeometryData::TYPE("NiGeometryData", &NiObject::TYPE );
 
-NiGeometryData::NiGeometryData() : numVertices((unsigned short)0), unknownShort1((unsigned short)0), hasVertices(false), numUvSets2((byte)0), unknownByte1((byte)0), hasNormals(false), radius(0.0f), hasVertexColors(false), numUvSets((unsigned short)0), hasUv(false), consistencyFlags((ConsistencyType)0), unknownLink1(NULL) {
+NiGeometryData::NiGeometryData() : numVertices((unsigned short)0), unknownShort1((unsigned short)0), hasVertices(1), numUvSets2((byte)0), unknownByte1((byte)0), hasNormals(false), radius(0.0f), hasVertexColors(false), numUvSets((unsigned short)0), hasUv(false), consistencyFlags((ConsistencyType)0), unknownLink1(NULL) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
diff --git a/src/obj/NiMeshPSysData.cpp b/src/obj/NiMeshPSysData.cpp
index bfdbf0edc9884568a6a4a4925e308191b195c2e6..dd545675bbd242895fd18f3bdd56d4c0167db70f 100644
--- a/src/obj/NiMeshPSysData.cpp
+++ b/src/obj/NiMeshPSysData.cpp
@@ -14,14 +14,13 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/NiMeshPSysData.h"
-#include "../../include/obj/NiObject.h"
 #include "../../include/obj/NiNode.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
 const Type NiMeshPSysData::TYPE("NiMeshPSysData", &NiPSysData::TYPE );
 
-NiMeshPSysData::NiMeshPSysData() : modifier(NULL), unknownByte2((byte)0), numUnknownLinks((unsigned int)0), numVertices2((unsigned int)0), unknownByte3((byte)0), unknownInt2((unsigned int)1), numVertices3((unsigned int)0), unknownLink2(NULL) {
+NiMeshPSysData::NiMeshPSysData() : unknownModifier((unsigned int)0), unknownByte2((byte)0), numUnknownLinks((unsigned int)0), numVertices2((unsigned int)0), unknownByte3((byte)0), unknownInt2((unsigned int)1), numVertices3((unsigned int)0), unknownLink2(NULL) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -46,16 +45,14 @@ void NiMeshPSysData::Read( istream& in, list<unsigned int> & link_stack, const N
 	unsigned int block_num;
 	NiPSysData::Read( in, link_stack, info );
 	if ( info.version <= 0x14000004 ) {
-		NifStream( block_num, in, info );
-		link_stack.push_back( block_num );
+		NifStream( unknownModifier, in, info );
 	};
 	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
 		NifStream( unknownByte2, in, info );
 		NifStream( numUnknownLinks, in, info );
 		unknownLinks.resize(numUnknownLinks);
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			NifStream( block_num, in, info );
-			link_stack.push_back( block_num );
+			NifStream( unknownLinks[i2], in, info );
 		};
 	};
 	if ( info.version >= 0x14000005 ) {
@@ -80,29 +77,13 @@ void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NiPSysData::Write( out, link_map, info );
 	numUnknownLinks = (unsigned int)(unknownLinks.size());
 	if ( info.version <= 0x14000004 ) {
-		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*modifier), out, info );
-		} else {
-			if ( modifier != NULL ) {
-				NifStream( link_map.find( StaticCast<NiObject>(modifier) )->second, out, info );
-			} else {
-				NifStream( 0xFFFFFFFF, out, info );
-			}
-		}
+		NifStream( unknownModifier, out, info );
 	};
 	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
 		NifStream( unknownByte2, out, info );
 		NifStream( numUnknownLinks, out, info );
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*unknownLinks[i2]), out, info );
-			} else {
-				if ( unknownLinks[i2] != NULL ) {
-					NifStream( link_map.find( StaticCast<NiObject>(unknownLinks[i2]) )->second, out, info );
-				} else {
-					NifStream( 0xFFFFFFFF, out, info );
-				}
-			}
+			NifStream( unknownLinks[i2], out, info );
 		};
 	};
 	if ( info.version >= 0x14000005 ) {
@@ -135,7 +116,7 @@ std::string NiMeshPSysData::asString( bool verbose ) const {
 	unsigned int array_output_count = 0;
 	out << NiPSysData::asString();
 	numUnknownLinks = (unsigned int)(unknownLinks.size());
-	out << "  Modifier:  " << modifier << endl;
+	out << "  Unknown Modifier:  " << unknownModifier << endl;
 	out << "  Unknown Byte 2:  " << unknownByte2 << endl;
 	out << "  Num Unknown Links:  " << numUnknownLinks << endl;
 	array_output_count = 0;
@@ -166,14 +147,6 @@ void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, li
 	//--END CUSTOM CODE--//
 
 	NiPSysData::FixLinks( objects, link_stack, info );
-	if ( info.version <= 0x14000004 ) {
-		modifier = FixLink<NiObject>( objects, link_stack, info );
-	};
-	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
-		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			unknownLinks[i2] = FixLink<NiObject>( objects, link_stack, info );
-		};
-	};
 	if ( info.version >= 0x0A020000 ) {
 		unknownLink2 = FixLink<NiNode>( objects, link_stack, info );
 	};
@@ -185,12 +158,6 @@ void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, li
 std::list<NiObjectRef> NiMeshPSysData::GetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiPSysData::GetRefs();
-	if ( modifier != NULL )
-		refs.push_back(StaticCast<NiObject>(modifier));
-	for (unsigned int i1 = 0; i1 < unknownLinks.size(); i1++) {
-		if ( unknownLinks[i1] != NULL )
-			refs.push_back(StaticCast<NiObject>(unknownLinks[i1]));
-	};
 	if ( unknownLink2 != NULL )
 		refs.push_back(StaticCast<NiObject>(unknownLink2));
 	return refs;
diff --git a/src/obj/NiMorphData.cpp b/src/obj/NiMorphData.cpp
index 848a931b38dcecd918664dc1fdb3da9ba00f7aed..edd1b1546d9c217667ebb002703ac3521bbb93fd 100644
--- a/src/obj/NiMorphData.cpp
+++ b/src/obj/NiMorphData.cpp
@@ -59,7 +59,7 @@ void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, const NifI
 				NifStream( morphs[i1].keys[i3], in, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A020000 ) ) {
 			NifStream( morphs[i1].unknownInt, in, info );
 		};
 		if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 0 ) ) {
@@ -96,7 +96,7 @@ void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 				NifStream( morphs[i1].keys[i3], out, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A020000 ) ) {
 			NifStream( morphs[i1].unknownInt, out, info );
 		};
 		if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 0 ) ) {