diff --git a/include/NIF_IO.h b/include/NIF_IO.h
index 5a6d6494668146e8a9a4cc460f967b72b96d9dbd..a19e0a32988bfe27dab76358c5ccab8daeb7fb0c 100644
--- a/include/NIF_IO.h
+++ b/include/NIF_IO.h
@@ -284,7 +284,7 @@ void NifStream( Quaternion & val, istream& in, uint version = 0 );
 void NifStream( Quaternion const & val, ostream& out, uint version = 0  );
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, uint version = 0 );
+void NifStream( HeaderString & val, istream& in, uint & version ); //Sets the passed in version varible
 void NifStream( HeaderString const & val, ostream& out, uint version = 0  );
 ostream & operator<<( ostream & out, HeaderString const & val );
 
diff --git a/include/gen/obj_defines.h b/include/gen/obj_defines.h
index 9914f618446164ef79eae2ec0dc86b35e3a85c56..8ac45871442d9280fb13971ff10f0e125c9b71d2 100644
--- a/include/gen/obj_defines.h
+++ b/include/gen/obj_defines.h
@@ -11,7 +11,7 @@ private:\
   void InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );\
   void InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;\
   string InternalAsString( bool verbose ) const;\
-  void InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );\
+  void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );\
   list<NiObjectRef> InternalGetRefs() const;
 #define NI_OBJECT_MEMBERS \
 
diff --git a/include/obj/ABoneLODController.h b/include/obj/ABoneLODController.h
index eeb7c3624b0082a9b6486115b848506f31a3a136..bf877017651fc1b54707e28d180556ca1dede49a 100644
--- a/include/obj/ABoneLODController.h
+++ b/include/obj/ABoneLODController.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AKeyedData.h b/include/obj/AKeyedData.h
index f5de967126eefb8a64aea556ecf22f448e893b0e..f704daeba348bf0a6cddf9bd3349e9d750c54f5d 100644
--- a/include/obj/AKeyedData.h
+++ b/include/obj/AKeyedData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/APSysCtlr.h b/include/obj/APSysCtlr.h
index 0738662b87dc9b2280b3d05242dd41ee6db40490..ed0f812945ce384adcaf0c9981143f597308a8ca 100644
--- a/include/obj/APSysCtlr.h
+++ b/include/obj/APSysCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/APSysData.h b/include/obj/APSysData.h
index 577177776cf85b21bfbceb0b221132b785aad1a4..8d67137399da8bcad40a54537b323ccb71a69784 100644
--- a/include/obj/APSysData.h
+++ b/include/obj/APSysData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AParticleModifier.h b/include/obj/AParticleModifier.h
index 4f0e8ec936c7965ad941fee7aed357da7dfa3518..70ce9846dd143c8b0c22b8da0bdb56c88b22a544 100644
--- a/include/obj/AParticleModifier.h
+++ b/include/obj/AParticleModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AbhkConstraint.h b/include/obj/AbhkConstraint.h
index 88349b6b813dd17cf6fd425aa09742c3287677fe..bc0a1dee3fee0ddd1b8e92d449ce272ae4187f26 100644
--- a/include/obj/AbhkConstraint.h
+++ b/include/obj/AbhkConstraint.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AbhkRagdollConstraint.h b/include/obj/AbhkRagdollConstraint.h
index c81cc70971dc142b0c47fdabc34372bda87ad20d..5917ddc204e6d371c2f6f5f10c57e36fdd158626 100644
--- a/include/obj/AbhkRagdollConstraint.h
+++ b/include/obj/AbhkRagdollConstraint.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AbhkShapeCollection.h b/include/obj/AbhkShapeCollection.h
index b45f0a9b2c67c8e2de107ef3f4c46fb5c5f5fcb6..61cfa519103f7a81a4253c68ee6a7d238b259aaf 100644
--- a/include/obj/AbhkShapeCollection.h
+++ b/include/obj/AbhkShapeCollection.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/AvoidNode.h b/include/obj/AvoidNode.h
index 908eb9b3302578ecc53221e3e09dfd7ce1912ece..a8b84bdc9ffeadefed6781444e2ca535083ffe87 100644
--- a/include/obj/AvoidNode.h
+++ b/include/obj/AvoidNode.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSBound.h b/include/obj/BSBound.h
index edfc2073163316e6c5df9f174f452eb4271828a4..72cb58848f8bc2c5a61235100eec934d160fe474 100644
--- a/include/obj/BSBound.h
+++ b/include/obj/BSBound.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSFurnitureMarker.h b/include/obj/BSFurnitureMarker.h
index 1784abcf2af4a26d2095502455419eff0b121828..e57333261200d7bf9c180f72e08aa9ca17ca4a83 100644
--- a/include/obj/BSFurnitureMarker.h
+++ b/include/obj/BSFurnitureMarker.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSKeyframeController.h b/include/obj/BSKeyframeController.h
index 18781c5e447b9ec549cd48a05b30fd871fc763d6..694658ad48b4bf3448bbfffd92d2b88da9a84947 100644
--- a/include/obj/BSKeyframeController.h
+++ b/include/obj/BSKeyframeController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSPSysArrayEmitter.h b/include/obj/BSPSysArrayEmitter.h
index be6cb4bf4c706f6715ddddcb5d8ac384a2378e29..9979c734a4eb4bc7050b59071562e4622f4b7d7d 100644
--- a/include/obj/BSPSysArrayEmitter.h
+++ b/include/obj/BSPSysArrayEmitter.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSParentVelocityModifier.h b/include/obj/BSParentVelocityModifier.h
index 0fe839bfc73ec2927da4267ec47fe875aade9a2d..a3cbbd3f3aec21976901c2ea6476fe351c34a8b5 100644
--- a/include/obj/BSParentVelocityModifier.h
+++ b/include/obj/BSParentVelocityModifier.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/BSXFlags.h b/include/obj/BSXFlags.h
index 91366c4436c70c6fed469bfc8e3503e509b12679..7d9eed5a65ffc86f253a6091e1503c080a8184cc 100644
--- a/include/obj/BSXFlags.h
+++ b/include/obj/BSXFlags.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/FxButton.h b/include/obj/FxButton.h
index 6759d48cfed8ee707adc40fe4bad6ae720d43242..96858d4029dc9f7e3069742aa14962b3890db6b7 100644
--- a/include/obj/FxButton.h
+++ b/include/obj/FxButton.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/FxRadioButton.h b/include/obj/FxRadioButton.h
index 82c1084c993d79cea0c6e923fabbf89b28113f1d..3c1dbc149ac0e8191bc838f5b8b2ce73899b06ea 100644
--- a/include/obj/FxRadioButton.h
+++ b/include/obj/FxRadioButton.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/FxWidget.h b/include/obj/FxWidget.h
index 8808c1ed45e8944e4ba2db09e67656bf51ff7de9..b00336d402808ed55e33105cfddc4787a1632547 100644
--- a/include/obj/FxWidget.h
+++ b/include/obj/FxWidget.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiAVObject.h b/include/obj/NiAVObject.h
index 159311d73c1d85cc53b0cfd3c5e0fbc19133c65a..132f35585590bf7a9a6cf6623876f723d0c513d7 100644
--- a/include/obj/NiAVObject.h
+++ b/include/obj/NiAVObject.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  What to do with newer files that have a link for a bounding box?  Wrap this in a function and translate?
diff --git a/include/obj/NiAlphaController.h b/include/obj/NiAlphaController.h
index 0f9ac268d9e3ea95d0d05607fdad699890c571a0..0901669332e2c992fb0ef587dc65f79880dac5d7 100644
--- a/include/obj/NiAlphaController.h
+++ b/include/obj/NiAlphaController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiAlphaProperty.h b/include/obj/NiAlphaProperty.h
index 6780ede1e20b3ef2da3087837742911d3fbb86be..ee8db6eae7f6cc3e78b535d8a1c14ad7a14d6cf0 100644
--- a/include/obj/NiAlphaProperty.h
+++ b/include/obj/NiAlphaProperty.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiAmbientLight.h b/include/obj/NiAmbientLight.h
index 538f983e663507359e604c7126749c8a2d1b4ca0..2ea53ac0c6bedf416a445bd52b125fdd2242f189 100644
--- a/include/obj/NiAmbientLight.h
+++ b/include/obj/NiAmbientLight.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiAutoNormalParticles.h b/include/obj/NiAutoNormalParticles.h
index d5d180690040f35651b901f087e4248680fdd402..2cc0bd7be53f07edabffe4133cfb05071a66309c 100644
--- a/include/obj/NiAutoNormalParticles.h
+++ b/include/obj/NiAutoNormalParticles.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiAutoNormalParticlesData.h b/include/obj/NiAutoNormalParticlesData.h
index ef93fe2c0c3e58f1049b174bc1fb17c7938de462..a84aca7d5274bcc8c0ecd943a82e3c9a4f9027ab 100644
--- a/include/obj/NiAutoNormalParticlesData.h
+++ b/include/obj/NiAutoNormalParticlesData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSAnimationNode.h b/include/obj/NiBSAnimationNode.h
index 46be0bf571e1744f69738978c0d00a908ab358db..c36f3c77fd6b9fa73db14f1c2be91f3037c2b203 100644
--- a/include/obj/NiBSAnimationNode.h
+++ b/include/obj/NiBSAnimationNode.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSBoneLODController.h b/include/obj/NiBSBoneLODController.h
index a9e77fd6cfcdcfdf23ce7897a2d5adcebbd9059b..256363f69a20091cd6233c532d292b62948b0f20 100644
--- a/include/obj/NiBSBoneLODController.h
+++ b/include/obj/NiBSBoneLODController.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSPArrayController.h b/include/obj/NiBSPArrayController.h
index 21f06db0cfefeb18f850bb34551c518b9772c64f..ae14d2176f9c6a96a892d3fc41ad61a4e61f518b 100644
--- a/include/obj/NiBSPArrayController.h
+++ b/include/obj/NiBSPArrayController.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSParticleNode.h b/include/obj/NiBSParticleNode.h
index f59b29bbe0aea6864105ff9ff68fc76827842913..0f38c70bca239f2d11532d3d0a153db4dcdabcc8 100644
--- a/include/obj/NiBSParticleNode.h
+++ b/include/obj/NiBSParticleNode.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineBasisData.h b/include/obj/NiBSplineBasisData.h
index 345893aa50d4b39bb35699a61bbed7eccd04d6d1..4f1d68088d72d4a7a0e254d51f879cdfa31195d4 100644
--- a/include/obj/NiBSplineBasisData.h
+++ b/include/obj/NiBSplineBasisData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineCompFloatInterpolator.h b/include/obj/NiBSplineCompFloatInterpolator.h
index 76f203af857d2aec924a436b36c88e92b15db6d3..ae7a902d62ccb565999611ae28e962fecf725e5b 100644
--- a/include/obj/NiBSplineCompFloatInterpolator.h
+++ b/include/obj/NiBSplineCompFloatInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineCompPoint3Interpolator.h b/include/obj/NiBSplineCompPoint3Interpolator.h
index 12c641789dedc83ece033beb8c4241be831209f0..26fd93aa6f901e234093d0c4bab7c504e1a4f6e4 100644
--- a/include/obj/NiBSplineCompPoint3Interpolator.h
+++ b/include/obj/NiBSplineCompPoint3Interpolator.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineCompTransformInterpolator.h b/include/obj/NiBSplineCompTransformInterpolator.h
index 4f8f592002343d1071e4f26d0074f4ffce7096c2..71863c912842377817f5ac8f64f4192da5b7237b 100644
--- a/include/obj/NiBSplineCompTransformInterpolator.h
+++ b/include/obj/NiBSplineCompTransformInterpolator.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineData.h b/include/obj/NiBSplineData.h
index 261ea1b65db8002121d15d0f31a69d0f71557349..da107606b644ef9c610f36942285432b225b085c 100644
--- a/include/obj/NiBSplineData.h
+++ b/include/obj/NiBSplineData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBSplineInterpolator.h b/include/obj/NiBSplineInterpolator.h
index 4cef7d35aeecf28b2d45ac321c5aeea5b19de7e8..bd760d3d47e47eddecf6ef9045517fed8d2af643 100644
--- a/include/obj/NiBSplineInterpolator.h
+++ b/include/obj/NiBSplineInterpolator.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBillboardNode.h b/include/obj/NiBillboardNode.h
index 9a0ab03a12a4d4ef7d5cd761b17ef6eb36cf24e0..1c07ad0d03d34178915c003e74cbb1cdbe097be2 100644
--- a/include/obj/NiBillboardNode.h
+++ b/include/obj/NiBillboardNode.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBinaryExtraData.h b/include/obj/NiBinaryExtraData.h
index d941b6e030d60f25a7bc77d80c471b4c60c3d1c4..c2264340110d88eab5423bb5ad6cb333fece927c 100644
--- a/include/obj/NiBinaryExtraData.h
+++ b/include/obj/NiBinaryExtraData.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBlendBoolInterpolator.h b/include/obj/NiBlendBoolInterpolator.h
index 189292264dd189ee578d46bf627c5627126e43c1..c72e527040a511b09c1a6bdbeb459ab48fd45fbe 100644
--- a/include/obj/NiBlendBoolInterpolator.h
+++ b/include/obj/NiBlendBoolInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBlendFloatInterpolator.h b/include/obj/NiBlendFloatInterpolator.h
index f7cc7be5e821171526ecf2f7f548b93547c9b154..da59a3e58a5f6928719c19e790b01e78422475ca 100644
--- a/include/obj/NiBlendFloatInterpolator.h
+++ b/include/obj/NiBlendFloatInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBlendInterpolator.h b/include/obj/NiBlendInterpolator.h
index 0b9332b9856986df7f16c6f4ce4e5aff6f735b1a..50045d8e333417d40c8c455b1e5ce4f0a7b67592 100644
--- a/include/obj/NiBlendInterpolator.h
+++ b/include/obj/NiBlendInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBlendPoint3Interpolator.h b/include/obj/NiBlendPoint3Interpolator.h
index fdc8a62ea74f0d31a396638111167cf7d0c43eae..833c78da3279ab3e34cac9cf3fca4cdaf8c7b9ab 100644
--- a/include/obj/NiBlendPoint3Interpolator.h
+++ b/include/obj/NiBlendPoint3Interpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBlendTransformInterpolator.h b/include/obj/NiBlendTransformInterpolator.h
index 8919085340bcf3119f464246937e37e891d6c884..a30dd3857c4f4a5fc1c64c48fa5eb13c580258be 100644
--- a/include/obj/NiBlendTransformInterpolator.h
+++ b/include/obj/NiBlendTransformInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBoneLODController.h b/include/obj/NiBoneLODController.h
index 8c8fdc9baa295334dfc5fa6ce7244eef2f276cfa..19b1e9cfd95c33e622e3746b0a55b3d4fd0416e7 100644
--- a/include/obj/NiBoneLODController.h
+++ b/include/obj/NiBoneLODController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBoolData.h b/include/obj/NiBoolData.h
index 20a5cd4efcf44b5a754cb361e1d939b4f114a8a1..913d4f0c576dd105a921a25bd1d8d35d9f5e26e8 100644
--- a/include/obj/NiBoolData.h
+++ b/include/obj/NiBoolData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBoolInterpolator.h b/include/obj/NiBoolInterpolator.h
index 4c779aab4b80ede5ae5686cf4dc4595864789461..5271fa41d77a974b1b4201586f7492653be0c52e 100644
--- a/include/obj/NiBoolInterpolator.h
+++ b/include/obj/NiBoolInterpolator.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBoolTimelineInterpolator.h b/include/obj/NiBoolTimelineInterpolator.h
index 51d69b3e75533d840f232ce28fd956b8771991f9..3100137fb43b49a0a3e774a3c6982c20ed497b02 100644
--- a/include/obj/NiBoolTimelineInterpolator.h
+++ b/include/obj/NiBoolTimelineInterpolator.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiBooleanExtraData.h b/include/obj/NiBooleanExtraData.h
index 26c23a101f5e6517be844a175af775e5167226ee..570bc1e7f331b12c0302c0ffe901130c9647c3a3 100644
--- a/include/obj/NiBooleanExtraData.h
+++ b/include/obj/NiBooleanExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiCamera.h b/include/obj/NiCamera.h
index e1ca23846d1e1956f44b0e6439fc1ad679b90bf6..221356644f29a211d8b6b1aa4f8e5505f3d3fdfa 100644
--- a/include/obj/NiCamera.h
+++ b/include/obj/NiCamera.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiClod.h b/include/obj/NiClod.h
index 98b05419d676688a129ec148853390f90daf7f41..f7f9f3854f5c8c7f4d4f733ad3bbfc689d0ee3c2 100644
--- a/include/obj/NiClod.h
+++ b/include/obj/NiClod.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiClodData.h b/include/obj/NiClodData.h
index d78146eebe416ce7d24077d1628700de0eaba489..91846b5991b8f6bc65ea56eec71efa317f9936d0 100644
--- a/include/obj/NiClodData.h
+++ b/include/obj/NiClodData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiCollisionData.h b/include/obj/NiCollisionData.h
index 808f78ceda2c2bc5a116ed3505b6a725eaab1fa5..da425855954bdbd522c35d7162c0688732c7451c 100644
--- a/include/obj/NiCollisionData.h
+++ b/include/obj/NiCollisionData.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiCollisionObject.h b/include/obj/NiCollisionObject.h
index 66f5f2ca2e982d59ec33a295bcd05e2645fd90d6..e67758645b45504a8b5edc6d2ccaf3f9674e97a9 100644
--- a/include/obj/NiCollisionObject.h
+++ b/include/obj/NiCollisionObject.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiColorData.h b/include/obj/NiColorData.h
index 26c1dde5e52b71443a2830778ee6deea2d9cafa2..ff210e5bb8ab0abb3ce0691f49bd98582a15bdd7 100644
--- a/include/obj/NiColorData.h
+++ b/include/obj/NiColorData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiColorExtraData.h b/include/obj/NiColorExtraData.h
index 32864d8d9d03bdb852ad1d5f7d2847153315c86c..9bb13a38371654d13db2c4ef50404c6e11699e2e 100644
--- a/include/obj/NiColorExtraData.h
+++ b/include/obj/NiColorExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiControllerManager.h b/include/obj/NiControllerManager.h
index 53ed09677e64dc7bc3cbf5008e643761e0ce7a6a..6083b01e552a57ffa08027e9438a37f6cfff87b9 100644
--- a/include/obj/NiControllerManager.h
+++ b/include/obj/NiControllerManager.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiControllerSequence.h b/include/obj/NiControllerSequence.h
index 0905b62b69b829702e4cf27d8e4baaac0385ed87..6e0294e6a61a935169c3a9896c64a003d72b141d 100644
--- a/include/obj/NiControllerSequence.h
+++ b/include/obj/NiControllerSequence.h
@@ -39,7 +39,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiDefaultAVObjectPalette.h b/include/obj/NiDefaultAVObjectPalette.h
index 5381a6a45d2fc16c5bba6d8a5417a7fa7dc8ff77..d291c2ab20e09079efc6201b3ba5288a2b152d58 100644
--- a/include/obj/NiDefaultAVObjectPalette.h
+++ b/include/obj/NiDefaultAVObjectPalette.h
@@ -33,7 +33,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiDirectionalLight.h b/include/obj/NiDirectionalLight.h
index 9a984adfc7a12ce4b999b0ded7b50f5874957551..c369730354b05d508278293b2426f5a603f45300 100644
--- a/include/obj/NiDirectionalLight.h
+++ b/include/obj/NiDirectionalLight.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiDitherProperty.h b/include/obj/NiDitherProperty.h
index 550cce5ae03d2b3f445e502e771c5eaa3a359827..ef6a0bef2db75184c1224e708cb343496254a5f4 100644
--- a/include/obj/NiDitherProperty.h
+++ b/include/obj/NiDitherProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiDynamicEffect.h b/include/obj/NiDynamicEffect.h
index a9af02e29d18c508094639309c1c9beafac40dba..10f8f55ddacf6f9ae52ee0c170e93fc008b02413 100644
--- a/include/obj/NiDynamicEffect.h
+++ b/include/obj/NiDynamicEffect.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiExtraData.h b/include/obj/NiExtraData.h
index 1c26ea788a0355e1e8c1a75b43c107fb4102b9c0..e7b0a52524cb70e0822f9bda08d510b7ae82d244 100644
--- a/include/obj/NiExtraData.h
+++ b/include/obj/NiExtraData.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFlipController.h b/include/obj/NiFlipController.h
index 676fc30645c3d7b96bd100e892016b2d1261b29c..1b3bbd62226367b08b577c99103f4f7aa69f79aa 100644
--- a/include/obj/NiFlipController.h
+++ b/include/obj/NiFlipController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFloatData.h b/include/obj/NiFloatData.h
index fe8833a0c2e1f66618e7c71508ad11d247dd98f1..fcf4d44306a8e194b7a61658e97cc635a1a7899d 100644
--- a/include/obj/NiFloatData.h
+++ b/include/obj/NiFloatData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFloatExtraData.h b/include/obj/NiFloatExtraData.h
index 1369c7ecb516234ecdf879a884f7e9ac11f6057a..ce3e7fa902fcb923beda863f18210375e2755339 100644
--- a/include/obj/NiFloatExtraData.h
+++ b/include/obj/NiFloatExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFloatExtraDataController.h b/include/obj/NiFloatExtraDataController.h
index d1a9aa9e7fa4fee10782ef168a800559abb06b5f..90868cd187e4a3c8661868df110a913f2c824e2a 100644
--- a/include/obj/NiFloatExtraDataController.h
+++ b/include/obj/NiFloatExtraDataController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFloatInterpolator.h b/include/obj/NiFloatInterpolator.h
index fe44e7793611acc54015056fe494d2f824c1c0bd..fd0d478254c7a9306b57f15fb7452af2366ec1d3 100644
--- a/include/obj/NiFloatInterpolator.h
+++ b/include/obj/NiFloatInterpolator.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFloatsExtraData.h b/include/obj/NiFloatsExtraData.h
index b1276ee9c14c84d7b310be1a1c3de31c080adc8b..3f2ca14307dd602d065cd85704efde48983092e8 100644
--- a/include/obj/NiFloatsExtraData.h
+++ b/include/obj/NiFloatsExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiFogProperty.h b/include/obj/NiFogProperty.h
index 47ee0d027bba95091bb287b4cc1dac73d363f455..3492d51a832ec1ea61c6e443870b3b00001b7796 100644
--- a/include/obj/NiFogProperty.h
+++ b/include/obj/NiFogProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiGeomMorpherController.h b/include/obj/NiGeomMorpherController.h
index 503f49d088df5d6505ad0c1ee1eabeb64cff63bd..34575a904dc6eb85cdbb32f78bb815418dfc2441 100644
--- a/include/obj/NiGeomMorpherController.h
+++ b/include/obj/NiGeomMorpherController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiGravity.h b/include/obj/NiGravity.h
index 190a175effa7272bc582587b6c4585bb10ad082e..5785e8dca74208b6adf13524a4ea96d890fbf3be 100644
--- a/include/obj/NiGravity.h
+++ b/include/obj/NiGravity.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 protected:
diff --git a/include/obj/NiIntegerExtraData.h b/include/obj/NiIntegerExtraData.h
index 5489096bc69b7f42ea7005db4c5a5c647584e305..8e190d75aa55a189c48b2a0f4045a6d224c870de 100644
--- a/include/obj/NiIntegerExtraData.h
+++ b/include/obj/NiIntegerExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiIntegersExtraData.h b/include/obj/NiIntegersExtraData.h
index 1a2cb6da31b3ccd8ff8eb59d534dd46956382de7..a2988d17c37814e0afe1e15554b7a56e9d4e1651 100644
--- a/include/obj/NiIntegersExtraData.h
+++ b/include/obj/NiIntegersExtraData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiInterpolator.h b/include/obj/NiInterpolator.h
index 394ff2d93e69f3e2b7ae6fc5b3a9dd9e431dab27..42148cc951fdb3053ed4741a7b5e17d14cd87404 100644
--- a/include/obj/NiInterpolator.h
+++ b/include/obj/NiInterpolator.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiKeyframeController.h b/include/obj/NiKeyframeController.h
index a0a8bd3ec8797f3f72b3cef6eca6ea6709bf2d78..185cb039529e824ed7c2470473be510cbf3728cc 100644
--- a/include/obj/NiKeyframeController.h
+++ b/include/obj/NiKeyframeController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiKeyframeData.h b/include/obj/NiKeyframeData.h
index fb08de34a39182e675eb1b31a5a19f8ad6476ee1..eb04032d4ae1904cce163f6113fe556422e93ce7 100644
--- a/include/obj/NiKeyframeData.h
+++ b/include/obj/NiKeyframeData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLODData.h b/include/obj/NiLODData.h
index e0dfbbc10ebb0dd29c0bf4d2a1044cf6e5a34520..04c9f7ff6c174bcad1a1159fcbcf34c9edd9d2cf 100644
--- a/include/obj/NiLODData.h
+++ b/include/obj/NiLODData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLODNode.h b/include/obj/NiLODNode.h
index 6ac4fb44854036a87ef8033c61dc5ffdc4374b2e..872e303ba09cf65ade0acd38a534f34dbb28572e 100644
--- a/include/obj/NiLODNode.h
+++ b/include/obj/NiLODNode.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLight.h b/include/obj/NiLight.h
index ee917bc550a1821a600292cf0fb063ce5b045ca3..f143a4be560e8884276412b749de851b0b006dc9 100644
--- a/include/obj/NiLight.h
+++ b/include/obj/NiLight.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLightColorController.h b/include/obj/NiLightColorController.h
index a26f16bb8ffbd861b816b1fe8257f12307935dff..1581433e136a6c2346e84c1cbe19aa21f5767b09 100644
--- a/include/obj/NiLightColorController.h
+++ b/include/obj/NiLightColorController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLightDimmerController.h b/include/obj/NiLightDimmerController.h
index 5c352c0a5cd3d34aafa33425644736ce034d23e1..9a922576fbbadf360271905ec7f0ed26e86af4bf 100644
--- a/include/obj/NiLightDimmerController.h
+++ b/include/obj/NiLightDimmerController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLookAtController.h b/include/obj/NiLookAtController.h
index 0e4bd6268fd4e9e6b69497ce24e15b487060ffa8..b7b285feac29156e987e17b9c8d517ba7e2856bd 100644
--- a/include/obj/NiLookAtController.h
+++ b/include/obj/NiLookAtController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiLookAtInterpolator.h b/include/obj/NiLookAtInterpolator.h
index 1dfd35c494548a01ed4c5370463e4e3527c76ab2..a76f80eddd281d60974e4625f35865229daf43ba 100644
--- a/include/obj/NiLookAtInterpolator.h
+++ b/include/obj/NiLookAtInterpolator.h
@@ -36,7 +36,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMaterialColorController.h b/include/obj/NiMaterialColorController.h
index 99fcd03d617d3a00961b290a6da9bbbd8e9e20e5..9b0e4378a02f5d52a43c830f34b155622d63cdc6 100644
--- a/include/obj/NiMaterialColorController.h
+++ b/include/obj/NiMaterialColorController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMaterialProperty.h b/include/obj/NiMaterialProperty.h
index 0ca66c1c2ed379199def1329d4e871f2a7fa7837..3cb9300a59e1e3b43521c1d98aa09f777e151a28 100644
--- a/include/obj/NiMaterialProperty.h
+++ b/include/obj/NiMaterialProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMeshPSysData.h b/include/obj/NiMeshPSysData.h
index 9d0e14fba8253577bf6cb17171c5b68fec1cbda0..19ea8bd72e5f2a07ec974b9a2b068ac82aa4c249 100644
--- a/include/obj/NiMeshPSysData.h
+++ b/include/obj/NiMeshPSysData.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMeshParticleSystem.h b/include/obj/NiMeshParticleSystem.h
index 230bab72b69efc03c8af710beb8ac44d4e52f8f6..ec7d234cd7fff2af75d92a54472873d8511cc7a8 100644
--- a/include/obj/NiMeshParticleSystem.h
+++ b/include/obj/NiMeshParticleSystem.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMorphData.h b/include/obj/NiMorphData.h
index 32f4fa78920dc1f67689e1e3e1be2dd97efa7d4a..c9674a1cb1973ddaff38004db100b8f1c5d1bd0a 100644
--- a/include/obj/NiMorphData.h
+++ b/include/obj/NiMorphData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiMultiTargetTransformController.h b/include/obj/NiMultiTargetTransformController.h
index 67303f014c1416afadd0a5a5d60ba0626f534e70..72de8e6339b17e2cfd29256cdd312a464279508f 100644
--- a/include/obj/NiMultiTargetTransformController.h
+++ b/include/obj/NiMultiTargetTransformController.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiNode.h b/include/obj/NiNode.h
index 2bcb6ee708171f49a23556cfd7d1f1e6bb1e43da..187332260fb72e110c965c1fd0c160641d9fc07d 100644
--- a/include/obj/NiNode.h
+++ b/include/obj/NiNode.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiObject.h b/include/obj/NiObject.h
index 8c440bb3a03d40d5ead1c27de9525a4209c7157d..11512acf389540f3c909770be04ed3f9a530bd3b 100644
--- a/include/obj/NiObject.h
+++ b/include/obj/NiObject.h
@@ -65,7 +65,7 @@ public:
 	//Streaming Functions
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {}
 	NIFLIB_HIDDEN virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {}
-	NIFLIB_HIDDEN virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {}
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {}
 
 	//Reference Counting
 	NIFLIB_API void AddRef() const; //Should not be called directly
diff --git a/include/obj/NiObjectNET.h b/include/obj/NiObjectNET.h
index b1e2e5d38b6a7c87b55b6b6f8475545b89547fcc..d40c703891fd506f6247d0918b84b16252dd73c7 100644
--- a/include/obj/NiObjectNET.h
+++ b/include/obj/NiObjectNET.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 
 	string GetName();
diff --git a/include/obj/NiPSysAgeDeathModifier.h b/include/obj/NiPSysAgeDeathModifier.h
index af71a02930fc3666007b27418476d7c6deeaf7b7..8811a53bd6418a736dad85709dccba3f24539f1e 100644
--- a/include/obj/NiPSysAgeDeathModifier.h
+++ b/include/obj/NiPSysAgeDeathModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysBombModifier.h b/include/obj/NiPSysBombModifier.h
index 1999540c0d58e8a097ec084865e539f5d4ef48af..871cd60bc82522e51358db5c4e8060e216303bde 100644
--- a/include/obj/NiPSysBombModifier.h
+++ b/include/obj/NiPSysBombModifier.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysBoundUpdateModifier.h b/include/obj/NiPSysBoundUpdateModifier.h
index f85fbc177ba9a3f652353768bd264bb827fe83bc..8cfbc1034daa31df0470dcf1c3d64443aad229e9 100644
--- a/include/obj/NiPSysBoundUpdateModifier.h
+++ b/include/obj/NiPSysBoundUpdateModifier.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysBoxEmitter.h b/include/obj/NiPSysBoxEmitter.h
index 02c5bc6abf93862155db814fe55ec34a32c00d24..42ba40b0fad39e55dfc53f7eb6f48afce966ad67 100644
--- a/include/obj/NiPSysBoxEmitter.h
+++ b/include/obj/NiPSysBoxEmitter.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysColliderManager.h b/include/obj/NiPSysColliderManager.h
index 0d426986f87b04352d1bb9c2102843fb2f0b84a6..c6b35656dfe97fcfba7b3203f29477cf5173c191 100644
--- a/include/obj/NiPSysColliderManager.h
+++ b/include/obj/NiPSysColliderManager.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysColorModifier.h b/include/obj/NiPSysColorModifier.h
index 2cd8218a6233ba9261108a36c5bc7342103cdc58..028a102ae0cc4edae6bdab34ee6ae31f90ef3472 100644
--- a/include/obj/NiPSysColorModifier.h
+++ b/include/obj/NiPSysColorModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysCylinderEmitter.h b/include/obj/NiPSysCylinderEmitter.h
index 2b8d5623e90a919f910497a90c23000bfb083960..d75f84809f794fc924a818bccfa2f420dfd16d40 100644
--- a/include/obj/NiPSysCylinderEmitter.h
+++ b/include/obj/NiPSysCylinderEmitter.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysData.h b/include/obj/NiPSysData.h
index 538b2968c4eea91dd3a43ff7c68359ec03cb0b72..0552b757a8f3e52babe6f7d6927402302d32f62b 100644
--- a/include/obj/NiPSysData.h
+++ b/include/obj/NiPSysData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysDragModifier.h b/include/obj/NiPSysDragModifier.h
index c85d0be12738f64eae9b779d1a63a44b3ae9dd5e..d828f8cd0b762e8b14d3e57d1a1cd03e4905f44c 100644
--- a/include/obj/NiPSysDragModifier.h
+++ b/include/obj/NiPSysDragModifier.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitter.h b/include/obj/NiPSysEmitter.h
index 28a1b79fd5dd4078ae3a3c7c40b8154d4aead30d..e9a25e0b8e3269859dee2293b04f56eb44dca8d1 100644
--- a/include/obj/NiPSysEmitter.h
+++ b/include/obj/NiPSysEmitter.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterCtlr.h b/include/obj/NiPSysEmitterCtlr.h
index d5fedf8202ca120eccfa3983a978979460e507ce..460cd16be7035dbb7e61c0884c05e39336b2aa1b 100644
--- a/include/obj/NiPSysEmitterCtlr.h
+++ b/include/obj/NiPSysEmitterCtlr.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterCtlrData.h b/include/obj/NiPSysEmitterCtlrData.h
index b5df6684e8aa6d1a6009ad7fcedccfbe45d8323b..38289f136a52b64b3747cd77f7b44ec52faa174b 100644
--- a/include/obj/NiPSysEmitterCtlrData.h
+++ b/include/obj/NiPSysEmitterCtlrData.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterDeclinationCtlr.h b/include/obj/NiPSysEmitterDeclinationCtlr.h
index f2dd6a218e710b01f347fcfb8153c8096fcc7202..1b774679b2c8c2f6f43cc1cb88ad5de35ca1c490 100644
--- a/include/obj/NiPSysEmitterDeclinationCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterDeclinationVarCtlr.h b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
index 73734c6d4169c48a0c69013c98c05aaff8978736..444e19ed603a0543e60887b34b774f51f73d0c25 100644
--- a/include/obj/NiPSysEmitterDeclinationVarCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterInitialRadiusCtlr.h b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
index 9d465385b479c47296cbe44c82b275902c6ab7eb..bafe8d7d1c6d7f0dd512d5777cd03003ddfc78ec 100644
--- a/include/obj/NiPSysEmitterInitialRadiusCtlr.h
+++ b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterLifeSpanCtlr.h b/include/obj/NiPSysEmitterLifeSpanCtlr.h
index 176ff5faa98001073b7792cc8f4ce1a80d900ada..f0916b47ec26afab5d6663916096d2c1b62a0a2b 100644
--- a/include/obj/NiPSysEmitterLifeSpanCtlr.h
+++ b/include/obj/NiPSysEmitterLifeSpanCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysEmitterSpeedCtlr.h b/include/obj/NiPSysEmitterSpeedCtlr.h
index 25b0b62005e4ddf95b419f005db3ae18ed380801..33e1fba37a159b15dab462da45e4cd7ea48e79eb 100644
--- a/include/obj/NiPSysEmitterSpeedCtlr.h
+++ b/include/obj/NiPSysEmitterSpeedCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysGravityModifier.h b/include/obj/NiPSysGravityModifier.h
index faa92381467a9eb74743a9b7edae5dfea497d32e..00b0f7fbb0c431dfb7eda61f37ef0fe03fafd9fc 100644
--- a/include/obj/NiPSysGravityModifier.h
+++ b/include/obj/NiPSysGravityModifier.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysGravityStrengthCtlr.h b/include/obj/NiPSysGravityStrengthCtlr.h
index 48120d2c2808e7ce3edbab0b0970ec53bb4f69d0..624cccce8857fde0aa55a0d3d85a529aaa067e29 100644
--- a/include/obj/NiPSysGravityStrengthCtlr.h
+++ b/include/obj/NiPSysGravityStrengthCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysGrowFadeModifier.h b/include/obj/NiPSysGrowFadeModifier.h
index f738498c54c1072788fd3c27c39a9b3de84449e0..46acbe77c661a28bec9d345c2a6493f1e506f492 100644
--- a/include/obj/NiPSysGrowFadeModifier.h
+++ b/include/obj/NiPSysGrowFadeModifier.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysMeshEmitter.h b/include/obj/NiPSysMeshEmitter.h
index e576aaba0dacbf3fb5611c3afcc4faf3aa5fc343..c13f487fe99ab764fca6a9847d11d45fd188ea99 100644
--- a/include/obj/NiPSysMeshEmitter.h
+++ b/include/obj/NiPSysMeshEmitter.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysMeshUpdateModifier.h b/include/obj/NiPSysMeshUpdateModifier.h
index 975c81890b6de101f03760fe3b9ffca08aee7a63..6338191bc368f14cd622cb0f8032bfd495905727 100644
--- a/include/obj/NiPSysMeshUpdateModifier.h
+++ b/include/obj/NiPSysMeshUpdateModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysModifier.h b/include/obj/NiPSysModifier.h
index a3108d1cc593ffa35ea70d70d1ef0bc8e91292d0..b4ef0a1392def78a28c90fc9efc9f412060f0bb0 100644
--- a/include/obj/NiPSysModifier.h
+++ b/include/obj/NiPSysModifier.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysModifierActiveCtlr.h b/include/obj/NiPSysModifierActiveCtlr.h
index 57e711deeb6c62d0f819be626803481549f01b9c..d75b1fa5160f1f445804ca452e423c1650b8e0ad 100644
--- a/include/obj/NiPSysModifierActiveCtlr.h
+++ b/include/obj/NiPSysModifierActiveCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysPlanarCollider.h b/include/obj/NiPSysPlanarCollider.h
index 04fc744e1fdc7af73be6a2d4cdc76255b4b2d2c1..7fd02afc2d003ec90d036422a82a9db1aade567f 100644
--- a/include/obj/NiPSysPlanarCollider.h
+++ b/include/obj/NiPSysPlanarCollider.h
@@ -36,7 +36,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysPositionModifier.h b/include/obj/NiPSysPositionModifier.h
index d57e265b23e58432918b21c4d3f5a7176447c1cf..26157a711e75cbf7936806433fd2476337cb3c42 100644
--- a/include/obj/NiPSysPositionModifier.h
+++ b/include/obj/NiPSysPositionModifier.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysResetOnLoopCtlr.h b/include/obj/NiPSysResetOnLoopCtlr.h
index 3294f46e4cef50b204f250848253e67253578a51..ca921e42d89ebd9efa9955f3012dcfde6aaf748d 100644
--- a/include/obj/NiPSysResetOnLoopCtlr.h
+++ b/include/obj/NiPSysResetOnLoopCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysRotationModifier.h b/include/obj/NiPSysRotationModifier.h
index c7af7d9e0f2c4596b11a5eacd9eecc80c0ede6b1..bb9369a230d78bdb53bf52bc73a26595bfdbd0e2 100644
--- a/include/obj/NiPSysRotationModifier.h
+++ b/include/obj/NiPSysRotationModifier.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysSpawnModifier.h b/include/obj/NiPSysSpawnModifier.h
index b72592ddd838fd493314b9cc4f8832e327e44841..adfb09113c7305d278a23e1675dddf986a1bdf95 100644
--- a/include/obj/NiPSysSpawnModifier.h
+++ b/include/obj/NiPSysSpawnModifier.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysSphereEmitter.h b/include/obj/NiPSysSphereEmitter.h
index 037275ab11db17396bea6524d8538bc19ea3f719..d3e0322d3cbc0b6a7bf27ebb5111f1869a202cd5 100644
--- a/include/obj/NiPSysSphereEmitter.h
+++ b/include/obj/NiPSysSphereEmitter.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysUpdateCtlr.h b/include/obj/NiPSysUpdateCtlr.h
index 8abb60373a2a17d24009173c704e7bbcc90f2c9d..fd84a0db39f00ef2cf3989d2faf3e22d11fb8a10 100644
--- a/include/obj/NiPSysUpdateCtlr.h
+++ b/include/obj/NiPSysUpdateCtlr.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPSysVolumeEmitter.h b/include/obj/NiPSysVolumeEmitter.h
index a706945fc4ddaa530c3a3e53eb0f651e0af6d7fa..75e035f2f76dd00a5453cb3e4e6e6d6f88db7f0a 100644
--- a/include/obj/NiPSysVolumeEmitter.h
+++ b/include/obj/NiPSysVolumeEmitter.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPalette.h b/include/obj/NiPalette.h
index 9ababc3f27273d6122311397479193179fdbcb21..ac3612285921f0268589abaeca7c5d1c4062013a 100644
--- a/include/obj/NiPalette.h
+++ b/include/obj/NiPalette.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleBomb.h b/include/obj/NiParticleBomb.h
index 804c16bd3af93ed626673d5a2a31b79c69f2247b..9765e6c29e73e92fb2aace1a8d6f14ed2f42c33c 100644
--- a/include/obj/NiParticleBomb.h
+++ b/include/obj/NiParticleBomb.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleColorModifier.h b/include/obj/NiParticleColorModifier.h
index ba06ed904166b840604461442071fb95972435ab..ed047c1e143a74c4145c55c5091c6b8074bdd3ee 100644
--- a/include/obj/NiParticleColorModifier.h
+++ b/include/obj/NiParticleColorModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleGrowFade.h b/include/obj/NiParticleGrowFade.h
index fe70404f9998341f7b33a97fe53c43a64050682f..d65a6ccba5a42d08cebf0bad49d7e30d6f3a3462 100644
--- a/include/obj/NiParticleGrowFade.h
+++ b/include/obj/NiParticleGrowFade.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleMeshModifier.h b/include/obj/NiParticleMeshModifier.h
index a83932874e849f0c3bb7dede246bb767819b0841..9f99ead5ecc229771a28ef7cd7b59681ff5e52ff 100644
--- a/include/obj/NiParticleMeshModifier.h
+++ b/include/obj/NiParticleMeshModifier.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleMeshes.h b/include/obj/NiParticleMeshes.h
index 2e6f1b739afd0753ed8bdf994651753ab3a60fd1..c03d027dd928ad53a54fba140b8c2914c36e8788 100644
--- a/include/obj/NiParticleMeshes.h
+++ b/include/obj/NiParticleMeshes.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleMeshesData.h b/include/obj/NiParticleMeshesData.h
index 17708a46cdabef9726d7bf4010e8c14a3e007dd8..921400b78c177ab6a678559940daa52e61b66397 100644
--- a/include/obj/NiParticleMeshesData.h
+++ b/include/obj/NiParticleMeshesData.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleRotation.h b/include/obj/NiParticleRotation.h
index b0f7a3fad5138cb1a047b068b0fb6506b6a60c13..8d03575d58355d63455b6a1cb76a559413f2f065 100644
--- a/include/obj/NiParticleRotation.h
+++ b/include/obj/NiParticleRotation.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleSystem.h b/include/obj/NiParticleSystem.h
index cf0f71e959b6661b55eb2530a164ab7c290c6149..1beca59415c6437ce50348c66a2924067087c1ab 100644
--- a/include/obj/NiParticleSystem.h
+++ b/include/obj/NiParticleSystem.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticleSystemController.h b/include/obj/NiParticleSystemController.h
index c0febfde53e004fee9e0a1063cd80bee5d307f06..a4d4eb153925e1cdf9a82aa83030d16b7feaddd9 100644
--- a/include/obj/NiParticleSystemController.h
+++ b/include/obj/NiParticleSystemController.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 	//TODO:  This controller is not a priority and it has a lot of unknown data.
diff --git a/include/obj/NiParticles.h b/include/obj/NiParticles.h
index 37cf037954e4735ff23830a322f272096b6960e6..32e477de317e76a7758356c25a70920877e1c3f5 100644
--- a/include/obj/NiParticles.h
+++ b/include/obj/NiParticles.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiParticlesData.h b/include/obj/NiParticlesData.h
index 0a776b4d6b75a75fff72f2233c5d48e7c572086c..d6d824a5a04dc0aa151f80c67ee130503229630f 100644
--- a/include/obj/NiParticlesData.h
+++ b/include/obj/NiParticlesData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPathController.h b/include/obj/NiPathController.h
index ab738ca1397f80f9fa1d3475c68f0666f30fc516..c312a02afb5991898518b2fb0f8e7d80adfd8564 100644
--- a/include/obj/NiPathController.h
+++ b/include/obj/NiPathController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPathInterpolator.h b/include/obj/NiPathInterpolator.h
index c6ba63da1bd30b1f5f1aaccc75816543fb3ad127..28efc65fde394b3e7c7f2e5b5245d866585f818e 100644
--- a/include/obj/NiPathInterpolator.h
+++ b/include/obj/NiPathInterpolator.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPixelData.h b/include/obj/NiPixelData.h
index 91f7854badb17c93821c684be17e5dd86d329878..3ea7f9c0934235984b2bd0ada50bf2dc6a8cda5b 100644
--- a/include/obj/NiPixelData.h
+++ b/include/obj/NiPixelData.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPlanarCollider.h b/include/obj/NiPlanarCollider.h
index a2392b317cdbf6e4eb6bed4040fea37a6ca7bb76..adb05af185473be9bfef977cc2dbc3caec6666e4 100644
--- a/include/obj/NiPlanarCollider.h
+++ b/include/obj/NiPlanarCollider.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPoint3Interpolator.h b/include/obj/NiPoint3Interpolator.h
index 3a7c91eb1262b7f9346234d73eddb075c06e2e90..b2d65ebc2bb82fc9df569531fbb87c2b4981f154 100644
--- a/include/obj/NiPoint3Interpolator.h
+++ b/include/obj/NiPoint3Interpolator.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPointLight.h b/include/obj/NiPointLight.h
index 6b1ee4d48df8514a7786bc6f196f30598443d96d..f461985215e91927903634ba8d9c58a3adbd9512 100644
--- a/include/obj/NiPointLight.h
+++ b/include/obj/NiPointLight.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiPosData.h b/include/obj/NiPosData.h
index 98cd8465d5972959eae7af911fe2a457200bc60b..9f744b8786b0b31f66562155889b318130274d98 100644
--- a/include/obj/NiPosData.h
+++ b/include/obj/NiPosData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiProperty.h b/include/obj/NiProperty.h
index 7a24dc70d205e3bfea0765b2a88e94516136bb8e..2e327573540756635b11b26b54a520ba3b2218ad 100644
--- a/include/obj/NiProperty.h
+++ b/include/obj/NiProperty.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiRangeLODData.h b/include/obj/NiRangeLODData.h
index c6e401bd4e69060401b2512beda281d3cf9f422e..5f7b5da72c019b0b25820b40200141ab987eae1e 100644
--- a/include/obj/NiRangeLODData.h
+++ b/include/obj/NiRangeLODData.h
@@ -33,7 +33,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiRotatingParticles.h b/include/obj/NiRotatingParticles.h
index f340c74efdd945fe7a49a870a9ca1e24da4eb4d5..515b88e4eea78b93d3a704d45884eafcec26df99 100644
--- a/include/obj/NiRotatingParticles.h
+++ b/include/obj/NiRotatingParticles.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiRotatingParticlesData.h b/include/obj/NiRotatingParticlesData.h
index affbb414e7cfdff4cb4beb4e783fcb44eff55333..460c3c8cfb75119ed0be07dfebfd90df88fc49a1 100644
--- a/include/obj/NiRotatingParticlesData.h
+++ b/include/obj/NiRotatingParticlesData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiScreenLODData.h b/include/obj/NiScreenLODData.h
index 1a3e7b479b1abad43ed32955faba7f207c31c708..3530f755285e46f6d4f51a1f4594358f053ffc06 100644
--- a/include/obj/NiScreenLODData.h
+++ b/include/obj/NiScreenLODData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSequenceStreamHelper.h b/include/obj/NiSequenceStreamHelper.h
index 6b985f0ceccbd48243337d3bf05499fb58215256..5f2d6aad68c95e5bb394842edfadc605a461f75c 100644
--- a/include/obj/NiSequenceStreamHelper.h
+++ b/include/obj/NiSequenceStreamHelper.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiShadeProperty.h b/include/obj/NiShadeProperty.h
index cec3e2a9b329643184ae93f95aa81bfbb0108311..811f8477d9727051ec75b83b83a800d3c9e10c31 100644
--- a/include/obj/NiShadeProperty.h
+++ b/include/obj/NiShadeProperty.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSingleInterpolatorController.h b/include/obj/NiSingleInterpolatorController.h
index 09b4b7f648688f09db4e93bfba6191c6b7ebaa02..efbca783d61e57dbe55ac688fa5c4a3a2e130e8f 100644
--- a/include/obj/NiSingleInterpolatorController.h
+++ b/include/obj/NiSingleInterpolatorController.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSkinData.h b/include/obj/NiSkinData.h
index d79201454962f723ca6567f507cadd146c1e710a..63e6cd6d6ad951cf2fe073dc1caecb0e6808df71 100644
--- a/include/obj/NiSkinData.h
+++ b/include/obj/NiSkinData.h
@@ -43,7 +43,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSkinInstance.h b/include/obj/NiSkinInstance.h
index 5fa4fd8c9088d2aa7be806d644439b7662854e92..63409e88c0c783ffc138232a54d403f7ae87d200 100644
--- a/include/obj/NiSkinInstance.h
+++ b/include/obj/NiSkinInstance.h
@@ -43,7 +43,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSkinPartition.h b/include/obj/NiSkinPartition.h
index df04b7d056b3735e4987e8ccb64f22c711bce8c8..c62f5240e4a52cb1fb3b23e51f8ec673a7c65c36 100644
--- a/include/obj/NiSkinPartition.h
+++ b/include/obj/NiSkinPartition.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSourceTexture.h b/include/obj/NiSourceTexture.h
index 004cc68fa3e8259d0668e5f0f027b3cfe687eb8e..8aa0c9915cf10cf1a0d435a51647fd7998cc6eec 100644
--- a/include/obj/NiSourceTexture.h
+++ b/include/obj/NiSourceTexture.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSpecularProperty.h b/include/obj/NiSpecularProperty.h
index 7152e0a6ab5faff67ff01d9d7b86470f500deb55..055578621f57bcdfae9c1136bdcda304af3fc6c0 100644
--- a/include/obj/NiSpecularProperty.h
+++ b/include/obj/NiSpecularProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSphericalCollider.h b/include/obj/NiSphericalCollider.h
index 03f8a904611744ddfa152c9d99512d4e98ed3ff9..037d94042609a37664f9c163a836dbb325c18f2e 100644
--- a/include/obj/NiSphericalCollider.h
+++ b/include/obj/NiSphericalCollider.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiSpotLight.h b/include/obj/NiSpotLight.h
index a19be9fa358388bfc4cf3783714776bd729d8b68..fe6a49aa4df8d161184b05d21fff6065395b8ebf 100644
--- a/include/obj/NiSpotLight.h
+++ b/include/obj/NiSpotLight.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiStencilProperty.h b/include/obj/NiStencilProperty.h
index 84496e3cb323ac23854179f6b364bebc14614e62..82839c4a95586b25e0b7b390b57cdc8f4328f458 100644
--- a/include/obj/NiStencilProperty.h
+++ b/include/obj/NiStencilProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiStringExtraData.h b/include/obj/NiStringExtraData.h
index 6f379b2ad03b43d4a8ed5e96016e59ddbd1830ca..c6d26d1d482e92563760cbe260e14237fdda09d5 100644
--- a/include/obj/NiStringExtraData.h
+++ b/include/obj/NiStringExtraData.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiStringPalette.h b/include/obj/NiStringPalette.h
index 423ebadd60e1c328c52bc17188f04d5f6cb0dd76..a77245bc581bf7a757bafafdca837d291eea6941 100644
--- a/include/obj/NiStringPalette.h
+++ b/include/obj/NiStringPalette.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiStringsExtraData.h b/include/obj/NiStringsExtraData.h
index 07131e1b8dd295672080121011c421da9f0336f2..8998bf906a297428c7dcf2d2423c0ad074513d91 100644
--- a/include/obj/NiStringsExtraData.h
+++ b/include/obj/NiStringsExtraData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTextKeyExtraData.h b/include/obj/NiTextKeyExtraData.h
index 69c309d80dd76287bf9509469ad97a073fa2fa91..a4e6622cc73282a015e5b27aa5b48c3d2056149f 100644
--- a/include/obj/NiTextKeyExtraData.h
+++ b/include/obj/NiTextKeyExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	const Type & GetType() const;
 
diff --git a/include/obj/NiTextureEffect.h b/include/obj/NiTextureEffect.h
index 1133cf8fbb7e950b5b487fa123f10a8bb7709274..c133581b223df2a7a9f2d707ae1c86eab7f16377 100644
--- a/include/obj/NiTextureEffect.h
+++ b/include/obj/NiTextureEffect.h
@@ -37,7 +37,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTextureTransformController.h b/include/obj/NiTextureTransformController.h
index dd6c72277095fbb5deb1c99eef9cf704d035e743..0f173a5208cc911f8af14277cd2bd2bb79824d0b 100644
--- a/include/obj/NiTextureTransformController.h
+++ b/include/obj/NiTextureTransformController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTexturingProperty.h b/include/obj/NiTexturingProperty.h
index 21e75bece8f67b75ee2364fe7108963b675a939a..575a3aababbb12060e53b918192fc9c23e8f70f0 100644
--- a/include/obj/NiTexturingProperty.h
+++ b/include/obj/NiTexturingProperty.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTimeController.h b/include/obj/NiTimeController.h
index b4c8386384b9eeec7806c42769e63b2e105f2cac..154755c58cef38f1a663b922ed525a887d0d7288 100644
--- a/include/obj/NiTimeController.h
+++ b/include/obj/NiTimeController.h
@@ -33,7 +33,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTransformController.h b/include/obj/NiTransformController.h
index ffe96b05f401eba9a7c824c229b5df9a12ee7b5d..fdc3fb67a905edf07f6b528c4697452d7d688434 100644
--- a/include/obj/NiTransformController.h
+++ b/include/obj/NiTransformController.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTransformData.h b/include/obj/NiTransformData.h
index 59570cf3b9fb681fc7929db71917b34dceb19a43..539ed410b31c712ce68a622f047fb0b5b29ea1f0 100644
--- a/include/obj/NiTransformData.h
+++ b/include/obj/NiTransformData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTransformInterpolator.h b/include/obj/NiTransformInterpolator.h
index 60d86bea35b989ae2f9f03011c18a47dc964477e..bf523a55cfb0adb83cf4db76a4e4c65e785b706e 100644
--- a/include/obj/NiTransformInterpolator.h
+++ b/include/obj/NiTransformInterpolator.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTriBasedGeom.h b/include/obj/NiTriBasedGeom.h
index 350d94a60582da80285223f5ce00183bb7bfa859..62bd716a91e54d8b7bce82539d972ebb47d7527e 100644
--- a/include/obj/NiTriBasedGeom.h
+++ b/include/obj/NiTriBasedGeom.h
@@ -38,7 +38,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTriBasedGeomData.h b/include/obj/NiTriBasedGeomData.h
index 9bcec05fea9b0115204365d1d219cb0741865465..8c61d2c88d60f1894331f9ac2458190f31990fb4 100644
--- a/include/obj/NiTriBasedGeomData.h
+++ b/include/obj/NiTriBasedGeomData.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTriShape.h b/include/obj/NiTriShape.h
index 59ed973ab6a7fb6910bc680d3118e97a2231f90c..625e5830bcfc54856586631db0de834610a85b42 100644
--- a/include/obj/NiTriShape.h
+++ b/include/obj/NiTriShape.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTriShapeData.h b/include/obj/NiTriShapeData.h
index 87d7b9735cce9c8b0a5bf547335541cd2bad76e9..3885671389cfd40f65c435193ea0720fe5ef2c33 100644
--- a/include/obj/NiTriShapeData.h
+++ b/include/obj/NiTriShapeData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 public:
diff --git a/include/obj/NiTriStrips.h b/include/obj/NiTriStrips.h
index 881327a240e13aae421655293d745b521ed27c0a..68a6f1596a694cb4e415faaa44082cc260068827 100644
--- a/include/obj/NiTriStrips.h
+++ b/include/obj/NiTriStrips.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiTriStripsData.h b/include/obj/NiTriStripsData.h
index 1c9a315fc1be4bb20b8c4d4441d54ff6bcc88067..6afc5c2e674a9b7c7c5011a115648a58d326d5de 100644
--- a/include/obj/NiTriStripsData.h
+++ b/include/obj/NiTriStripsData.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiUVController.h b/include/obj/NiUVController.h
index 3f2f868f8c3c077bade221f7ab176f2f4fce88e7..8839f63f182b15f5b5183349b0e7031276e6dc4b 100644
--- a/include/obj/NiUVController.h
+++ b/include/obj/NiUVController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiUVData.h b/include/obj/NiUVData.h
index 7861801076499daf3fe2ec973c5e3fd0cf9eee24..00dd9c7937b19ac5a9d11d7095e9b859468ba840 100644
--- a/include/obj/NiUVData.h
+++ b/include/obj/NiUVData.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiVectorExtraData.h b/include/obj/NiVectorExtraData.h
index a68b8cd82346d914cdd819e16ec0e4142e869d45..3a95ba05f1637a8951121511b01c859e8cf24d3f 100644
--- a/include/obj/NiVectorExtraData.h
+++ b/include/obj/NiVectorExtraData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiVertWeightsExtraData.h b/include/obj/NiVertWeightsExtraData.h
index e8bf76824f63c98667cce945e13424e0e2f56450..6447edbaf51e1e6a62ef7a69db8163128f9c5b95 100644
--- a/include/obj/NiVertWeightsExtraData.h
+++ b/include/obj/NiVertWeightsExtraData.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiVertexColorProperty.h b/include/obj/NiVertexColorProperty.h
index 8d8847fba5bdf906a8913569c755e9fbffaa423b..3f68511a045392c01f3a64e56276b34687fed9dd 100644
--- a/include/obj/NiVertexColorProperty.h
+++ b/include/obj/NiVertexColorProperty.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiVisController.h b/include/obj/NiVisController.h
index cf2d07d74d4c6a92a41e20c5f477028b56cf84c4..4d6c85bf3a749d6d9d0d618c8ce1d13505ca075e 100644
--- a/include/obj/NiVisController.h
+++ b/include/obj/NiVisController.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiVisData.h b/include/obj/NiVisData.h
index 79b8a0c870239995e04a59b566ac02e3910cbadd..27228ed43c549c406f06feeb799ed408be5d244f 100644
--- a/include/obj/NiVisData.h
+++ b/include/obj/NiVisData.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiWireframeProperty.h b/include/obj/NiWireframeProperty.h
index 921ce33de23ab27853222904677c97b563c977af..d45bae86df7b47fb38dc62d8112631e54ae15bbc 100644
--- a/include/obj/NiWireframeProperty.h
+++ b/include/obj/NiWireframeProperty.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/NiZBufferProperty.h b/include/obj/NiZBufferProperty.h
index e21faa7749471d889a96d8779793d1de2b00fc27..2f47b77a14b51e094be7ddee2211b11602f1c55a 100644
--- a/include/obj/NiZBufferProperty.h
+++ b/include/obj/NiZBufferProperty.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/RootCollisionNode.h b/include/obj/RootCollisionNode.h
index b452ae3201fe8b64b84fc3f64831ba2b7e2686dc..d1389599bbd4649b874769e73f80a6be2441c959 100644
--- a/include/obj/RootCollisionNode.h
+++ b/include/obj/RootCollisionNode.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkBlendCollisionObject.h b/include/obj/bhkBlendCollisionObject.h
index aabb57288b82b115d1c5f9b480aa7b00166ca133..dcb70b8327920652191993b8645724a577c587f2 100644
--- a/include/obj/bhkBlendCollisionObject.h
+++ b/include/obj/bhkBlendCollisionObject.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkBlendController.h b/include/obj/bhkBlendController.h
index b7d2fa8b6ea9fe25112cbe99e48d56fe5d8d4dbe..edd24b05fb5fc46cc34440f95430a10d49ba5f37 100644
--- a/include/obj/bhkBlendController.h
+++ b/include/obj/bhkBlendController.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkBoxShape.h b/include/obj/bhkBoxShape.h
index 4e1bb6e62f0bc60de169bca4e239520fbdd15c7c..6d35075a242ef4f93386717aa57ab4b918c82efc 100644
--- a/include/obj/bhkBoxShape.h
+++ b/include/obj/bhkBoxShape.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkCapsuleShape.h b/include/obj/bhkCapsuleShape.h
index 49be185ebaa3d1d04ece3885694f34077a3c30d4..b2cb2fe3473fcb2148733bede9d195419b78c8f0 100644
--- a/include/obj/bhkCapsuleShape.h
+++ b/include/obj/bhkCapsuleShape.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkCollisionObject.h b/include/obj/bhkCollisionObject.h
index 58dcbfd7e44e1ec1bcdffa774fb65e589964daee..07ac152da182848eaba0b6d5bdeb45a37a251c45 100644
--- a/include/obj/bhkCollisionObject.h
+++ b/include/obj/bhkCollisionObject.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkConvexShape.h b/include/obj/bhkConvexShape.h
index dd9f70bb39beeedae7997bde0b3d8502b04ef7d1..ad67cb2f1a30177704e7c6fac77a17ed5ffe86b2 100644
--- a/include/obj/bhkConvexShape.h
+++ b/include/obj/bhkConvexShape.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkConvexTransformShape.h b/include/obj/bhkConvexTransformShape.h
index 075716179efd2b0fec7f408186c19c51d9798d17..2a7ec917ec239a8a559aa605bdee8d471f7b8e53 100644
--- a/include/obj/bhkConvexTransformShape.h
+++ b/include/obj/bhkConvexTransformShape.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkConvexVerticesShape.h b/include/obj/bhkConvexVerticesShape.h
index 962a3a4016a729494b20bcaeb7faed373b7a0a56..07fffb46e6e8c0fecbf0eaca1e73db8286993245 100644
--- a/include/obj/bhkConvexVerticesShape.h
+++ b/include/obj/bhkConvexVerticesShape.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkEntity.h b/include/obj/bhkEntity.h
index 303e8e9d2c3e28afddda648982741357af0173a4..0a97e97a3aadfb42b6c8b2fc912457e6a1f750d5 100644
--- a/include/obj/bhkEntity.h
+++ b/include/obj/bhkEntity.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkHingeConstraint.h b/include/obj/bhkHingeConstraint.h
index e55558bb766d45f5706c7bf40375fd4d1178cc69..31b984ceb8c9dec7c67093cd627b9aba462668ba 100644
--- a/include/obj/bhkHingeConstraint.h
+++ b/include/obj/bhkHingeConstraint.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkLimitedHingeConstraint.h b/include/obj/bhkLimitedHingeConstraint.h
index 050faafea5c3289a02c295c8f020afebc924e9de..de9d3fa3d1b897adc521d1b6aa8030637fa0f3c1 100644
--- a/include/obj/bhkLimitedHingeConstraint.h
+++ b/include/obj/bhkLimitedHingeConstraint.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkListShape.h b/include/obj/bhkListShape.h
index cf0f85fb405d3442bc7e48c52829c570786f217c..be79d4aabc1be8057237645850a16a3bf21d8761 100644
--- a/include/obj/bhkListShape.h
+++ b/include/obj/bhkListShape.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkMalleableConstraint.h b/include/obj/bhkMalleableConstraint.h
index af3b0bdf5b5b72114afa1797fd8a632c02643fdf..005a64e5ad3a527e450154afd858f7527a260717 100644
--- a/include/obj/bhkMalleableConstraint.h
+++ b/include/obj/bhkMalleableConstraint.h
@@ -36,7 +36,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkMoppBvTreeShape.h b/include/obj/bhkMoppBvTreeShape.h
index e827533b9088cca0f2dccac605e8b3398f3ebdcb..29e517d8f1754ce96f503e80437429a61ee6a8ef 100644
--- a/include/obj/bhkMoppBvTreeShape.h
+++ b/include/obj/bhkMoppBvTreeShape.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkMultiSphereShape.h b/include/obj/bhkMultiSphereShape.h
index e0af13708420cc037f6fb8818e01d69cf91f9ca4..57c11a7b5da3fc97d75462ec25e7ceea00b209e1 100644
--- a/include/obj/bhkMultiSphereShape.h
+++ b/include/obj/bhkMultiSphereShape.h
@@ -31,7 +31,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkNiTriStripsShape.h b/include/obj/bhkNiTriStripsShape.h
index 34fcf04483dd6017ae7ceaf7d13af36715db7008..6203877d2b49126b2662b1c9e82240ad4f6d0de1 100644
--- a/include/obj/bhkNiTriStripsShape.h
+++ b/include/obj/bhkNiTriStripsShape.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkPackedNiTriStripsShape.h b/include/obj/bhkPackedNiTriStripsShape.h
index be303c473a61524aea5cd89f69bf87add031df1b..7ef118d28913bae5a590dbd9f56d3168d9ecaf2c 100644
--- a/include/obj/bhkPackedNiTriStripsShape.h
+++ b/include/obj/bhkPackedNiTriStripsShape.h
@@ -34,7 +34,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkPrismaticConstraint.h b/include/obj/bhkPrismaticConstraint.h
index 2b83db8737625cb28d57b296a662747bdabcc8b0..574fd8cf1c410de61248621c2d0907df5b9eaf49 100644
--- a/include/obj/bhkPrismaticConstraint.h
+++ b/include/obj/bhkPrismaticConstraint.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkRagdollConstraint.h b/include/obj/bhkRagdollConstraint.h
index adf6c69fc77246c7cb8f8ceb6b9a94c6fafed966..d6ca1cbd905e61d2a0511b774c74b130fa217e19 100644
--- a/include/obj/bhkRagdollConstraint.h
+++ b/include/obj/bhkRagdollConstraint.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkRefObject.h b/include/obj/bhkRefObject.h
index b128701677ba9de9a3b847b58d28f342b6c09bdd..84b8ae18981e48cd2d510df39b36a99b7a5b7a38 100644
--- a/include/obj/bhkRefObject.h
+++ b/include/obj/bhkRefObject.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkRigidBody.h b/include/obj/bhkRigidBody.h
index 27a024d2e6a4890325a5e27888c9c7cd29dbd234..ed5ccb6cf64c70ac83fb314e05c8d8689ae89193 100644
--- a/include/obj/bhkRigidBody.h
+++ b/include/obj/bhkRigidBody.h
@@ -35,7 +35,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkRigidBodyT.h b/include/obj/bhkRigidBodyT.h
index cb3f2d291e71618ee0db1e700953b2bf8ffe8cf3..fd6a0f2ed5c9f36981329ebb822b6e58b7e73525 100644
--- a/include/obj/bhkRigidBodyT.h
+++ b/include/obj/bhkRigidBodyT.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkSPCollisionObject.h b/include/obj/bhkSPCollisionObject.h
index a65450c8e0e7605f5586e89215551006215cb501..bdd51302864760a13a1c67b8d88b471007724409 100644
--- a/include/obj/bhkSPCollisionObject.h
+++ b/include/obj/bhkSPCollisionObject.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkSerializable.h b/include/obj/bhkSerializable.h
index ca3d227c5bba3c96f58076332c268b23b8fcd00f..f11fe2b7d761e8da09f93d486ea69008626f292c 100644
--- a/include/obj/bhkSerializable.h
+++ b/include/obj/bhkSerializable.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkShape.h b/include/obj/bhkShape.h
index d41cc1fea2f4271cf67cd7af66d1e583df4c72e4..9e182115e473142a3aff21e6828da47b7725f721 100644
--- a/include/obj/bhkShape.h
+++ b/include/obj/bhkShape.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkSimpleShapePhantom.h b/include/obj/bhkSimpleShapePhantom.h
index a21f05133cf7b77e1765fa45e42dfc9eff5bdfa0..f5e9fdf1d5f2605fbed4c7939782ce28494043ae 100644
--- a/include/obj/bhkSimpleShapePhantom.h
+++ b/include/obj/bhkSimpleShapePhantom.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkSphereRepShape.h b/include/obj/bhkSphereRepShape.h
index 23b87bac73013a99c24a4516047b6f9b1d959a9d..7e04adb7ff5efb88bdc3983f974c0d3230f1480e 100644
--- a/include/obj/bhkSphereRepShape.h
+++ b/include/obj/bhkSphereRepShape.h
@@ -30,7 +30,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkSphereShape.h b/include/obj/bhkSphereShape.h
index 2c687091782f900c8f27694a87485ff1f2689fb0..9263fcaadae8e366b605e333658f7e7ea564871c 100644
--- a/include/obj/bhkSphereShape.h
+++ b/include/obj/bhkSphereShape.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkStiffSpringConstraint.h b/include/obj/bhkStiffSpringConstraint.h
index df3221026fbbb64e657f72c441a0b576f6359d34..674de68af613b3343d005ed585cdb466e963ecc1 100644
--- a/include/obj/bhkStiffSpringConstraint.h
+++ b/include/obj/bhkStiffSpringConstraint.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkTransformShape.h b/include/obj/bhkTransformShape.h
index 9424b984ac36c8e0c4bb8e4b61acd44f05f86f4f..f7bb9e594fed04e93f127f7fa3ceb33a80874083 100644
--- a/include/obj/bhkTransformShape.h
+++ b/include/obj/bhkTransformShape.h
@@ -29,7 +29,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/bhkWorldObject.h b/include/obj/bhkWorldObject.h
index 6e344c3a2e2efb8853e55255a8735742f8cd3859..8e273ab9be4e634a224cf21d6f23628c632a665b 100644
--- a/include/obj/bhkWorldObject.h
+++ b/include/obj/bhkWorldObject.h
@@ -28,7 +28,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/include/obj/hkPackedNiTriStripsData.h b/include/obj/hkPackedNiTriStripsData.h
index ea7013b3408af8028618eee28da0517bd13694f3..b7ce0133e8582fc065c769eb934c0515a5a202f7 100644
--- a/include/obj/hkPackedNiTriStripsData.h
+++ b/include/obj/hkPackedNiTriStripsData.h
@@ -32,7 +32,7 @@ public:
 	virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const;
 	virtual string asString( bool verbose = false ) const;
-	virtual void FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
+	virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version );
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
diff --git a/src/NIF_IO.cpp b/src/NIF_IO.cpp
index 3e7001c38155784c542d40a1c81850a6c1d94411..53222bad2e9fee01a6ae9e1c5c97548e3e59613b 100644
--- a/src/NIF_IO.cpp
+++ b/src/NIF_IO.cpp
@@ -2,6 +2,7 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 #include "../include/NIF_IO.h"
+#include "../include/niflib.h"
 namespace Niflib {
 
 int BlockSearch( istream& in ) {
@@ -233,22 +234,35 @@ void NifStream( string const & val, ostream& out, uint version ) { WriteString(
 //--Structs--//
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, uint version ) {
-	char tmp[64];
-	in.getline( tmp, 64 );
+void NifStream( HeaderString & val, istream& in, uint & version ) {
+	char tmp[256];
+	in.getline( tmp, 256 );
 	val.header = tmp;
 
-        // make sure this is a NIF file
-        if ( ( val.header.substr(0, 22) != "NetImmerse File Format" )
-        && ( val.header.substr(0, 20) != "Gamebryo File Format" ) )
-                throw runtime_error("Not a NIF file.");
-
-        // detect old versions
-        if ( ( val.header == "NetImmerse File Format, Version 3.1" )
-        || ( val.header == "NetImmerse File Format, Version 3.03" )
-        || ( val.header == "NetImmerse File Format, Version 3.0" )
-        || ( val.header == "NetImmerse File Format, Version 2.3" ) )
-                throw runtime_error("Unsupported: " + val.header);
+	// make sure this is a NIF file
+	unsigned ver_start = 0;
+	if ( val.header.substr(0, 22) == "NetImmerse File Format" ) {
+		ver_start = 32;
+	} else if ( val.header.substr(0, 20) == "Gamebryo File Format" ) {
+		ver_start = 30;
+	} else {
+		//Not a NIF file
+		version = VER_INVALID;
+	}
+
+	//Parse version string and return result.
+	version = ParseVersionString( val.header.substr( ver_start ) );
+
+	//Temporarily read the next 3 strings if this is a < 4 file
+	if ( version < VER_4_0_0_0 ) {
+		in.getline( tmp, 256 );
+		in.getline( tmp, 256 );
+		in.getline( tmp, 256 );
+	}
+
+	//if ( version < VER_4_0_0_0 ) {
+	//	throw runtime_error("NIF Versions below 4.0.0.0 are not yet supported");
+	//}
 };
 
 void NifStream( HeaderString const & val, ostream& out, uint version ) {
diff --git a/src/gen/Header.cpp b/src/gen/Header.cpp
index 7dbfe23afb5ea0fa4a5c6bfc11bf02d9491c5d82..6a192a85afdd8215a8112a2a1bfea21970b40b74 100644
--- a/src/gen/Header.cpp
+++ b/src/gen/Header.cpp
@@ -11,14 +11,18 @@ Header::Header() : version((uint)0x04000002), endianType((byte)1), userVersion((
 Header::~Header() {};
 void Header::Read( istream& in ) {
 	NifStream( headerString, in, version );
-	NifStream( version, in, version );
+	if ( version >= 0x04000000 ) {
+		NifStream( version, in, version );
+	};
 	if ( version >= 0x14000004 ) {
 		NifStream( endianType, in, version );
 	};
 	if ( version >= 0x0A010000 ) {
 		NifStream( userVersion, in, version );
 	};
-	NifStream( numBlocks, in, version );
+	if ( version >= 0x04000000 ) {
+		NifStream( numBlocks, in, version );
+	};
 	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
 		NifStream( unknownInt1, in, version );
 	};
@@ -52,14 +56,18 @@ void Header::Write( ostream& out ) const {
 	numBlockTypes = ushort(blockTypes.size());
 	numBlocks = uint(blockTypeIndex.size());
 	NifStream( headerString, out, version );
-	NifStream( version, out, version );
+	if ( version >= 0x04000000 ) {
+		NifStream( version, out, version );
+	};
 	if ( version >= 0x14000004 ) {
 		NifStream( endianType, out, version );
 	};
 	if ( version >= 0x0A010000 ) {
 		NifStream( userVersion, out, version );
 	};
-	NifStream( numBlocks, out, version );
+	if ( version >= 0x04000000 ) {
+		NifStream( numBlocks, out, version );
+	};
 	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
 		NifStream( unknownInt1, out, version );
 	};
diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp
index 0c257b9c7cfa498c18385e27c7b8f2f0eab1847a..0b3e2d106b622f300549c01ca394e5072f5f30cc 100644
--- a/src/gen/obj_impl.cpp
+++ b/src/gen/obj_impl.cpp
@@ -188,6 +188,36 @@ using namespace std;
 #include "../../include/obj/NiZBufferProperty.h"
 #include "../../include/obj/RootCollisionNode.h"
 
+const char FIX_LINK_POP_ERROR[] = "Trying to pop a link from empty stack. This is probably a bug.";
+const char FIX_LINK_INDEX_ERROR[] = "Object index was not found in object map.  This NIF file may be invalid or imporperly supported.";
+const char FIX_LINK_CAST_ERROR[] = "Link could not be cast to required type during file read. This NIF file may be invalid or improperly supported.";
+
+template <class T>
+Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned version ) {
+	if (link_stack.empty()) {
+		throw runtime_error(FIX_LINK_POP_ERROR);
+	}
+	unsigned index = link_stack.front();
+	link_stack.pop_front();
+
+	//Check if link is NULL
+	if ( index == 0xFFFFFFFF) {
+		return NULL;
+	}
+
+	map<unsigned,NiObjectRef>::const_iterator it = objects.find(index);
+	if ( it == objects.end() ) {
+		throw runtime_error(FIX_LINK_INDEX_ERROR);
+	}
+		
+	Ref<T> object = DynamicCast<T>(it->second);
+	if ( object == NULL ) {
+		throw runtime_error(FIX_LINK_CAST_ERROR);
+	}
+
+	return object;
+}
+
 void NiObject::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 }
 
@@ -199,7 +229,7 @@ std::string NiObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 }
 
 std::list<NiObjectRef> NiObject::InternalGetRefs() const {
@@ -221,7 +251,7 @@ std::string AKeyedData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AKeyedData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AKeyedData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -260,26 +290,10 @@ std::string AParticleModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AParticleModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AParticleModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		nextModifier = DynamicCast<AParticleModifier>(objects[link_stack.front()]);
-		if ( nextModifier == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		nextModifier = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		controller = DynamicCast<NiParticleSystemController>(objects[link_stack.front()]);
-		if ( controller == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		controller = NULL;
-	link_stack.pop_front();
+	nextModifier = FixLink<AParticleModifier>( objects, link_stack, version );
+	controller = FixLink<NiParticleSystemController>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> AParticleModifier::InternalGetRefs() const {
@@ -304,7 +318,7 @@ std::string bhkRefObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRefObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRefObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -328,7 +342,7 @@ std::string bhkSerializable::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSerializable::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSerializable::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkRefObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -379,18 +393,10 @@ std::string AbhkConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < bodies.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			bodies[i1] = DynamicCast<bhkShape>(objects[link_stack.front()]);
-			if ( bodies[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			bodies[i1] = NULL;
-		link_stack.pop_front();
+		bodies[i1] = FixLink<bhkShape>( objects, link_stack, version );
 	};
 }
 
@@ -452,7 +458,7 @@ std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkRagdollConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkRagdollConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -476,7 +482,7 @@ std::string bhkShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -500,7 +506,7 @@ std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkShapeCollection::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkShapeCollection::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -527,7 +533,7 @@ std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereRepShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSphereRepShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -551,7 +557,7 @@ std::string bhkConvexShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -575,7 +581,7 @@ std::string bhkWorldObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkWorldObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkWorldObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -616,17 +622,9 @@ std::string bhkEntity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkEntity::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkEntity::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkWorldObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		shape = DynamicCast<bhkShape>(objects[link_stack.front()]);
-		if ( shape == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		shape = NULL;
-	link_stack.pop_front();
+	shape = FixLink<bhkShape>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> bhkEntity::InternalGetRefs() const {
@@ -669,26 +667,10 @@ std::string NiCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		parent = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-		if ( parent == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		parent = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		body = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( body == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		body = NULL;
-	link_stack.pop_front();
+	parent = FixLink<NiAVObject>( objects, link_stack, version );
+	body = FixLink<NiObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiCollisionObject::InternalGetRefs() const {
@@ -732,18 +714,10 @@ std::string NiExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x04020200 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			nextExtraData = DynamicCast<NiExtraData>(objects[link_stack.front()]);
-			if ( nextExtraData == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			nextExtraData = NULL;
-		link_stack.pop_front();
+		nextExtraData = FixLink<NiExtraData>( objects, link_stack, version );
 	};
 }
 
@@ -769,7 +743,7 @@ std::string NiInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -799,7 +773,7 @@ std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -844,26 +818,10 @@ std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		splineData = DynamicCast<NiBSplineData>(objects[link_stack.front()]);
-		if ( splineData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		splineData = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		basisData = DynamicCast<NiBSplineBasisData>(objects[link_stack.front()]);
-		if ( basisData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		basisData = NULL;
-	link_stack.pop_front();
+	splineData = FixLink<NiBSplineData>( objects, link_stack, version );
+	basisData = FixLink<NiBSplineBasisData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
@@ -939,41 +897,17 @@ std::string NiObjectNET::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObjectNET::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObjectNET::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x04020200 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			extraData = DynamicCast<NiExtraData>(objects[link_stack.front()]);
-			if ( extraData == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			extraData = NULL;
-		link_stack.pop_front();
+		extraData = FixLink<NiExtraData>( objects, link_stack, version );
 	};
 	if ( version >= 0x0A000100 ) {
 		for (uint i2 = 0; i2 < extraDataList.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				extraDataList[i2] = DynamicCast<NiExtraData>(objects[link_stack.front()]);
-				if ( extraDataList[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				extraDataList[i2] = NULL;
-			link_stack.pop_front();
-		};
-	};
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		controller = DynamicCast<NiTimeController>(objects[link_stack.front()]);
-		if ( controller == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		controller = NULL;
-	link_stack.pop_front();
+			extraDataList[i2] = FixLink<NiExtraData>( objects, link_stack, version );
+		};
+	};
+	controller = FixLink<NiTimeController>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiObjectNET::InternalGetRefs() const {
@@ -1094,40 +1028,16 @@ std::string NiAVObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAVObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAVObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < properties.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			properties[i1] = DynamicCast<NiProperty>(objects[link_stack.front()]);
-			if ( properties[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			properties[i1] = NULL;
-		link_stack.pop_front();
+		properties[i1] = FixLink<NiProperty>( objects, link_stack, version );
 	};
 	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			collisionData = DynamicCast<NiCollisionData>(objects[link_stack.front()]);
-			if ( collisionData == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			collisionData = NULL;
-		link_stack.pop_front();
+		collisionData = FixLink<NiCollisionData>( objects, link_stack, version );
 	};
 	if ( version >= 0x14000004 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			collisionObject = DynamicCast<NiCollisionObject>(objects[link_stack.front()]);
-			if ( collisionObject == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			collisionObject = NULL;
-		link_stack.pop_front();
+		collisionObject = FixLink<NiCollisionObject>( objects, link_stack, version );
 	};
 }
 
@@ -1212,19 +1122,11 @@ std::string NiDynamicEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDynamicEffect::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDynamicEffect::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiAVObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x0A010000 ) {
 		for (uint i2 = 0; i2 < affectedNodes.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				affectedNodes[i2] = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-				if ( affectedNodes[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				affectedNodes[i2] = NULL;
-			link_stack.pop_front();
+			affectedNodes[i2] = FixLink<NiAVObject>( objects, link_stack, version );
 		};
 	};
 }
@@ -1265,7 +1167,7 @@ std::string NiLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLight::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLight::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -1289,7 +1191,7 @@ std::string NiProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -1330,17 +1232,9 @@ std::string NiPSysModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		target = DynamicCast<NiParticleSystem>(objects[link_stack.front()]);
-		if ( target == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		target = NULL;
-	link_stack.pop_front();
+	target = FixLink<NiParticleSystem>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysModifier::InternalGetRefs() const {
@@ -1396,7 +1290,7 @@ std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -1432,18 +1326,10 @@ std::string NiPSysVolumeEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysVolumeEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x14000004 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			emitterObject = DynamicCast<NiNode>(objects[link_stack.front()]);
-			if ( emitterObject == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			emitterObject = NULL;
-		link_stack.pop_front();
+		emitterObject = FixLink<NiNode>( objects, link_stack, version );
 	};
 }
 
@@ -1497,26 +1383,10 @@ std::string NiTimeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTimeController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTimeController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		nextController = DynamicCast<NiTimeController>(objects[link_stack.front()]);
-		if ( nextController == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		nextController = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		target = DynamicCast<NiObjectNET>(objects[link_stack.front()]);
-		if ( target == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		target = NULL;
-	link_stack.pop_front();
+	nextController = FixLink<NiTimeController>( objects, link_stack, version );
+	target = FixLink<NiObjectNET>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiTimeController::InternalGetRefs() const {
@@ -1583,19 +1453,11 @@ std::string ABoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void ABoneLODController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void ABoneLODController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < nodeGroups.size(); i1++) {
 		for (uint i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				nodeGroups[i1].nodes[i2] = DynamicCast<NiNode>(objects[link_stack.front()]);
-				if ( nodeGroups[i1].nodes[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				nodeGroups[i1].nodes[i2] = NULL;
-			link_stack.pop_front();
+			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, version );
 		};
 	};
 }
@@ -1638,18 +1500,10 @@ std::string NiSingleInterpolatorController::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiSingleInterpolatorController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSingleInterpolatorController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			interpolator = DynamicCast<NiInterpolator>(objects[link_stack.front()]);
-			if ( interpolator == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			interpolator = NULL;
-		link_stack.pop_front();
+		interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
 	};
 }
 
@@ -1678,7 +1532,7 @@ std::string APSysCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void APSysCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -1740,37 +1594,13 @@ std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeom::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriBasedGeom::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiTriBasedGeomData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		skinInstance = DynamicCast<NiSkinInstance>(objects[link_stack.front()]);
-		if ( skinInstance == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		skinInstance = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiTriBasedGeomData>( objects, link_stack, version );
+	skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
 	if ( version >= 0x0A000100 ) {
 		if ( (hasShader != 0) ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-				if ( unknownLink == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				unknownLink = NULL;
-			link_stack.pop_front();
+			unknownLink = FixLink<NiObject>( objects, link_stack, version );
 		};
 	};
 }
@@ -2017,18 +1847,10 @@ std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeomData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriBasedGeomData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x14000004 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-			if ( unknownLink == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			unknownLink = NULL;
-		link_stack.pop_front();
+		unknownLink = FixLink<NiObject>( objects, link_stack, version );
 	};
 }
 
@@ -2106,7 +1928,7 @@ std::string APSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void APSysData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2136,7 +1958,7 @@ std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendCollisionObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBlendCollisionObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2163,7 +1985,7 @@ std::string bhkBlendController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBlendController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2208,7 +2030,7 @@ std::string bhkBoxShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBoxShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBoxShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2259,7 +2081,7 @@ std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCapsuleShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkCapsuleShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2283,7 +2105,7 @@ std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCollisionObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkCollisionObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2358,7 +2180,7 @@ std::string bhkConvexVerticesShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexVerticesShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexVerticesShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2401,7 +2223,7 @@ std::string bhkHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkHingeConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkHingeConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2455,7 +2277,7 @@ std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkLimitedHingeConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkLimitedHingeConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2538,18 +2360,10 @@ std::string bhkListShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkListShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkListShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < subShapes.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			subShapes[i1] = DynamicCast<bhkShape>(objects[link_stack.front()]);
-			if ( subShapes[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			subShapes[i1] = NULL;
-		link_stack.pop_front();
+		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, version );
 	};
 }
 
@@ -2685,26 +2499,10 @@ std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMalleableConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMalleableConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink1 = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink1 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink1 = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink2 = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink2 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink2 = NULL;
-	link_stack.pop_front();
+	unknownLink1 = FixLink<NiObject>( objects, link_stack, version );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> bhkMalleableConstraint::InternalGetRefs() const {
@@ -2783,17 +2581,9 @@ std::string bhkMoppBvTreeShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMoppBvTreeShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMoppBvTreeShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkShape::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		shape = DynamicCast<bhkShape>(objects[link_stack.front()]);
-		if ( shape == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		shape = NULL;
-	link_stack.pop_front();
+	shape = FixLink<bhkShape>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> bhkMoppBvTreeShape::InternalGetRefs() const {
@@ -2845,7 +2635,7 @@ std::string bhkMultiSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMultiSphereShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMultiSphereShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -2940,18 +2730,10 @@ std::string bhkNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkNiTriStripsShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkNiTriStripsShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < stripsData.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			stripsData[i1] = DynamicCast<NiTriStripsData>(objects[link_stack.front()]);
-			if ( stripsData[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			stripsData[i1] = NULL;
-		link_stack.pop_front();
+		stripsData[i1] = FixLink<NiTriStripsData>( objects, link_stack, version );
 	};
 }
 
@@ -3041,17 +2823,9 @@ std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPackedNiTriStripsShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPackedNiTriStripsShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<hkPackedNiTriStripsData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<hkPackedNiTriStripsData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> bhkPackedNiTriStripsShape::InternalGetRefs() const {
@@ -3102,7 +2876,7 @@ std::string bhkPrismaticConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPrismaticConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPrismaticConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3126,7 +2900,7 @@ std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRagdollConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRagdollConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkRagdollConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3315,18 +3089,10 @@ std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBody::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBody::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkEntity::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < constraints.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			constraints[i1] = DynamicCast<AbhkConstraint>(objects[link_stack.front()]);
-			if ( constraints[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			constraints[i1] = NULL;
-		link_stack.pop_front();
+		constraints[i1] = FixLink<AbhkConstraint>( objects, link_stack, version );
 	};
 }
 
@@ -3354,7 +3120,7 @@ std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBodyT::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBodyT::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkRigidBody::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3413,7 +3179,7 @@ std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSimpleShapePhantom::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSimpleShapePhantom::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkEntity::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3437,7 +3203,7 @@ std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSPCollisionObject::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSPCollisionObject::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3464,7 +3230,7 @@ std::string bhkSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSphereShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3510,7 +3276,7 @@ std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkStiffSpringConstraint::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkStiffSpringConstraint::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3546,7 +3312,7 @@ std::string bhkTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkTransformShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkTransformShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkEntity::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3570,7 +3336,7 @@ std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexTransformShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexTransformShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	bhkTransformShape::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3600,7 +3366,7 @@ std::string BSBound::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSBound::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSBound::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3648,7 +3414,7 @@ std::string BSFurnitureMarker::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSFurnitureMarker::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSFurnitureMarker::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3675,7 +3441,7 @@ std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSParentVelocityModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSParentVelocityModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3699,7 +3465,7 @@ std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSPSysArrayEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSPSysArrayEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3726,7 +3492,7 @@ std::string BSXFlags::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSXFlags::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSXFlags::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3790,7 +3556,7 @@ std::string hkPackedNiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void hkPackedNiTriStripsData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void hkPackedNiTriStripsData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3826,18 +3592,10 @@ std::string NiAlphaController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiFloatData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiFloatData>( objects, link_stack, version );
 	};
 }
 
@@ -3869,7 +3627,7 @@ std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3893,7 +3651,7 @@ std::string NiAmbientLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAmbientLight::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAmbientLight::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiLight::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -3968,7 +3726,7 @@ std::string NiAutoNormalParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticlesData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAutoNormalParticlesData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4011,7 +3769,7 @@ std::string NiBinaryExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBinaryExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBinaryExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4038,7 +3796,7 @@ std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendBoolInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendBoolInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4065,7 +3823,7 @@ std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendFloatInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendFloatInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4092,7 +3850,7 @@ std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendPoint3Interpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendPoint3Interpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4116,7 +3874,7 @@ std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiBlendTransformInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendTransformInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4202,40 +3960,16 @@ std::string NiBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoneLODController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoneLODController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < shapeGroups1.size(); i1++) {
 		for (uint i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				shapeGroups1[i1].linkPairs[i2].shape = DynamicCast<NiTriShape>(objects[link_stack.front()]);
-				if ( shapeGroups1[i1].linkPairs[i2].shape == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				shapeGroups1[i1].linkPairs[i2].shape = NULL;
-			link_stack.pop_front();
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				shapeGroups1[i1].linkPairs[i2].skinInstance = DynamicCast<NiSkinInstance>(objects[link_stack.front()]);
-				if ( shapeGroups1[i1].linkPairs[i2].skinInstance == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				shapeGroups1[i1].linkPairs[i2].skinInstance = NULL;
-			link_stack.pop_front();
+			shapeGroups1[i1].linkPairs[i2].shape = FixLink<NiTriShape>( objects, link_stack, version );
+			shapeGroups1[i1].linkPairs[i2].skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
 		};
 	};
 	for (uint i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			shapeGroups2[i1] = DynamicCast<NiTriShape>(objects[link_stack.front()]);
-			if ( shapeGroups2[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			shapeGroups2[i1] = NULL;
-		link_stack.pop_front();
+		shapeGroups2[i1] = FixLink<NiTriShape>( objects, link_stack, version );
 	};
 }
 
@@ -4299,7 +4033,7 @@ std::string NiBoolData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4326,7 +4060,7 @@ std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBooleanExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBooleanExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4361,17 +4095,9 @@ std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiBoolData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiBoolData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiBoolInterpolator::InternalGetRefs() const {
@@ -4407,17 +4133,9 @@ std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolTimelineInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolTimelineInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiBoolData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiBoolData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiBoolTimelineInterpolator::InternalGetRefs() const {
@@ -4442,7 +4160,7 @@ std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSBoneLODController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSBoneLODController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4469,7 +4187,7 @@ std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineBasisData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineBasisData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4506,7 +4224,7 @@ std::string NiBSplineCompFloatInterpolator::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiBSplineCompFloatInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompFloatInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4543,7 +4261,7 @@ std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiBSplineCompPoint3Interpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompPoint3Interpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4603,7 +4321,7 @@ std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose )
 	return out.str();
 }
 
-void NiBSplineCompTransformInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompTransformInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4649,7 +4367,7 @@ std::string NiBSplineData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4738,17 +4456,9 @@ std::string NiCamera::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCamera::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCamera::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink_ = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink_ == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink_ = NULL;
-	link_stack.pop_front();
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiCamera::InternalGetRefs() const {
@@ -4840,17 +4550,9 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		targetNode = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( targetNode == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		targetNode = NULL;
-	link_stack.pop_front();
+	targetNode = FixLink<NiNode>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiCollisionData::InternalGetRefs() const {
@@ -4901,7 +4603,7 @@ std::string NiColorData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiColorData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4928,7 +4630,7 @@ std::string NiColorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiColorExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -4986,28 +4688,12 @@ std::string NiControllerManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerManager::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerManager::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < controllerSequences.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			controllerSequences[i1] = DynamicCast<NiControllerSequence>(objects[link_stack.front()]);
-			if ( controllerSequences[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			controllerSequences[i1] = NULL;
-		link_stack.pop_front();
-	};
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		objectPalette = DynamicCast<NiDefaultAVObjectPalette>(objects[link_stack.front()]);
-		if ( objectPalette == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		objectPalette = NULL;
-	link_stack.pop_front();
+		controllerSequences[i1] = FixLink<NiControllerSequence>( objects, link_stack, version );
+	};
+	objectPalette = FixLink<NiDefaultAVObjectPalette>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiControllerManager::InternalGetRefs() const {
@@ -5295,106 +4981,34 @@ std::string NiControllerSequence::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerSequence::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerSequence::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			textKeys = DynamicCast<NiTextKeyExtraData>(objects[link_stack.front()]);
-			if ( textKeys == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			textKeys = NULL;
-		link_stack.pop_front();
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
 	};
 	for (uint i1 = 0; i1 < controlledBlocks.size(); i1++) {
 		if ( version <= 0x0A01006A ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				controlledBlocks[i1].controller = DynamicCast<NiTimeController>(objects[link_stack.front()]);
-				if ( controlledBlocks[i1].controller == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				controlledBlocks[i1].controller = NULL;
-			link_stack.pop_front();
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
 		};
 		if ( version >= 0x0A020000 ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				controlledBlocks[i1].interpolator = DynamicCast<NiInterpolator>(objects[link_stack.front()]);
-				if ( controlledBlocks[i1].interpolator == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				controlledBlocks[i1].interpolator = NULL;
-			link_stack.pop_front();
+			controlledBlocks[i1].interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
 		};
 		if ( version >= 0x0A01006A ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				controlledBlocks[i1].controller = DynamicCast<NiTimeController>(objects[link_stack.front()]);
-				if ( controlledBlocks[i1].controller == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				controlledBlocks[i1].controller = NULL;
-			link_stack.pop_front();
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
 		};
 		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				controlledBlocks[i1].unknownLink2 = DynamicCast<NiObject>(objects[link_stack.front()]);
-				if ( controlledBlocks[i1].unknownLink2 == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				controlledBlocks[i1].unknownLink2 = NULL;
-			link_stack.pop_front();
+			controlledBlocks[i1].unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
 		};
 		if ( version >= 0x0A020000 ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				controlledBlocks[i1].stringPalette = DynamicCast<NiStringPalette>(objects[link_stack.front()]);
-				if ( controlledBlocks[i1].stringPalette == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				controlledBlocks[i1].stringPalette = NULL;
-			link_stack.pop_front();
+			controlledBlocks[i1].stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
 		};
 	};
 	if ( version >= 0x0A01006A ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			textKeys = DynamicCast<NiTextKeyExtraData>(objects[link_stack.front()]);
-			if ( textKeys == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			textKeys = NULL;
-		link_stack.pop_front();
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			manager = DynamicCast<NiControllerManager>(objects[link_stack.front()]);
-			if ( manager == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			manager = NULL;
-		link_stack.pop_front();
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
+		manager = FixLink<NiControllerManager>( objects, link_stack, version );
 	};
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			stringPalette = DynamicCast<NiStringPalette>(objects[link_stack.front()]);
-			if ( stringPalette == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			stringPalette = NULL;
-		link_stack.pop_front();
+		stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
 	};
 }
 
@@ -5458,18 +5072,10 @@ std::string NiDefaultAVObjectPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDefaultAVObjectPalette::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDefaultAVObjectPalette::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < objs.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			objs[i1].avObject = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-			if ( objs[i1].avObject == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			objs[i1].avObject = NULL;
-		link_stack.pop_front();
+		objs[i1].avObject = FixLink<NiAVObject>( objects, link_stack, version );
 	};
 }
 
@@ -5495,7 +5101,7 @@ std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDirectionalLight::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDirectionalLight::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiLight::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5522,7 +5128,7 @@ std::string NiDitherProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDitherProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDitherProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5583,18 +5189,10 @@ std::string NiFlipController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFlipController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFlipController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < sources.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			sources[i1] = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( sources[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			sources[i1] = NULL;
-		link_stack.pop_front();
+		sources[i1] = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 }
 
@@ -5650,7 +5248,7 @@ std::string NiFloatData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5677,7 +5275,7 @@ std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5716,18 +5314,10 @@ std::string NiFloatExtraDataController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraDataController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraDataController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x14000004 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-			if ( unknownLink == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			unknownLink = NULL;
-		link_stack.pop_front();
+		unknownLink = FixLink<NiObject>( objects, link_stack, version );
 	};
 }
 
@@ -5764,17 +5354,9 @@ std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiFloatData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiFloatData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiFloatInterpolator::InternalGetRefs() const {
@@ -5818,7 +5400,7 @@ std::string NiFloatsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatsExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatsExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5851,7 +5433,7 @@ std::string NiFogProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFogProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFogProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -5950,28 +5532,12 @@ std::string NiGeomMorpherController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeomMorpherController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeomMorpherController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiMorphData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiMorphData>( objects, link_stack, version );
 	if ( version >= 0x0A01006A ) {
 		for (uint i2 = 0; i2 < interpolators.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				interpolators[i2] = DynamicCast<NiInterpolator>(objects[link_stack.front()]);
-				if ( interpolators[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				interpolators[i2] = NULL;
-			link_stack.pop_front();
+			interpolators[i2] = FixLink<NiInterpolator>( objects, link_stack, version );
 		};
 	};
 }
@@ -6017,7 +5583,7 @@ std::string NiGravity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGravity::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGravity::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -6044,7 +5610,7 @@ std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegerExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiIntegerExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -6087,7 +5653,7 @@ std::string NiIntegersExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegersExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiIntegersExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -6119,17 +5685,9 @@ std::string NiKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiKeyframeData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiKeyframeData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiKeyframeController::InternalGetRefs() const {
@@ -6162,17 +5720,9 @@ std::string BSKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSKeyframeController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSKeyframeController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiKeyframeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data2 = DynamicCast<NiKeyframeData>(objects[link_stack.front()]);
-		if ( data2 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data2 = NULL;
-	link_stack.pop_front();
+	data2 = FixLink<NiKeyframeData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> BSKeyframeController::InternalGetRefs() const {
@@ -6336,7 +5886,7 @@ std::string NiKeyframeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -6392,29 +5942,13 @@ std::string NiLightColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightColorController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightColorController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiPosData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiPosData>( objects, link_stack, version );
 	};
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			interpolator = DynamicCast<NiPoint3Interpolator>(objects[link_stack.front()]);
-			if ( interpolator == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			interpolator = NULL;
-		link_stack.pop_front();
+		interpolator = FixLink<NiPoint3Interpolator>( objects, link_stack, version );
 	};
 }
 
@@ -6450,17 +5984,9 @@ std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightDimmerController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightDimmerController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink = DynamicCast<NiInterpolator>(objects[link_stack.front()]);
-		if ( unknownLink == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink = NULL;
-	link_stack.pop_front();
+	unknownLink = FixLink<NiInterpolator>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiLightDimmerController::InternalGetRefs() const {
@@ -6500,17 +6026,9 @@ std::string NiLookAtController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		lookAtNode = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( lookAtNode == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		lookAtNode = NULL;
-	link_stack.pop_front();
+	lookAtNode = FixLink<NiNode>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiLookAtController::InternalGetRefs() const {
@@ -6579,44 +6097,12 @@ std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		lookAt = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( lookAt == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		lookAt = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink1 = DynamicCast<NiPoint3Interpolator>(objects[link_stack.front()]);
-		if ( unknownLink1 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink1 = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink2 = DynamicCast<NiFloatInterpolator>(objects[link_stack.front()]);
-		if ( unknownLink2 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink2 = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink3 = DynamicCast<NiFloatInterpolator>(objects[link_stack.front()]);
-		if ( unknownLink3 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink3 = NULL;
-	link_stack.pop_front();
+	lookAt = FixLink<NiNode>( objects, link_stack, version );
+	unknownLink1 = FixLink<NiPoint3Interpolator>( objects, link_stack, version );
+	unknownLink2 = FixLink<NiFloatInterpolator>( objects, link_stack, version );
+	unknownLink3 = FixLink<NiFloatInterpolator>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiLookAtInterpolator::InternalGetRefs() const {
@@ -6666,18 +6152,10 @@ std::string NiMaterialColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialColorController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialColorController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiPosData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiPosData>( objects, link_stack, version );
 	};
 }
 
@@ -6728,7 +6206,7 @@ std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -6902,42 +6380,18 @@ std::string NiMeshPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshPSysData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshPSysData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysData::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x14000004 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			modifier = DynamicCast<NiPSysModifier>(objects[link_stack.front()]);
-			if ( modifier == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			modifier = NULL;
-		link_stack.pop_front();
+		modifier = FixLink<NiPSysModifier>( objects, link_stack, version );
 	};
 	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
 		for (uint i2 = 0; i2 < unknownLinks.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				unknownLinks[i2] = DynamicCast<NiPSysModifier>(objects[link_stack.front()]);
-				if ( unknownLinks[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				unknownLinks[i2] = NULL;
-			link_stack.pop_front();
+			unknownLinks[i2] = FixLink<NiPSysModifier>( objects, link_stack, version );
 		};
 	};
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			unknownLink2 = DynamicCast<NiNode>(objects[link_stack.front()]);
-			if ( unknownLink2 == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			unknownLink2 = NULL;
-		link_stack.pop_front();
+		unknownLink2 = FixLink<NiNode>( objects, link_stack, version );
 	};
 }
 
@@ -7041,7 +6495,7 @@ std::string NiMorphData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMorphData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMorphData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7089,18 +6543,10 @@ std::string NiMultiTargetTransformController::InternalAsString( bool verbose ) c
 	return out.str();
 }
 
-void NiMultiTargetTransformController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMultiTargetTransformController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < extraTargets.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			extraTargets[i1] = DynamicCast<NiNode>(objects[link_stack.front()]);
-			if ( extraTargets[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			extraTargets[i1] = NULL;
-		link_stack.pop_front();
+		extraTargets[i1] = FixLink<NiNode>( objects, link_stack, version );
 	};
 }
 
@@ -7173,29 +6619,13 @@ std::string NiNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiAVObject::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < children.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			children[i1] = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-			if ( children[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			children[i1] = NULL;
-		link_stack.pop_front();
+		children[i1] = FixLink<NiAVObject>( objects, link_stack, version );
 	};
 	for (uint i1 = 0; i1 < effects.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			effects[i1] = DynamicCast<NiDynamicEffect>(objects[link_stack.front()]);
-			if ( effects[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			effects[i1] = NULL;
-		link_stack.pop_front();
+		effects[i1] = FixLink<NiDynamicEffect>( objects, link_stack, version );
 	};
 }
 
@@ -7227,7 +6657,7 @@ std::string AvoidNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AvoidNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AvoidNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7267,7 +6697,7 @@ std::string FxWidget::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxWidget::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxWidget::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7291,7 +6721,7 @@ std::string FxButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxButton::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxButton::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	FxWidget::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7348,18 +6778,10 @@ std::string FxRadioButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxRadioButton::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxRadioButton::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	FxWidget::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < unknownLinks.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			unknownLinks[i1] = DynamicCast<NiObject>(objects[link_stack.front()]);
-			if ( unknownLinks[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			unknownLinks[i1] = NULL;
-		link_stack.pop_front();
+		unknownLinks[i1] = FixLink<NiObject>( objects, link_stack, version );
 	};
 }
 
@@ -7394,7 +6816,7 @@ std::string NiBillboardNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBillboardNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBillboardNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7418,7 +6840,7 @@ std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSAnimationNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSAnimationNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7442,7 +6864,7 @@ std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSParticleNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSParticleNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7519,18 +6941,10 @@ std::string NiLODNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			lodLevelData = DynamicCast<NiLODData>(objects[link_stack.front()]);
-			if ( lodLevelData == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			lodLevelData = NULL;
-		link_stack.pop_front();
+		lodLevelData = FixLink<NiLODData>( objects, link_stack, version );
 	};
 }
 
@@ -7581,7 +6995,7 @@ std::string NiPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPalette::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPalette::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7641,7 +7055,7 @@ std::string NiParticleBomb::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleBomb::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleBomb::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7673,17 +7087,9 @@ std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleColorModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleColorModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		colorData = DynamicCast<NiColorData>(objects[link_stack.front()]);
-		if ( colorData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		colorData = NULL;
-	link_stack.pop_front();
+	colorData = FixLink<NiColorData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiParticleColorModifier::InternalGetRefs() const {
@@ -7714,7 +7120,7 @@ std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleGrowFade::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleGrowFade::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7762,18 +7168,10 @@ std::string NiParticleMeshModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < particleMeshes.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			particleMeshes[i1] = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-			if ( particleMeshes[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			particleMeshes[i1] = NULL;
-		link_stack.pop_front();
+		particleMeshes[i1] = FixLink<NiAVObject>( objects, link_stack, version );
 	};
 }
 
@@ -7816,7 +7214,7 @@ std::string NiParticleRotation::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleRotation::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleRotation::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7840,7 +7238,7 @@ std::string NiParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticles::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticles::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7864,7 +7262,7 @@ std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticles::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAutoNormalParticles::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticles::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7888,7 +7286,7 @@ std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshes::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshes::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticles::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7965,7 +7363,7 @@ std::string NiParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticlesData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticlesData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiAutoNormalParticlesData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -7997,17 +7395,9 @@ std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshesData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshesData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink2 = DynamicCast<NiAVObject>(objects[link_stack.front()]);
-		if ( unknownLink2 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink2 = NULL;
-	link_stack.pop_front();
+	unknownLink2 = FixLink<NiAVObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiParticleMeshesData::InternalGetRefs() const {
@@ -8063,19 +7453,11 @@ std::string NiParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystem::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystem::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticles::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x0A010000 ) {
 		for (uint i2 = 0; i2 < modifiers.size(); i2++) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				modifiers[i2] = DynamicCast<NiPSysModifier>(objects[link_stack.front()]);
-				if ( modifiers[i2] == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				modifiers[i2] = NULL;
-			link_stack.pop_front();
+			modifiers[i2] = FixLink<NiPSysModifier>( objects, link_stack, version );
 		};
 	};
 }
@@ -8104,7 +7486,7 @@ std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshParticleSystem::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshParticleSystem::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticleSystem::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -8277,44 +7659,12 @@ std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystemController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystemController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		emitter = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( emitter == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		emitter = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		particleExtra = DynamicCast<AParticleModifier>(objects[link_stack.front()]);
-		if ( particleExtra == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		particleExtra = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink2 = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink2 == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink2 = NULL;
-	link_stack.pop_front();
+	emitter = FixLink<NiObject>( objects, link_stack, version );
+	unknownLink = FixLink<NiObject>( objects, link_stack, version );
+	particleExtra = FixLink<AParticleModifier>( objects, link_stack, version );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
@@ -8345,7 +7695,7 @@ std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSPArrayController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSPArrayController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticleSystemController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -8403,26 +7753,10 @@ std::string NiPathController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		posData = DynamicCast<NiPosData>(objects[link_stack.front()]);
-		if ( posData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		posData = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		floatData = DynamicCast<NiFloatData>(objects[link_stack.front()]);
-		if ( floatData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		floatData = NULL;
-	link_stack.pop_front();
+	posData = FixLink<NiPosData>( objects, link_stack, version );
+	floatData = FixLink<NiFloatData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPathController::InternalGetRefs() const {
@@ -8473,26 +7807,10 @@ std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		posData = DynamicCast<NiPosData>(objects[link_stack.front()]);
-		if ( posData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		posData = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		floatData = DynamicCast<NiFloatData>(objects[link_stack.front()]);
-		if ( floatData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		floatData = NULL;
-	link_stack.pop_front();
+	posData = FixLink<NiPosData>( objects, link_stack, version );
+	floatData = FixLink<NiFloatData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPathInterpolator::InternalGetRefs() const {
@@ -8636,17 +7954,9 @@ std::string NiPixelData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPixelData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPixelData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		palette = DynamicCast<NiPalette>(objects[link_stack.front()]);
-		if ( palette == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		palette = NULL;
-	link_stack.pop_front();
+	palette = FixLink<NiPalette>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPixelData::InternalGetRefs() const {
@@ -8733,7 +8043,7 @@ std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPlanarCollider::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPlanarCollider::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -8768,17 +8078,9 @@ std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPoint3Interpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPoint3Interpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiPosData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiPosData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPoint3Interpolator::InternalGetRefs() const {
@@ -8812,7 +8114,7 @@ std::string NiPointLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPointLight::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPointLight::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiLight::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -8864,7 +8166,7 @@ std::string NiPosData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPosData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPosData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -8899,17 +8201,9 @@ std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysAgeDeathModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysAgeDeathModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		spawnModifier = DynamicCast<NiPSysSpawnModifier>(objects[link_stack.front()]);
-		if ( spawnModifier == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		spawnModifier = NULL;
-	link_stack.pop_front();
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysAgeDeathModifier::InternalGetRefs() const {
@@ -8981,17 +8275,9 @@ std::string NiPSysBombModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBombModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBombModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( unknownLink == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink = NULL;
-	link_stack.pop_front();
+	unknownLink = FixLink<NiNode>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysBombModifier::InternalGetRefs() const {
@@ -9017,7 +8303,7 @@ std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoundUpdateModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBoundUpdateModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9050,7 +8336,7 @@ std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoxEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBoxEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9082,17 +8368,9 @@ std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColliderManager::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColliderManager::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		collider = DynamicCast<NiPSysPlanarCollider>(objects[link_stack.front()]);
-		if ( collider == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		collider = NULL;
-	link_stack.pop_front();
+	collider = FixLink<NiPSysPlanarCollider>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysColliderManager::InternalGetRefs() const {
@@ -9125,17 +8403,9 @@ std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColorModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColorModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiColorData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiColorData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysColorModifier::InternalGetRefs() const {
@@ -9166,7 +8436,7 @@ std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysCylinderEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysCylinderEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9308,7 +8578,7 @@ std::string NiPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9352,17 +8622,9 @@ std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysDragModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysDragModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		parent = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( parent == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		parent = NULL;
-	link_stack.pop_front();
+	parent = FixLink<NiObject>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysDragModifier::InternalGetRefs() const {
@@ -9408,29 +8670,13 @@ std::string NiPSysEmitterCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiPSysEmitterCtlrData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, version );
 	};
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			visibilityInterpolator = DynamicCast<NiInterpolator>(objects[link_stack.front()]);
-			if ( visibilityInterpolator == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			visibilityInterpolator = NULL;
-		link_stack.pop_front();
+		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, version );
 	};
 }
 
@@ -9505,7 +8751,7 @@ std::string NiPSysEmitterCtlrData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlrData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlrData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9529,7 +8775,7 @@ std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9553,7 +8799,7 @@ std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9577,7 +8823,7 @@ std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9601,7 +8847,7 @@ std::string NiPSysEmitterLifeSpanCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9625,7 +8871,7 @@ std::string NiPSysEmitterSpeedCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterSpeedCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9675,17 +8921,9 @@ std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		gravityObject = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( gravityObject == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		gravityObject = NULL;
-	link_stack.pop_front();
+	gravityObject = FixLink<NiNode>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const {
@@ -9708,7 +8946,7 @@ std::string NiPSysGravityStrengthCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityStrengthCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9744,7 +8982,7 @@ std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGrowFadeModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGrowFadeModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9801,18 +9039,10 @@ std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			emitterMeshes[i1] = DynamicCast<NiTriBasedGeom>(objects[link_stack.front()]);
-			if ( emitterMeshes[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			emitterMeshes[i1] = NULL;
-		link_stack.pop_front();
+		emitterMeshes[i1] = FixLink<NiTriBasedGeom>( objects, link_stack, version );
 	};
 }
 
@@ -9864,18 +9094,10 @@ std::string NiPSysMeshUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshUpdateModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshUpdateModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 	for (uint i1 = 0; i1 < meshes.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			meshes[i1] = DynamicCast<NiNode>(objects[link_stack.front()]);
-			if ( meshes[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			meshes[i1] = NULL;
-		link_stack.pop_front();
+		meshes[i1] = FixLink<NiNode>( objects, link_stack, version );
 	};
 }
 
@@ -9903,7 +9125,7 @@ std::string NiPSysModifierActiveCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifierActiveCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifierActiveCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -9977,44 +9199,12 @@ std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPlanarCollider::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPlanarCollider::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		spawnModifier = DynamicCast<NiPSysSpawnModifier>(objects[link_stack.front()]);
-		if ( spawnModifier == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		spawnModifier = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		parent = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( parent == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		parent = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink_ = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink_ == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink_ = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		colliderObject = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( colliderObject == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		colliderObject = NULL;
-	link_stack.pop_front();
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, version );
+	parent = FixLink<NiObject>( objects, link_stack, version );
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, version );
+	colliderObject = FixLink<NiNode>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiPSysPlanarCollider::InternalGetRefs() const {
@@ -10043,7 +9233,7 @@ std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPositionModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPositionModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10067,7 +9257,7 @@ std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysResetOnLoopCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysResetOnLoopCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10116,7 +9306,7 @@ std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysRotationModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysRotationModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10164,7 +9354,7 @@ std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSpawnModifier::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysSpawnModifier::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10191,7 +9381,7 @@ std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSphereEmitter::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysSphereEmitter::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10215,7 +9405,7 @@ std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysUpdateCtlr::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysUpdateCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10239,7 +9429,7 @@ std::string NiLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10284,7 +9474,7 @@ std::string NiRangeLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRangeLODData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRangeLODData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiLODData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10339,7 +9529,7 @@ std::string NiScreenLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiScreenLODData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiScreenLODData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiLODData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10363,7 +9553,7 @@ std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticles::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRotatingParticles::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticles::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10387,7 +9577,7 @@ std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticlesData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRotatingParticlesData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10411,7 +9601,7 @@ std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSequenceStreamHelper::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSequenceStreamHelper::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10438,7 +9628,7 @@ std::string NiShadeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiShadeProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiShadeProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -10535,18 +9725,10 @@ std::string NiSkinData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			skinPartition = DynamicCast<NiSkinPartition>(objects[link_stack.front()]);
-			if ( skinPartition == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			skinPartition = NULL;
-		link_stack.pop_front();
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
 	};
 }
 
@@ -10621,47 +9803,15 @@ std::string NiSkinInstance::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinInstance::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinInstance::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiSkinData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiSkinData>( objects, link_stack, version );
 	if ( version >= 0x0A020000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			skinPartition = DynamicCast<NiSkinPartition>(objects[link_stack.front()]);
-			if ( skinPartition == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			skinPartition = NULL;
-		link_stack.pop_front();
-	};
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		skeletonRoot = DynamicCast<NiNode>(objects[link_stack.front()]);
-		if ( skeletonRoot == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		skeletonRoot = NULL;
-	link_stack.pop_front();
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
+	};
+	skeletonRoot = FixLink<NiNode>( objects, link_stack, version );
 	for (uint i1 = 0; i1 < bones.size(); i1++) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			bones[i1] = DynamicCast<NiNode>(objects[link_stack.front()]);
-			if ( bones[i1] == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			bones[i1] = NULL;
-		link_stack.pop_front();
+		bones[i1] = FixLink<NiNode>( objects, link_stack, version );
 	};
 }
 
@@ -10950,7 +10100,7 @@ std::string NiSkinPartition::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinPartition::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinPartition::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11055,31 +10205,15 @@ std::string NiSourceTexture::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSourceTexture::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSourceTexture::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
 	if ( version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
-			if (link_stack.empty())
-				throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-			if (link_stack.front() != 0xffffffff) {
-				unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-				if ( unknownLink == NULL )
-					throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-			} else
-				unknownLink = NULL;
-			link_stack.pop_front();
+			unknownLink = FixLink<NiObject>( objects, link_stack, version );
 		};
 	};
 	if ( (useExternal == 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			pixelData = DynamicCast<NiPixelData>(objects[link_stack.front()]);
-			if ( pixelData == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			pixelData = NULL;
-		link_stack.pop_front();
+		pixelData = FixLink<NiPixelData>( objects, link_stack, version );
 	};
 }
 
@@ -11110,7 +10244,7 @@ std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpecularProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSpecularProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11152,7 +10286,7 @@ std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSphericalCollider::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSphericalCollider::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11182,7 +10316,7 @@ std::string NiSpotLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpotLight::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSpotLight::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiPointLight::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11237,7 +10371,7 @@ std::string NiStencilProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStencilProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStencilProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11271,7 +10405,7 @@ std::string NiStringExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11301,7 +10435,7 @@ std::string NiStringPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringPalette::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringPalette::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11344,7 +10478,7 @@ std::string NiStringsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringsExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringsExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11394,7 +10528,7 @@ std::string NiTextKeyExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextKeyExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextKeyExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -11470,17 +10604,9 @@ std::string NiTextureEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureEffect::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureEffect::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		sourceTexture = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-		if ( sourceTexture == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		sourceTexture = NULL;
-	link_stack.pop_front();
+	sourceTexture = FixLink<NiSourceTexture>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiTextureEffect::InternalGetRefs() const {
@@ -11526,18 +10652,10 @@ std::string NiTextureTransformController::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiTextureTransformController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureTransformController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiFloatData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiFloatData>( objects, link_stack, version );
 	};
 }
 
@@ -12241,108 +11359,36 @@ std::string NiTexturingProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTexturingProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTexturingProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 	if ( (hasBaseTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			baseTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( baseTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			baseTexture.source = NULL;
-		link_stack.pop_front();
+		baseTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasDarkTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			darkTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( darkTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			darkTexture.source = NULL;
-		link_stack.pop_front();
+		darkTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasDetailTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			detailTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( detailTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			detailTexture.source = NULL;
-		link_stack.pop_front();
+		detailTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasGlossTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			glossTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( glossTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			glossTexture.source = NULL;
-		link_stack.pop_front();
+		glossTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasGlowTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			glowTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( glowTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			glowTexture.source = NULL;
-		link_stack.pop_front();
+		glowTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasBumpMapTexture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			bumpMapTexture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( bumpMapTexture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			bumpMapTexture.source = NULL;
-		link_stack.pop_front();
+		bumpMapTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (hasDecal0Texture != 0) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			decal0Texture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( decal0Texture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			decal0Texture.source = NULL;
-		link_stack.pop_front();
+		decal0Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( (((textureCount == 8)) && ((hasDecal1Texture != 0))) ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			decal1Texture.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-			if ( decal1Texture.source == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			decal1Texture.source = NULL;
-		link_stack.pop_front();
+		decal1Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 	};
 	if ( version >= 0x0A000100 ) {
 		for (uint i2 = 0; i2 < shaderTextures.size(); i2++) {
 			if ( (shaderTextures[i2].isUsed != 0) ) {
-				if (link_stack.empty())
-					throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-				if (link_stack.front() != 0xffffffff) {
-					shaderTextures[i2].textureData.source = DynamicCast<NiSourceTexture>(objects[link_stack.front()]);
-					if ( shaderTextures[i2].textureData.source == NULL )
-						throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-				} else
-					shaderTextures[i2].textureData.source = NULL;
-				link_stack.pop_front();
+				shaderTextures[i2].textureData.source = FixLink<NiSourceTexture>( objects, link_stack, version );
 			};
 		};
 	};
@@ -12388,7 +11434,7 @@ std::string NiTransformController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12412,7 +11458,7 @@ std::string NiTransformData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiKeyframeData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12470,17 +11516,9 @@ std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformInterpolator::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiTransformData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiTransformData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiTransformInterpolator::InternalGetRefs() const {
@@ -12505,7 +11543,7 @@ std::string NiTriShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShape::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriShape::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12608,7 +11646,7 @@ std::string NiTriShapeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShapeData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriShapeData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12632,7 +11670,7 @@ std::string NiTriStrips::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStrips::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriStrips::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12734,7 +11772,7 @@ std::string NiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStripsData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriStripsData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12758,7 +11796,7 @@ std::string NiClod::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClod::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiClod::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12840,7 +11878,7 @@ std::string NiClodData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClodData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiClodData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12875,17 +11913,9 @@ std::string NiUVController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiUVData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
+	data = FixLink<NiUVData>( objects, link_stack, version );
 }
 
 std::list<NiObjectRef> NiUVController::InternalGetRefs() const {
@@ -12944,7 +11974,7 @@ std::string NiUVData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiObject::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -12974,7 +12004,7 @@ std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVectorExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVectorExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13007,7 +12037,7 @@ std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertexColorProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVertexColorProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13053,7 +12083,7 @@ std::string NiVertWeightsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertWeightsExtraData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVertWeightsExtraData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiExtraData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13089,18 +12119,10 @@ std::string NiVisController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisController::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisController::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
 	if ( version <= 0x0A010000 ) {
-		if (link_stack.empty())
-			throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-		if (link_stack.front() != 0xffffffff) {
-			data = DynamicCast<NiVisData>(objects[link_stack.front()]);
-			if ( data == NULL )
-				throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-		} else
-			data = NULL;
-		link_stack.pop_front();
+		data = FixLink<NiVisData>( objects, link_stack, version );
 	};
 }
 
@@ -13145,7 +12167,7 @@ std::string NiVisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisData::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisData::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AKeyedData::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13172,7 +12194,7 @@ std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiWireframeProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiWireframeProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13206,7 +12228,7 @@ std::string NiZBufferProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiZBufferProperty::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiZBufferProperty::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiProperty::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13230,7 +12252,7 @@ std::string RootCollisionNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void RootCollisionNode::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void RootCollisionNode::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiNode::FixLinks( objects, link_stack, version, user_version );
 }
 
@@ -13239,4 +12261,3 @@ std::list<NiObjectRef> RootCollisionNode::InternalGetRefs() const {
 	refs = NiNode::GetRefs();
 	return refs;
 }
-
diff --git a/src/niflib.cpp b/src/niflib.cpp
index 6e2b89dc3c0247ef892dec6b3181eff0438fbd7a..eb64ca6e50495f9bd0395ea3e3cc07358686f9f4 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -2,8 +2,8 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 //#define DEBUG // this will produce lots of output
-//#define PRINT_OBJECT_NAMES
-//#define PRINT_OBJECT_CONTENTS
+#define PRINT_OBJECT_NAMES
+#define PRINT_OBJECT_CONTENTS
 //#define DEBUG_LINK_PHASE
 //#define DEBUG_HEADER_FOOTER
 
@@ -117,24 +117,13 @@ unsigned int GetNifVersion( string const & file_name ) {
 	//--Open File--//
 	ifstream in( file_name.c_str(), ifstream::binary );
 
-	//--Read Header--//
-	char header_string[64];
-	in.getline( header_string, 64 );
-	string headerstr(header_string);
-
-	// make sure this is a NIF file
-	unsigned ver_start = 0;
-	if ( headerstr.substr(0, 22) == "NetImmerse File Format" ) {
-		ver_start = 32;
-	} else if ( headerstr.substr(0, 20) == "Gamebryo File Format" ) {
-		ver_start = 30;
-	} else {
-		//Not a NIF file
-		return VER_INVALID;
-	}
+	//--Read Header String--//
+
+	HeaderString header;
+	unsigned version;
+	NifStream( header, in, version );
 
-	//Parse version string and return result.
-	return ParseVersionString( headerstr.substr( ver_start ) );
+	return version;
 }
 
 //Reads the given file by file name and returns a vector of block references
@@ -180,29 +169,46 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 #endif
 
 	//--Read Objects--//
-	size_t numBlocks = header.numBlocks;
-	vector<NiObjectRef> blocks( numBlocks ); //List to hold the blocks
+	size_t numObjects = header.numBlocks;
+	map<unsigned,NiObjectRef> objects; //Map to hold objects by number
 	list<uint> link_stack; //List to add link values to as they're read in from the file
 	string objectType;
 	stringstream errStream;
-	for (uint i = 0; i < numBlocks; i++) {
 
+	//Loop through all objects in the file
+	uint i = 0;
+	NiObjectRef new_obj;
+	while (true) {
 		//Check for EOF
-		//if (in.eof() ) {
-		//	throw runtime_error("End of file reached prematurely.  This NIF may be corrupt or improperly supported.");
-		//}
+		if (in.eof() ) {
+			errStream << "End of file reached prematurely.  This NIF may be corrupt or improperly supported." << endl;
+			if ( new_obj != NULL ) {
+				errStream << "Last successfuly read object was:  " << endl;
+				errStream << "====[ " << "Object " << i - 1 << " | " << new_obj->GetType().GetTypeName() << " ]====" << endl;
+				errStream << new_obj->asString();
+			} else {
+				errStream << "No objects were read successfully." << endl;
+			}
+			throw runtime_error( errStream.str() );
+		}
 	
-		//There are two ways to read blocks, one before version 5.0.0.1 and one after that
+		//There are two main ways to read objects
+		//One before version 5.0.0.1 and one after
 		if ( header.version >= 0x05000001 ) {
-			//From version 5.0.0.1 to version 10.0.1.0  there is a zero byte at the begining of each block
+			//From version 5.0.0.1 to version 10.0.1.0  there is a zero byte at the begining of each object
 			
 			if ( header.version <= VER_10_1_0_0 ) {
 				uint checkValue = ReadUInt( in );
 				if ( checkValue != 0 ) {
 					//Throw an exception if it's not zero
-					errStream << "Read failue - Bad object position.  Invalid check value" << endl;
-					errStream << "====[ " << "Object " << i << " | " << blocks[i - 1]->GetType().GetTypeName() << " ]====" << endl;
-					errStream << blocks[i - 1]->asString();
+					errStream << "Read failue - Bad object position.  Invalid check value:  " << checkValue << endl;
+					if ( new_obj != NULL ) {
+						errStream << "Last successfuly read object was:  " << endl;
+						errStream << "====[ " << "Object " << i - 1 << " | " << new_obj->GetType().GetTypeName() << " ]====" << endl;
+						errStream << new_obj->asString();
+					} else {
+						errStream << "No objects were read successfully." << endl;
+					}
 					throw runtime_error( errStream.str() );
 				}
 			}
@@ -210,12 +216,17 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 			// Find which block type this is by using the header arrays
 			objectType = header.blockTypes[ header.blockTypeIndex[i] ];
 		} else {
-			// Find which block type this is by reading the string at this location
+			// Find which object type this is by reading the string at this location
 			uint objectTypeLength = ReadUInt( in );
 			if (objectTypeLength > 30 || objectTypeLength < 6) {
 				errStream << "Read failue - Bad object position.  Invalid Type Name Length:  " << objectTypeLength  << endl;
-				errStream << "====[ " << "Object " << i - 1 << " | " << blocks[i - 1]->GetType().GetTypeName() << " ]====" << endl;
-				errStream << blocks[i - 1]->asString();
+				if ( new_obj != NULL ) {
+					errStream << "Last successfuly read object was:  " << endl;
+					errStream << "====[ " << "Object " << i - 1 << " | " << new_obj->GetType().GetTypeName() << " ]====" << endl;
+					errStream << new_obj->asString();
+				} else {
+					errStream << "No objects were read successfully." << endl;
+				}
 				throw runtime_error( errStream.str() );
 			}
 			char* charobjectType = new char[objectTypeLength + 1];
@@ -223,38 +234,81 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 			charobjectType[objectTypeLength] = 0;
 			objectType = string(charobjectType);
 			delete [] charobjectType;
+
+#ifdef PRINT_OBJECT_NAMES
+			cout << endl << i << ":  " << objectType;
+#endif
+
+			if ( header.version < VER_4_0_0_0 ) {
+				//There can be special commands instead of object names
+				//in these versions
+
+				if ( objectType == "Top Level Object" ) {
+					//Just continue on to the next object
+					continue;
+				}
+
+				if ( objectType == "End Of File" ) {
+					//File is finished
+					break;
+				}
+			}
+
 			if ( (objectType[0] != 'N' || objectType[1] != 'i') && (objectType[0] != 'R' || objectType[1] != 'o') && (objectType[0] != 'A' || objectType[1] != 'v')) {
 				errStream << "Read failue - Bad object position.  Invalid Type Name:  " << objectType << endl;
-				errStream << "====[ " << "Object " << i - 1 << " | " << blocks[i - 1]->GetType().GetTypeName() << " ]====" << endl;
-				errStream << blocks[i - 1]->asString();
+				if ( new_obj != NULL ) {
+					errStream << "Last successfuly read object was:  " << endl;
+					errStream << "====[ " << "Object " << i - 1 << " | " << new_obj->GetType().GetTypeName() << " ]====" << endl;
+					errStream << new_obj->asString();
+				} else {
+					errStream << "No objects were read successfully." << endl;
+				}
 				throw runtime_error( errStream.str() );
 			}
 		}
 
-#ifdef PRINT_OBJECT_NAMES
-		cout << endl << i << ":  " << objectType;
-#endif
-
-		//Create Block of the type that was found
-		blocks[i] = CreateObject(objectType);
+		//Create object of the type that was found
+		new_obj = CreateObject(objectType);
+
+		//Check for an unknown object type
+		if ( new_obj == NULL ) {
+			errStream << "Unknown object type encountered during file read:  " << objectType << endl;
+			if ( new_obj != NULL ) {
+				errStream << "Last successfuly read object was:  " << endl;
+				errStream << "====[ " << "Object " << i - 1 << " | " << new_obj->GetType().GetTypeName() << " ]====" << endl;
+				errStream << new_obj->asString();
+			} else {
+				errStream << "No objects were read successfully." << endl;
+			}
+			throw runtime_error( errStream.str() );
+		}
 
-		//Check for an unknown block type
-		if ( blocks[i] == NULL ) {
-			//For version 5.0.0.1 and up, throw an exception - there's nothing we can do
-			//if ( version >= 0x05000001 ) {
-				errStream << "Unknown object type encountered during file read:  " << objectType;
-				throw runtime_error( errStream.str() );
-			//} else {
-				//We can skip over this block in older versions
-				//blocks[i] = new UnknownBlock(objectType);
-			//}
+		uint index;
+		if ( header.version < VER_4_0_0_0 ) {
+			//These old versions have a pointer value after the name
+			//which is used as the index
+			index = ReadUInt(in);
+		} else {
+			//These newer verisons use their position in the file as their index
+			index = i;
 		}
 
-		//blocks[i]->SetBlockNum(i);
-		blocks[i]->Read( in, link_stack, header.version, header.userVersion );
+		//Read new object
+		new_obj->Read( in, link_stack, header.version, header.userVersion );
+		objects[index] = new_obj;
+			
 #ifdef PRINT_OBJECT_CONTENTS
-		cout << endl << blocks[i]->asString() << endl;
+		cout << endl << new_obj->asString() << endl;
 #endif
+
+		if ( header.version >= VER_4_0_0_0 ) {
+			//We know the number of objects, so increment the count
+			//and break if we've finished
+			++i;
+			if ( i >= numObjects ) {
+				break;
+			}
+		}
 	}
 
 	//cout << endl;
@@ -286,16 +340,25 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 	cout << "Fixing Links:"  << endl;
 #endif
 	//--Now that all blocks are read, go back and fix the links--//
-	for (uint i = 0; i < blocks.size(); ++i) {
+	if ( header.version < VER_4_0_0_0 ) {
+		//First wen
+	}
+
+	vector<NiObjectRef> obj_list;
+
+	for ( map<unsigned,NiObjectRef>::iterator it = objects.begin(); it != objects.end(); ++it ) {
 #ifdef DEBUG_LINK_PHASE
 		cout << i << ":  " << blocks[i] << endl;
 #endif
 		//Fix links & other pre-processing
-		blocks[i]->FixLinks( blocks, link_stack, header.version, header.userVersion );
+		it->second->FixLinks( objects, link_stack, header.version, header.userVersion );
+
+		//Add object to list
+		obj_list.push_back(it->second);
 	}
 
 	//Return completed block list
-	return blocks;
+	return obj_list;
 }
 
 // Writes a valid Nif File given an ostream, a list to the root objects of a file tree
diff --git a/src/obj/ABoneLODController.cpp b/src/obj/ABoneLODController.cpp
index 1fbaf9cd22ef1fddc5052bae63bcf7c59ff74926..59b60e357c4da6211413814ad7ecdf6abf73d7e1 100644
--- a/src/obj/ABoneLODController.cpp
+++ b/src/obj/ABoneLODController.cpp
@@ -26,7 +26,7 @@ string ABoneLODController::asString( bool verbose ) const {
 	A_BONE_L_O_D_CONTROLLER_STRING
 }
 
-void ABoneLODController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void ABoneLODController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	A_BONE_L_O_D_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/AKeyedData.cpp b/src/obj/AKeyedData.cpp
index e201c7738b662d55fcaf9dc3726d4bb4331da9c0..95796a4f9519bc4c4df26a9bfc034bd77f34d864 100644
--- a/src/obj/AKeyedData.cpp
+++ b/src/obj/AKeyedData.cpp
@@ -23,7 +23,7 @@ string AKeyedData::asString( bool verbose ) const {
 	A_KEYED_DATA_STRING
 }
 
-void AKeyedData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AKeyedData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	A_KEYED_DATA_FIXLINKS
 }
 
diff --git a/src/obj/APSysCtlr.cpp b/src/obj/APSysCtlr.cpp
index 31582f1b439432321b4f90e05c9af12ace521dd8..c9dfc9662719fc6d823e8ab1743ed206454b0ef3 100644
--- a/src/obj/APSysCtlr.cpp
+++ b/src/obj/APSysCtlr.cpp
@@ -23,7 +23,7 @@ string APSysCtlr::asString( bool verbose ) const {
 	A_P_SYS_CTLR_STRING
 }
 
-void APSysCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void APSysCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	A_P_SYS_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/APSysData.cpp b/src/obj/APSysData.cpp
index 77be9b72efe7743796940c7c6caded65d222d1b2..cfabcd76f3837123139447d0adf0441f4592a8e3 100644
--- a/src/obj/APSysData.cpp
+++ b/src/obj/APSysData.cpp
@@ -23,7 +23,7 @@ string APSysData::asString( bool verbose ) const {
 	A_P_SYS_DATA_STRING
 }
 
-void APSysData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void APSysData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	A_P_SYS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/AParticleModifier.cpp b/src/obj/AParticleModifier.cpp
index d2b604df245286785c00c5c4d7b4250a2794f103..901965ae1a3e4e13069390d4300da1549771f833 100644
--- a/src/obj/AParticleModifier.cpp
+++ b/src/obj/AParticleModifier.cpp
@@ -24,7 +24,7 @@ string AParticleModifier::asString( bool verbose ) const {
 	A_PARTICLE_MODIFIER_STRING
 }
 
-void AParticleModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AParticleModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	A_PARTICLE_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/AbhkConstraint.cpp b/src/obj/AbhkConstraint.cpp
index 582cd5befc64f56f65a36e9eb97c049285417155..492c265ad2823cfe335ca1f35f149b3527441187 100644
--- a/src/obj/AbhkConstraint.cpp
+++ b/src/obj/AbhkConstraint.cpp
@@ -24,7 +24,7 @@ string AbhkConstraint::asString( bool verbose ) const {
 	ABHK_CONSTRAINT_STRING
 }
 
-void AbhkConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ABHK_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/AbhkRagdollConstraint.cpp b/src/obj/AbhkRagdollConstraint.cpp
index f638f6df3a96418e33bb95f975cf2ac89155819f..524f4cffbc1559a23d74ef0cf66d2ad6df308d13 100644
--- a/src/obj/AbhkRagdollConstraint.cpp
+++ b/src/obj/AbhkRagdollConstraint.cpp
@@ -23,7 +23,7 @@ string AbhkRagdollConstraint::asString( bool verbose ) const {
 	ABHK_RAGDOLL_CONSTRAINT_STRING
 }
 
-void AbhkRagdollConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkRagdollConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ABHK_RAGDOLL_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/AbhkShapeCollection.cpp b/src/obj/AbhkShapeCollection.cpp
index 1586183857715ad8f48b42e821f510061e5ddfe5..1f8785357eac7cb024ae517313c12a2938ce5560 100644
--- a/src/obj/AbhkShapeCollection.cpp
+++ b/src/obj/AbhkShapeCollection.cpp
@@ -23,7 +23,7 @@ string AbhkShapeCollection::asString( bool verbose ) const {
 	ABHK_SHAPE_COLLECTION_STRING
 }
 
-void AbhkShapeCollection::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkShapeCollection::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ABHK_SHAPE_COLLECTION_FIXLINKS
 }
 
diff --git a/src/obj/AvoidNode.cpp b/src/obj/AvoidNode.cpp
index f3c9f0749c99d61d81a2b2c85704649da5eeadda..b04aaad968d33a16d71d6535b901baf02b22bd3e 100644
--- a/src/obj/AvoidNode.cpp
+++ b/src/obj/AvoidNode.cpp
@@ -23,7 +23,7 @@ string AvoidNode::asString( bool verbose ) const {
 	AVOID_NODE_STRING
 }
 
-void AvoidNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void AvoidNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	AVOID_NODE_FIXLINKS
 }
 
diff --git a/src/obj/BSBound.cpp b/src/obj/BSBound.cpp
index 6e7d48a374f8b8e80444b3b172b371fa1bd670cc..90a69e71969f8197018f04a1f7651b616bd2e668 100644
--- a/src/obj/BSBound.cpp
+++ b/src/obj/BSBound.cpp
@@ -23,7 +23,7 @@ string BSBound::asString( bool verbose ) const {
 	B_S_BOUND_STRING
 }
 
-void BSBound::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSBound::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_BOUND_FIXLINKS
 }
 
diff --git a/src/obj/BSFurnitureMarker.cpp b/src/obj/BSFurnitureMarker.cpp
index 86ec09ca0ef25962328c54558b44d9221eb88e1a..fab06225d4a63b18cfacfa489c59be16bc6e6d4b 100644
--- a/src/obj/BSFurnitureMarker.cpp
+++ b/src/obj/BSFurnitureMarker.cpp
@@ -24,7 +24,7 @@ string BSFurnitureMarker::asString( bool verbose ) const {
 	B_S_FURNITURE_MARKER_STRING
 }
 
-void BSFurnitureMarker::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSFurnitureMarker::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_FURNITURE_MARKER_FIXLINKS
 }
 
diff --git a/src/obj/BSKeyframeController.cpp b/src/obj/BSKeyframeController.cpp
index c58ab24aa97c179c75685469bfb3128e3dc4c502..322caf537d40d873a68ce84aff120f221151f035 100644
--- a/src/obj/BSKeyframeController.cpp
+++ b/src/obj/BSKeyframeController.cpp
@@ -24,7 +24,7 @@ string BSKeyframeController::asString( bool verbose ) const {
 	B_S_KEYFRAME_CONTROLLER_STRING
 }
 
-void BSKeyframeController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSKeyframeController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_KEYFRAME_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/BSPSysArrayEmitter.cpp b/src/obj/BSPSysArrayEmitter.cpp
index 4eb28f4b45200c61ff264ef3449adb1a64a617a1..607e1400cd33db8e808a0731d9a14584fdac6c52 100644
--- a/src/obj/BSPSysArrayEmitter.cpp
+++ b/src/obj/BSPSysArrayEmitter.cpp
@@ -23,7 +23,7 @@ string BSPSysArrayEmitter::asString( bool verbose ) const {
 	B_S_P_SYS_ARRAY_EMITTER_STRING
 }
 
-void BSPSysArrayEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSPSysArrayEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_P_SYS_ARRAY_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/BSParentVelocityModifier.cpp b/src/obj/BSParentVelocityModifier.cpp
index 66462f933e5d8c06059855349633e073d1525a8b..6632f0b562b48371055e2e7ffa295acfd1985758 100644
--- a/src/obj/BSParentVelocityModifier.cpp
+++ b/src/obj/BSParentVelocityModifier.cpp
@@ -23,7 +23,7 @@ string BSParentVelocityModifier::asString( bool verbose ) const {
 	B_S_PARENT_VELOCITY_MODIFIER_STRING
 }
 
-void BSParentVelocityModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSParentVelocityModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_PARENT_VELOCITY_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/BSXFlags.cpp b/src/obj/BSXFlags.cpp
index 6c545883445d654e00fb3047c53c75af93ebc332..a324da367718a7fb4c80320b6484ef5e851ce03f 100644
--- a/src/obj/BSXFlags.cpp
+++ b/src/obj/BSXFlags.cpp
@@ -23,7 +23,7 @@ string BSXFlags::asString( bool verbose ) const {
 	B_S_X_FLAGS_STRING
 }
 
-void BSXFlags::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSXFlags::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	B_S_X_FLAGS_FIXLINKS
 }
 
diff --git a/src/obj/FxButton.cpp b/src/obj/FxButton.cpp
index 87c339149d74cfdd6b2d45015372571bb06fdb7f..101f27d3748b2abcca2b0b9ece2b47044a3f31b0 100644
--- a/src/obj/FxButton.cpp
+++ b/src/obj/FxButton.cpp
@@ -23,7 +23,7 @@ string FxButton::asString( bool verbose ) const {
 	FX_BUTTON_STRING
 }
 
-void FxButton::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxButton::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	FX_BUTTON_FIXLINKS
 }
 
diff --git a/src/obj/FxRadioButton.cpp b/src/obj/FxRadioButton.cpp
index c63c7a80396ca4254faf30038ae0465579d4c531..40c0930004659d8fbaa3302288600c4602ec2b43 100644
--- a/src/obj/FxRadioButton.cpp
+++ b/src/obj/FxRadioButton.cpp
@@ -24,7 +24,7 @@ string FxRadioButton::asString( bool verbose ) const {
 	FX_RADIO_BUTTON_STRING
 }
 
-void FxRadioButton::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxRadioButton::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	FX_RADIO_BUTTON_FIXLINKS
 }
 
diff --git a/src/obj/FxWidget.cpp b/src/obj/FxWidget.cpp
index 3e229c8da69867dff5b941292a56d6ce42cbbfcd..e25d7a2fe9bfd4e8e5990d6e46f995ede1b1343b 100644
--- a/src/obj/FxWidget.cpp
+++ b/src/obj/FxWidget.cpp
@@ -23,7 +23,7 @@ string FxWidget::asString( bool verbose ) const {
 	FX_WIDGET_STRING
 }
 
-void FxWidget::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxWidget::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	FX_WIDGET_FIXLINKS
 }
 
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index 658b1215839259c21fdf4d39b4b4aac179daa8d6..bce27d09775805da7ae2294c3aca283100000503 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -37,7 +37,7 @@ string NiAVObject::asString( bool verbose ) const {
 	NI_A_V_OBJECT_STRING
 }
 
-void NiAVObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAVObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_A_V_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/NiAlphaController.cpp b/src/obj/NiAlphaController.cpp
index 18e779f032a9cdcf0b40305908a016ed4a55a1aa..fa217c1c1b9fafe294a7d7c1d0eac9281b1ea167 100644
--- a/src/obj/NiAlphaController.cpp
+++ b/src/obj/NiAlphaController.cpp
@@ -24,7 +24,7 @@ string NiAlphaController::asString( bool verbose ) const {
 	NI_ALPHA_CONTROLLER_STRING
 }
 
-void NiAlphaController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_ALPHA_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiAlphaProperty.cpp b/src/obj/NiAlphaProperty.cpp
index 232db5a14fe5ba2ae70463aa539a9b98b8bee10b..8935bcb8e126896037d613d1aeebb1a9567930c7 100644
--- a/src/obj/NiAlphaProperty.cpp
+++ b/src/obj/NiAlphaProperty.cpp
@@ -23,7 +23,7 @@ string NiAlphaProperty::asString( bool verbose ) const {
 	NI_ALPHA_PROPERTY_STRING
 }
 
-void NiAlphaProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_ALPHA_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiAmbientLight.cpp b/src/obj/NiAmbientLight.cpp
index 2b810bd87a30a5b4020529760ed1668a67c5dc1f..fb2c0c4496ea583219dd5c3a3e9bb02afa0adee1 100644
--- a/src/obj/NiAmbientLight.cpp
+++ b/src/obj/NiAmbientLight.cpp
@@ -23,7 +23,7 @@ string NiAmbientLight::asString( bool verbose ) const {
 	NI_AMBIENT_LIGHT_STRING
 }
 
-void NiAmbientLight::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAmbientLight::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_AMBIENT_LIGHT_FIXLINKS
 }
 
diff --git a/src/obj/NiAutoNormalParticles.cpp b/src/obj/NiAutoNormalParticles.cpp
index 7511ff8643a60fafc8ff100a96b4beb854e1fdc9..6249c444c5ade29968c09bc17c4351ee3dba8991 100644
--- a/src/obj/NiAutoNormalParticles.cpp
+++ b/src/obj/NiAutoNormalParticles.cpp
@@ -23,7 +23,7 @@ string NiAutoNormalParticles::asString( bool verbose ) const {
 	NI_AUTO_NORMAL_PARTICLES_STRING
 }
 
-void NiAutoNormalParticles::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAutoNormalParticles::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_AUTO_NORMAL_PARTICLES_FIXLINKS
 }
 
diff --git a/src/obj/NiAutoNormalParticlesData.cpp b/src/obj/NiAutoNormalParticlesData.cpp
index b212c2a28a04f5a84e9fad135b65ff96cdd18ae3..b0312d6ccca20e04dc3529e37cb9c46c726b8b46 100644
--- a/src/obj/NiAutoNormalParticlesData.cpp
+++ b/src/obj/NiAutoNormalParticlesData.cpp
@@ -23,7 +23,7 @@ string NiAutoNormalParticlesData::asString( bool verbose ) const {
 	NI_AUTO_NORMAL_PARTICLES_DATA_STRING
 }
 
-void NiAutoNormalParticlesData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAutoNormalParticlesData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_AUTO_NORMAL_PARTICLES_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiBSAnimationNode.cpp b/src/obj/NiBSAnimationNode.cpp
index bb257bf329894276c65c73389661bc03e3bb6ea1..a2aa6b05d26e2f890c820774f9b2735724e2110f 100644
--- a/src/obj/NiBSAnimationNode.cpp
+++ b/src/obj/NiBSAnimationNode.cpp
@@ -23,7 +23,7 @@ string NiBSAnimationNode::asString( bool verbose ) const {
 	NI_B_S_ANIMATION_NODE_STRING
 }
 
-void NiBSAnimationNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSAnimationNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_S_ANIMATION_NODE_FIXLINKS
 }
 
diff --git a/src/obj/NiBSBoneLODController.cpp b/src/obj/NiBSBoneLODController.cpp
index 6fd795b20db9c52a2c6546c863f0c79e412d43e6..40c40070dc41b0746b996b4ef4cbec84c6a9d962 100644
--- a/src/obj/NiBSBoneLODController.cpp
+++ b/src/obj/NiBSBoneLODController.cpp
@@ -23,7 +23,7 @@ string NiBSBoneLODController::asString( bool verbose ) const {
 	NI_B_S_BONE_L_O_D_CONTROLLER_STRING
 }
 
-void NiBSBoneLODController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSBoneLODController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_S_BONE_L_O_D_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiBSPArrayController.cpp b/src/obj/NiBSPArrayController.cpp
index b4d003fba0d92afe0ff5968fc3e8480d4938d895..af0bcd1285b13ee7242af62e56f7188933ae7043 100644
--- a/src/obj/NiBSPArrayController.cpp
+++ b/src/obj/NiBSPArrayController.cpp
@@ -23,7 +23,7 @@ string NiBSPArrayController::asString( bool verbose ) const {
 	NI_B_S_P_ARRAY_CONTROLLER_STRING
 }
 
-void NiBSPArrayController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSPArrayController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_S_P_ARRAY_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiBSParticleNode.cpp b/src/obj/NiBSParticleNode.cpp
index 60d4ee9abfe2d337dcd78c26c62ebd8192ace2b4..1e47a22d7b6b81302bd7db2cf5e25eb5a1309f80 100644
--- a/src/obj/NiBSParticleNode.cpp
+++ b/src/obj/NiBSParticleNode.cpp
@@ -23,7 +23,7 @@ string NiBSParticleNode::asString( bool verbose ) const {
 	NI_B_S_PARTICLE_NODE_STRING
 }
 
-void NiBSParticleNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSParticleNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_S_PARTICLE_NODE_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineBasisData.cpp b/src/obj/NiBSplineBasisData.cpp
index 33e336e81908545087a76609314c8de8da8d2639..8c4c57666f5a9ff5c6c3744a18cc958b4d08c1d5 100644
--- a/src/obj/NiBSplineBasisData.cpp
+++ b/src/obj/NiBSplineBasisData.cpp
@@ -23,7 +23,7 @@ string NiBSplineBasisData::asString( bool verbose ) const {
 	NI_B_SPLINE_BASIS_DATA_STRING
 }
 
-void NiBSplineBasisData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineBasisData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_BASIS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineCompFloatInterpolator.cpp b/src/obj/NiBSplineCompFloatInterpolator.cpp
index a45de58170ea214613d352f7be6fe6470d6ed93e..5a9d961de123191c8a37aa7b0a542eecc9ff1d34 100644
--- a/src/obj/NiBSplineCompFloatInterpolator.cpp
+++ b/src/obj/NiBSplineCompFloatInterpolator.cpp
@@ -23,7 +23,7 @@ string NiBSplineCompFloatInterpolator::asString( bool verbose ) const {
 	NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_STRING
 }
 
-void NiBSplineCompFloatInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompFloatInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineCompPoint3Interpolator.cpp b/src/obj/NiBSplineCompPoint3Interpolator.cpp
index 8ecf3bb9a1b67a7d9bb3858875ca34cae376d6bb..c977a293f6ccf0733a0ab3db52b41f30e2aa120c 100644
--- a/src/obj/NiBSplineCompPoint3Interpolator.cpp
+++ b/src/obj/NiBSplineCompPoint3Interpolator.cpp
@@ -23,7 +23,7 @@ string NiBSplineCompPoint3Interpolator::asString( bool verbose ) const {
 	NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_STRING
 }
 
-void NiBSplineCompPoint3Interpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompPoint3Interpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineCompTransformInterpolator.cpp b/src/obj/NiBSplineCompTransformInterpolator.cpp
index fe9ea520557e3210058ee87815ddeb91400911b1..80ca848397364fd016d1f456cc9e639a4009d4d7 100644
--- a/src/obj/NiBSplineCompTransformInterpolator.cpp
+++ b/src/obj/NiBSplineCompTransformInterpolator.cpp
@@ -29,7 +29,7 @@ string NiBSplineCompTransformInterpolator::asString( bool verbose ) const {
 	NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_STRING
 }
 
-void NiBSplineCompTransformInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineCompTransformInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineData.cpp b/src/obj/NiBSplineData.cpp
index c2fe71838e846bd12ed19adfd8e9123f227eab54..5c716b161f36e01e29d9fbf87d4eab92899b4ee6 100644
--- a/src/obj/NiBSplineData.cpp
+++ b/src/obj/NiBSplineData.cpp
@@ -23,7 +23,7 @@ string NiBSplineData::asString( bool verbose ) const {
 	NI_B_SPLINE_DATA_STRING
 }
 
-void NiBSplineData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiBSplineInterpolator.cpp b/src/obj/NiBSplineInterpolator.cpp
index d159d874fc7d208b881386090c7d0a9621f20872..1bd3714189ccb0ef4466942a109ef7995aeb60c9 100644
--- a/src/obj/NiBSplineInterpolator.cpp
+++ b/src/obj/NiBSplineInterpolator.cpp
@@ -25,7 +25,7 @@ string NiBSplineInterpolator::asString( bool verbose ) const {
 	NI_B_SPLINE_INTERPOLATOR_STRING
 }
 
-void NiBSplineInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_B_SPLINE_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBillboardNode.cpp b/src/obj/NiBillboardNode.cpp
index 14b82ffa4cc8345f8802f6beae22297c25013c52..c31e2bdb6df33e39aa46e07ac9c118ef86e0dc2c 100644
--- a/src/obj/NiBillboardNode.cpp
+++ b/src/obj/NiBillboardNode.cpp
@@ -23,7 +23,7 @@ string NiBillboardNode::asString( bool verbose ) const {
 	NI_BILLBOARD_NODE_STRING
 }
 
-void NiBillboardNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBillboardNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BILLBOARD_NODE_FIXLINKS
 }
 
diff --git a/src/obj/NiBinaryExtraData.cpp b/src/obj/NiBinaryExtraData.cpp
index 462ca0eb7024d86fd49b25da648160d5e4864206..eb4e7288743606ae1ed00e5ba0240fa517067c84 100644
--- a/src/obj/NiBinaryExtraData.cpp
+++ b/src/obj/NiBinaryExtraData.cpp
@@ -24,7 +24,7 @@ string NiBinaryExtraData::asString( bool verbose ) const {
 	NI_BINARY_EXTRA_DATA_STRING
 }
 
-void NiBinaryExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBinaryExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BINARY_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiBlendBoolInterpolator.cpp b/src/obj/NiBlendBoolInterpolator.cpp
index 2bf6e86ec18c182da64305eafc39422bbe2940d0..967d4075d1ea766e352154f07197d63c8a07c29a 100644
--- a/src/obj/NiBlendBoolInterpolator.cpp
+++ b/src/obj/NiBlendBoolInterpolator.cpp
@@ -23,7 +23,7 @@ string NiBlendBoolInterpolator::asString( bool verbose ) const {
 	NI_BLEND_BOOL_INTERPOLATOR_STRING
 }
 
-void NiBlendBoolInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendBoolInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BLEND_BOOL_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBlendFloatInterpolator.cpp b/src/obj/NiBlendFloatInterpolator.cpp
index 3b177c7a8f8e4e94eebd08dbb02e1c630ed243d8..322bb0f3386bf59a937bd9f11a8bd0796251cb84 100644
--- a/src/obj/NiBlendFloatInterpolator.cpp
+++ b/src/obj/NiBlendFloatInterpolator.cpp
@@ -23,7 +23,7 @@ string NiBlendFloatInterpolator::asString( bool verbose ) const {
 	NI_BLEND_FLOAT_INTERPOLATOR_STRING
 }
 
-void NiBlendFloatInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendFloatInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BLEND_FLOAT_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBlendInterpolator.cpp b/src/obj/NiBlendInterpolator.cpp
index 5f21ff2cfabba30d89eb85bf132710b9fdbe40fa..7f893c952d317bd917b979da370ed1821f8aad41 100644
--- a/src/obj/NiBlendInterpolator.cpp
+++ b/src/obj/NiBlendInterpolator.cpp
@@ -23,7 +23,7 @@ string NiBlendInterpolator::asString( bool verbose ) const {
 	NI_BLEND_INTERPOLATOR_STRING
 }
 
-void NiBlendInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BLEND_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBlendPoint3Interpolator.cpp b/src/obj/NiBlendPoint3Interpolator.cpp
index 1b48c8fcc3be941da30137051b320d65f265f1aa..b975f9d1d15c6395eab8906429c6ec71197f89c4 100644
--- a/src/obj/NiBlendPoint3Interpolator.cpp
+++ b/src/obj/NiBlendPoint3Interpolator.cpp
@@ -23,7 +23,7 @@ string NiBlendPoint3Interpolator::asString( bool verbose ) const {
 	NI_BLEND_POINT3_INTERPOLATOR_STRING
 }
 
-void NiBlendPoint3Interpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendPoint3Interpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BLEND_POINT3_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBlendTransformInterpolator.cpp b/src/obj/NiBlendTransformInterpolator.cpp
index c0ef29acc84b89cc482b8acd22adab48ca35ada0..dada493902e6b6197a081656e8132514b426f600 100644
--- a/src/obj/NiBlendTransformInterpolator.cpp
+++ b/src/obj/NiBlendTransformInterpolator.cpp
@@ -23,7 +23,7 @@ string NiBlendTransformInterpolator::asString( bool verbose ) const {
 	NI_BLEND_TRANSFORM_INTERPOLATOR_STRING
 }
 
-void NiBlendTransformInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBlendTransformInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BLEND_TRANSFORM_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBoneLODController.cpp b/src/obj/NiBoneLODController.cpp
index 06405920b1d546912419869f5406a9e5e06f55c6..b9d6d69b159fd92f4d230901b82e41e07be75b68 100644
--- a/src/obj/NiBoneLODController.cpp
+++ b/src/obj/NiBoneLODController.cpp
@@ -27,7 +27,7 @@ string NiBoneLODController::asString( bool verbose ) const {
 	NI_BONE_L_O_D_CONTROLLER_STRING
 }
 
-void NiBoneLODController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoneLODController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BONE_L_O_D_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiBoolData.cpp b/src/obj/NiBoolData.cpp
index dc4160e93ff5f346eeb6055134b47abdedadb00a..b368df255457f47cf3fe8b1faf2637d19ae19048 100644
--- a/src/obj/NiBoolData.cpp
+++ b/src/obj/NiBoolData.cpp
@@ -24,7 +24,7 @@ string NiBoolData::asString( bool verbose ) const {
 	NI_BOOL_DATA_STRING
 }
 
-void NiBoolData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BOOL_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiBoolInterpolator.cpp b/src/obj/NiBoolInterpolator.cpp
index ef47d79b22954ee729a17213e6f5fb92fd3b0af0..bf76f7f087ff361bb28a82886568ef0c318945d1 100644
--- a/src/obj/NiBoolInterpolator.cpp
+++ b/src/obj/NiBoolInterpolator.cpp
@@ -24,7 +24,7 @@ string NiBoolInterpolator::asString( bool verbose ) const {
 	NI_BOOL_INTERPOLATOR_STRING
 }
 
-void NiBoolInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BOOL_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBoolTimelineInterpolator.cpp b/src/obj/NiBoolTimelineInterpolator.cpp
index 95dd6d24d11e9011ba92f715b91c4a9a70704a3f..f4c95e2aee113d4a07f2930c659f2c466f3b724e 100644
--- a/src/obj/NiBoolTimelineInterpolator.cpp
+++ b/src/obj/NiBoolTimelineInterpolator.cpp
@@ -24,7 +24,7 @@ string NiBoolTimelineInterpolator::asString( bool verbose ) const {
 	NI_BOOL_TIMELINE_INTERPOLATOR_STRING
 }
 
-void NiBoolTimelineInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolTimelineInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BOOL_TIMELINE_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiBooleanExtraData.cpp b/src/obj/NiBooleanExtraData.cpp
index 213798d36311882d13ec5eb9a44bd3fb41dcc5a0..878447f53833bfcf3c31991f38dca19fcaadc416 100644
--- a/src/obj/NiBooleanExtraData.cpp
+++ b/src/obj/NiBooleanExtraData.cpp
@@ -23,7 +23,7 @@ string NiBooleanExtraData::asString( bool verbose ) const {
 	NI_BOOLEAN_EXTRA_DATA_STRING
 }
 
-void NiBooleanExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBooleanExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_BOOLEAN_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiCamera.cpp b/src/obj/NiCamera.cpp
index 3495653ca6d9f9bde04420d30dd37c628bdf4a63..a75f33b3857b075ce95c2904e134406d6f954e9d 100644
--- a/src/obj/NiCamera.cpp
+++ b/src/obj/NiCamera.cpp
@@ -24,7 +24,7 @@ string NiCamera::asString( bool verbose ) const {
 	NI_CAMERA_STRING
 }
 
-void NiCamera::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCamera::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_CAMERA_FIXLINKS
 }
 
diff --git a/src/obj/NiClod.cpp b/src/obj/NiClod.cpp
index 536b1a98a98df8034077d879a3e1e136d33e7f9b..4aa86783689658acb8eeddabf89cc575300e3ebb 100644
--- a/src/obj/NiClod.cpp
+++ b/src/obj/NiClod.cpp
@@ -23,7 +23,7 @@ string NiClod::asString( bool verbose ) const {
 	NI_CLOD_STRING
 }
 
-void NiClod::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiClod::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_CLOD_FIXLINKS
 }
 
diff --git a/src/obj/NiClodData.cpp b/src/obj/NiClodData.cpp
index b7af336893ce2eba64aeaf4a54d5395659549fd5..4e8d22af6ad25108c2ddce6b94914c2478f5836d 100644
--- a/src/obj/NiClodData.cpp
+++ b/src/obj/NiClodData.cpp
@@ -23,7 +23,7 @@ string NiClodData::asString( bool verbose ) const {
 	NI_CLOD_DATA_STRING
 }
 
-void NiClodData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiClodData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_CLOD_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiCollisionData.cpp b/src/obj/NiCollisionData.cpp
index 9f7b3f366b668e45c0cd0e4fad986d9b5cc2b57f..1abfc17ab48eb29479569b5c95c210cc7dec57ad 100644
--- a/src/obj/NiCollisionData.cpp
+++ b/src/obj/NiCollisionData.cpp
@@ -24,7 +24,7 @@ string NiCollisionData::asString( bool verbose ) const {
 	NI_COLLISION_DATA_STRING
 }
 
-void NiCollisionData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_COLLISION_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiCollisionObject.cpp b/src/obj/NiCollisionObject.cpp
index 7780ace72492aeb0a3aee3be8dd9f429d4b5ad11..d1e50b98b262c4b34ad6a892e107f5f833b5af9e 100644
--- a/src/obj/NiCollisionObject.cpp
+++ b/src/obj/NiCollisionObject.cpp
@@ -25,7 +25,7 @@ string NiCollisionObject::asString( bool verbose ) const {
 	NI_COLLISION_OBJECT_STRING
 }
 
-void NiCollisionObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_COLLISION_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/NiColorData.cpp b/src/obj/NiColorData.cpp
index 6f69fa245a1c32a2bfb12280d1a5420726758bb3..962a55dffa23acf37c402287780bebe708243f61 100644
--- a/src/obj/NiColorData.cpp
+++ b/src/obj/NiColorData.cpp
@@ -24,7 +24,7 @@ string NiColorData::asString( bool verbose ) const {
 	NI_COLOR_DATA_STRING
 }
 
-void NiColorData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiColorData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_COLOR_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiColorExtraData.cpp b/src/obj/NiColorExtraData.cpp
index 6c0604f94adaddfa74f771ae3e7592008d41a4fe..39c4f3587fc81d12d742bb2dfaccbd133092b5de 100644
--- a/src/obj/NiColorExtraData.cpp
+++ b/src/obj/NiColorExtraData.cpp
@@ -23,7 +23,7 @@ string NiColorExtraData::asString( bool verbose ) const {
 	NI_COLOR_EXTRA_DATA_STRING
 }
 
-void NiColorExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiColorExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_COLOR_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiControllerManager.cpp b/src/obj/NiControllerManager.cpp
index 8cc85f49732195b9f9a0b05b8c958a18bd5e61bd..dbd408595c9d1d29beec9d897bdb567c599a50b4 100644
--- a/src/obj/NiControllerManager.cpp
+++ b/src/obj/NiControllerManager.cpp
@@ -26,7 +26,7 @@ string NiControllerManager::asString( bool verbose ) const {
 	NI_CONTROLLER_MANAGER_STRING
 }
 
-void NiControllerManager::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerManager::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_CONTROLLER_MANAGER_FIXLINKS
 }
 
diff --git a/src/obj/NiControllerSequence.cpp b/src/obj/NiControllerSequence.cpp
index e0d68c90e821da0947892c4f03535178a3a8a710..125a71968f12762a13ec18dc5c77eb1e3188f2cc 100644
--- a/src/obj/NiControllerSequence.cpp
+++ b/src/obj/NiControllerSequence.cpp
@@ -35,7 +35,7 @@ string NiControllerSequence::asString( bool verbose ) const {
 	NI_CONTROLLER_SEQUENCE_STRING
 }
 
-void NiControllerSequence::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerSequence::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_CONTROLLER_SEQUENCE_FIXLINKS
 }
 
diff --git a/src/obj/NiDefaultAVObjectPalette.cpp b/src/obj/NiDefaultAVObjectPalette.cpp
index bfbf5b65b84a993574652d3705f94d14463a68dc..c9851d7d2ccc91393fb62bb001f76022ea53457c 100644
--- a/src/obj/NiDefaultAVObjectPalette.cpp
+++ b/src/obj/NiDefaultAVObjectPalette.cpp
@@ -25,7 +25,7 @@ string NiDefaultAVObjectPalette::asString( bool verbose ) const {
 	NI_DEFAULT_A_V_OBJECT_PALETTE_STRING
 }
 
-void NiDefaultAVObjectPalette::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDefaultAVObjectPalette::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_DEFAULT_A_V_OBJECT_PALETTE_FIXLINKS
 }
 
diff --git a/src/obj/NiDirectionalLight.cpp b/src/obj/NiDirectionalLight.cpp
index a26e8adb725274d6150508b8a0d5eaac23cdffc7..e24e479ccea2c679ce364fee6ec2c73a3562344b 100644
--- a/src/obj/NiDirectionalLight.cpp
+++ b/src/obj/NiDirectionalLight.cpp
@@ -23,7 +23,7 @@ string NiDirectionalLight::asString( bool verbose ) const {
 	NI_DIRECTIONAL_LIGHT_STRING
 }
 
-void NiDirectionalLight::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDirectionalLight::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_DIRECTIONAL_LIGHT_FIXLINKS
 }
 
diff --git a/src/obj/NiDitherProperty.cpp b/src/obj/NiDitherProperty.cpp
index c0f868f41597f216381c1a8a1ffe4f2313cdc754..7d0456f45cadd162822c02d3ae0e4341820e53d9 100644
--- a/src/obj/NiDitherProperty.cpp
+++ b/src/obj/NiDitherProperty.cpp
@@ -23,7 +23,7 @@ string NiDitherProperty::asString( bool verbose ) const {
 	NI_DITHER_PROPERTY_STRING
 }
 
-void NiDitherProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDitherProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_DITHER_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiDynamicEffect.cpp b/src/obj/NiDynamicEffect.cpp
index 945237ede3891617778a515170b48aae9f0aa9b9..a8666134292756a41f992e945dd2b55e9b242cd2 100644
--- a/src/obj/NiDynamicEffect.cpp
+++ b/src/obj/NiDynamicEffect.cpp
@@ -24,7 +24,7 @@ string NiDynamicEffect::asString( bool verbose ) const {
 	NI_DYNAMIC_EFFECT_STRING
 }
 
-void NiDynamicEffect::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDynamicEffect::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_DYNAMIC_EFFECT_FIXLINKS
 }
 
diff --git a/src/obj/NiExtraData.cpp b/src/obj/NiExtraData.cpp
index 73c5555240c200d357238eef3dd065da8bb784ec..77d73aff41b407b18ede7d0901646439400ac7e6 100644
--- a/src/obj/NiExtraData.cpp
+++ b/src/obj/NiExtraData.cpp
@@ -23,7 +23,7 @@ string NiExtraData::asString( bool verbose ) const {
 	NI_EXTRA_DATA_STRING
 }
 
-void NiExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiFlipController.cpp b/src/obj/NiFlipController.cpp
index ae9711f5d6905b8ece5e63ce4bb5f9df50d13105..abe2b0b182a4e5718d52de4346bc17c5d4e42454 100644
--- a/src/obj/NiFlipController.cpp
+++ b/src/obj/NiFlipController.cpp
@@ -24,7 +24,7 @@ string NiFlipController::asString( bool verbose ) const {
 	NI_FLIP_CONTROLLER_STRING
 }
 
-void NiFlipController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFlipController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLIP_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiFloatData.cpp b/src/obj/NiFloatData.cpp
index 8dc8d68880a8add04927a26d6505081f7830ba19..11f3ce6c1ea5b824169e86521ce4b495ebcbda00 100644
--- a/src/obj/NiFloatData.cpp
+++ b/src/obj/NiFloatData.cpp
@@ -24,7 +24,7 @@ string NiFloatData::asString( bool verbose ) const {
 	NI_FLOAT_DATA_STRING
 }
 
-void NiFloatData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLOAT_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiFloatExtraData.cpp b/src/obj/NiFloatExtraData.cpp
index b11eff524a374fdca0d0e42533e9f1f90c1fea91..485b87c31180a033cb0d2a127204e7b7c82ddb47 100644
--- a/src/obj/NiFloatExtraData.cpp
+++ b/src/obj/NiFloatExtraData.cpp
@@ -23,7 +23,7 @@ string NiFloatExtraData::asString( bool verbose ) const {
 	NI_FLOAT_EXTRA_DATA_STRING
 }
 
-void NiFloatExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLOAT_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiFloatExtraDataController.cpp b/src/obj/NiFloatExtraDataController.cpp
index 4b4fd9b90270213df29e887c5220d3c81cb0fd9b..dca04606cf965977c5551a31b2dc931a4700238b 100644
--- a/src/obj/NiFloatExtraDataController.cpp
+++ b/src/obj/NiFloatExtraDataController.cpp
@@ -24,7 +24,7 @@ string NiFloatExtraDataController::asString( bool verbose ) const {
 	NI_FLOAT_EXTRA_DATA_CONTROLLER_STRING
 }
 
-void NiFloatExtraDataController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraDataController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLOAT_EXTRA_DATA_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiFloatInterpolator.cpp b/src/obj/NiFloatInterpolator.cpp
index 9ea6f2effe5bc6877b6701a0ff85866844f7ef97..b5c62019260dec0cbde537184abef940b1bf18bc 100644
--- a/src/obj/NiFloatInterpolator.cpp
+++ b/src/obj/NiFloatInterpolator.cpp
@@ -24,7 +24,7 @@ string NiFloatInterpolator::asString( bool verbose ) const {
 	NI_FLOAT_INTERPOLATOR_STRING
 }
 
-void NiFloatInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLOAT_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiFloatsExtraData.cpp b/src/obj/NiFloatsExtraData.cpp
index bb673bf8bcc0e1b484b4e1d7333c5cdca0a3edbf..17b26f6f1f2290d38c132d5ff59ec478fa7f5db8 100644
--- a/src/obj/NiFloatsExtraData.cpp
+++ b/src/obj/NiFloatsExtraData.cpp
@@ -23,7 +23,7 @@ string NiFloatsExtraData::asString( bool verbose ) const {
 	NI_FLOATS_EXTRA_DATA_STRING
 }
 
-void NiFloatsExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatsExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FLOATS_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiFogProperty.cpp b/src/obj/NiFogProperty.cpp
index f89e4006e1fa9e8da50c1e61743ce228df7ab53a..a79f6583065300c6ebc1c9f4a0d34eb5e1897d72 100644
--- a/src/obj/NiFogProperty.cpp
+++ b/src/obj/NiFogProperty.cpp
@@ -23,7 +23,7 @@ string NiFogProperty::asString( bool verbose ) const {
 	NI_FOG_PROPERTY_STRING
 }
 
-void NiFogProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFogProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_FOG_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index 41ef12163ae20298b2de51cff56740b0c5dfc24d..dff5aa98b1f15a7e6f65b7ddede7f44421b3cf97 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -25,7 +25,7 @@ string NiGeomMorpherController::asString( bool verbose ) const {
 	NI_GEOM_MORPHER_CONTROLLER_STRING
 }
 
-void NiGeomMorpherController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeomMorpherController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_GEOM_MORPHER_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiGravity.cpp b/src/obj/NiGravity.cpp
index ee33a55e0ced281cbca1625f2f8017ca0898c26a..c805a3092e48d7d63b8a624c11bea0767d1604f6 100644
--- a/src/obj/NiGravity.cpp
+++ b/src/obj/NiGravity.cpp
@@ -23,7 +23,7 @@ string NiGravity::asString( bool verbose ) const {
 	NI_GRAVITY_STRING
 }
 
-void NiGravity::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGravity::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_GRAVITY_FIXLINKS
 }
 
diff --git a/src/obj/NiIntegerExtraData.cpp b/src/obj/NiIntegerExtraData.cpp
index f0bd28b8c43b71a2240a02d007f2d4d6db0d679b..cf7ec8877f42f7fc05dfaa201cf1c2ea87bf5779 100644
--- a/src/obj/NiIntegerExtraData.cpp
+++ b/src/obj/NiIntegerExtraData.cpp
@@ -23,7 +23,7 @@ string NiIntegerExtraData::asString( bool verbose ) const {
 	NI_INTEGER_EXTRA_DATA_STRING
 }
 
-void NiIntegerExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiIntegerExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_INTEGER_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiIntegersExtraData.cpp b/src/obj/NiIntegersExtraData.cpp
index 666724978e92e4b08ff1413055eda944f0bbec83..56bb7e2d834e126538fa7b4f47b7553dd8322ba7 100644
--- a/src/obj/NiIntegersExtraData.cpp
+++ b/src/obj/NiIntegersExtraData.cpp
@@ -23,7 +23,7 @@ string NiIntegersExtraData::asString( bool verbose ) const {
 	NI_INTEGERS_EXTRA_DATA_STRING
 }
 
-void NiIntegersExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiIntegersExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_INTEGERS_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiInterpolator.cpp b/src/obj/NiInterpolator.cpp
index 4d1b78a428bd9970bf42fe79d5a9b9d67f3b72cf..53fdd111ce8b0a0affd1271b17d744b1840c466d 100644
--- a/src/obj/NiInterpolator.cpp
+++ b/src/obj/NiInterpolator.cpp
@@ -23,7 +23,7 @@ string NiInterpolator::asString( bool verbose ) const {
 	NI_INTERPOLATOR_STRING
 }
 
-void NiInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiKeyframeController.cpp b/src/obj/NiKeyframeController.cpp
index 46d01d4a25ac64f84e42b7048b5e262d41bc29dc..6f015f59e342427c99d0f9df91c94eef6dbb36ab 100644
--- a/src/obj/NiKeyframeController.cpp
+++ b/src/obj/NiKeyframeController.cpp
@@ -24,7 +24,7 @@ string NiKeyframeController::asString( bool verbose ) const {
 	NI_KEYFRAME_CONTROLLER_STRING
 }
 
-void NiKeyframeController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_KEYFRAME_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiKeyframeData.cpp b/src/obj/NiKeyframeData.cpp
index 2dac08ca8e75e4f2f18e5630b3bdb45d83e11ed8..7a82970b854f2c9327c96510b1e5cd6e07947a1c 100644
--- a/src/obj/NiKeyframeData.cpp
+++ b/src/obj/NiKeyframeData.cpp
@@ -24,7 +24,7 @@ string NiKeyframeData::asString( bool verbose ) const {
 	NI_KEYFRAME_DATA_STRING
 }
 
-void NiKeyframeData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_KEYFRAME_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiLODData.cpp b/src/obj/NiLODData.cpp
index 5029d088daf2cd61050a74c1591c575fa4c9288c..881e01ab6dd95e1bd19a0007b4f96dc1d44e4d78 100644
--- a/src/obj/NiLODData.cpp
+++ b/src/obj/NiLODData.cpp
@@ -23,7 +23,7 @@ string NiLODData::asString( bool verbose ) const {
 	NI_L_O_D_DATA_STRING
 }
 
-void NiLODData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_L_O_D_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiLODNode.cpp b/src/obj/NiLODNode.cpp
index f339e8467d25364cfd7bef5695797618f31c1857..d90b4faefd55c1b843355835b66aafb2fd04c262 100644
--- a/src/obj/NiLODNode.cpp
+++ b/src/obj/NiLODNode.cpp
@@ -25,7 +25,7 @@ string NiLODNode::asString( bool verbose ) const {
 	NI_L_O_D_NODE_STRING
 }
 
-void NiLODNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_L_O_D_NODE_FIXLINKS
 }
 
diff --git a/src/obj/NiLight.cpp b/src/obj/NiLight.cpp
index ccc1dcc8547f5845107280489d700f421b41d283..c8aa701f6c1e1052e6b1aeb06986b6780a7e1d89 100644
--- a/src/obj/NiLight.cpp
+++ b/src/obj/NiLight.cpp
@@ -23,7 +23,7 @@ string NiLight::asString( bool verbose ) const {
 	NI_LIGHT_STRING
 }
 
-void NiLight::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLight::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_LIGHT_FIXLINKS
 }
 
diff --git a/src/obj/NiLightColorController.cpp b/src/obj/NiLightColorController.cpp
index 80015abe6b800162c5b2cef7c93af0f82bae10c9..9920cb3f8670cdc8ab5a692124414f9028df8764 100644
--- a/src/obj/NiLightColorController.cpp
+++ b/src/obj/NiLightColorController.cpp
@@ -25,7 +25,7 @@ string NiLightColorController::asString( bool verbose ) const {
 	NI_LIGHT_COLOR_CONTROLLER_STRING
 }
 
-void NiLightColorController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightColorController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_LIGHT_COLOR_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiLightDimmerController.cpp b/src/obj/NiLightDimmerController.cpp
index 2d86c621fa8b89f2b77f70a70c76b15c06e150cf..8b6e87bc30ce0cf40d31045985fbdfcad5acda15 100644
--- a/src/obj/NiLightDimmerController.cpp
+++ b/src/obj/NiLightDimmerController.cpp
@@ -24,7 +24,7 @@ string NiLightDimmerController::asString( bool verbose ) const {
 	NI_LIGHT_DIMMER_CONTROLLER_STRING
 }
 
-void NiLightDimmerController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightDimmerController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_LIGHT_DIMMER_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiLookAtController.cpp b/src/obj/NiLookAtController.cpp
index 056ac84fb797d47797bacaa61b59dd174c914362..fcbd4861062239265a8989133b2166e08f9523c7 100644
--- a/src/obj/NiLookAtController.cpp
+++ b/src/obj/NiLookAtController.cpp
@@ -24,7 +24,7 @@ string NiLookAtController::asString( bool verbose ) const {
 	NI_LOOK_AT_CONTROLLER_STRING
 }
 
-void NiLookAtController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_LOOK_AT_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiLookAtInterpolator.cpp b/src/obj/NiLookAtInterpolator.cpp
index 4735a7f7aee0e717104e2a902c9bdbc171d1d538..dbcc883423c45533480faca271b61ad1a81d4945 100644
--- a/src/obj/NiLookAtInterpolator.cpp
+++ b/src/obj/NiLookAtInterpolator.cpp
@@ -26,7 +26,7 @@ string NiLookAtInterpolator::asString( bool verbose ) const {
 	NI_LOOK_AT_INTERPOLATOR_STRING
 }
 
-void NiLookAtInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_LOOK_AT_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiMaterialColorController.cpp b/src/obj/NiMaterialColorController.cpp
index 868be206853d8a43e7202c2d79792e7486029c49..34717ceaa54596cc94487d719eb0b6760b19bfe0 100644
--- a/src/obj/NiMaterialColorController.cpp
+++ b/src/obj/NiMaterialColorController.cpp
@@ -24,7 +24,7 @@ string NiMaterialColorController::asString( bool verbose ) const {
 	NI_MATERIAL_COLOR_CONTROLLER_STRING
 }
 
-void NiMaterialColorController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialColorController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MATERIAL_COLOR_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiMaterialProperty.cpp b/src/obj/NiMaterialProperty.cpp
index 0c036848d2a10ca7a1778321ebbaa23525b94b38..08e16666f4c45f0428b4123403b314b55a0b73da 100644
--- a/src/obj/NiMaterialProperty.cpp
+++ b/src/obj/NiMaterialProperty.cpp
@@ -23,7 +23,7 @@ string NiMaterialProperty::asString( bool verbose ) const {
 	NI_MATERIAL_PROPERTY_STRING
 }
 
-void NiMaterialProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MATERIAL_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiMeshPSysData.cpp b/src/obj/NiMeshPSysData.cpp
index f28a42c1f05753167fa9d6103981c81f8cd37338..4dfeed7ab89a9c586da779d97ad560ba75791009 100644
--- a/src/obj/NiMeshPSysData.cpp
+++ b/src/obj/NiMeshPSysData.cpp
@@ -25,7 +25,7 @@ string NiMeshPSysData::asString( bool verbose ) const {
 	NI_MESH_P_SYS_DATA_STRING
 }
 
-void NiMeshPSysData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshPSysData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MESH_P_SYS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiMeshParticleSystem.cpp b/src/obj/NiMeshParticleSystem.cpp
index 0126f8b610118364fbf28b2375256b1ce2499c31..170abb4a1af302b27bd20bc4dcb79ca1e148037d 100644
--- a/src/obj/NiMeshParticleSystem.cpp
+++ b/src/obj/NiMeshParticleSystem.cpp
@@ -23,7 +23,7 @@ string NiMeshParticleSystem::asString( bool verbose ) const {
 	NI_MESH_PARTICLE_SYSTEM_STRING
 }
 
-void NiMeshParticleSystem::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshParticleSystem::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MESH_PARTICLE_SYSTEM_FIXLINKS
 }
 
diff --git a/src/obj/NiMorphData.cpp b/src/obj/NiMorphData.cpp
index e8dedfc2b9a61ea6b5d02314d5e03fcea4cd9e32..b9c7bf633dc94aef4e7e60bc148ac8d37b239768 100644
--- a/src/obj/NiMorphData.cpp
+++ b/src/obj/NiMorphData.cpp
@@ -24,7 +24,7 @@ string NiMorphData::asString( bool verbose ) const {
 	NI_MORPH_DATA_STRING
 }
 
-void NiMorphData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMorphData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MORPH_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiMultiTargetTransformController.cpp b/src/obj/NiMultiTargetTransformController.cpp
index bb27778eb558d4be59ab957cfc331bbf38dc307d..55c480033abde01433ccb05b7d2f1ee632755c01 100644
--- a/src/obj/NiMultiTargetTransformController.cpp
+++ b/src/obj/NiMultiTargetTransformController.cpp
@@ -25,7 +25,7 @@ string NiMultiTargetTransformController::asString( bool verbose ) const {
 	NI_MULTI_TARGET_TRANSFORM_CONTROLLER_STRING
 }
 
-void NiMultiTargetTransformController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMultiTargetTransformController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_MULTI_TARGET_TRANSFORM_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiNode.cpp b/src/obj/NiNode.cpp
index 09efdbccdfc362973b14eccb3f9fbaec0422a7a6..642f59abe55e385dbb054312c35492f811eba3d3 100644
--- a/src/obj/NiNode.cpp
+++ b/src/obj/NiNode.cpp
@@ -39,7 +39,7 @@ string NiNode::asString( bool verbose ) const {
 	NI_NODE_STRING
 }
 
-void NiNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_NODE_FIXLINKS
 	//Connect children to their parents and remove any NULL ones
 	for ( vector< NiAVObjectRef >::iterator it = children.begin(); it != children.end(); ) {
diff --git a/src/obj/NiObjectNET.cpp b/src/obj/NiObjectNET.cpp
index dc039c025a167f6b5866b96e2917ba0dd118c108..39b384af61a093984d6d59dc2126bb2ae9f81c9c 100644
--- a/src/obj/NiObjectNET.cpp
+++ b/src/obj/NiObjectNET.cpp
@@ -29,7 +29,7 @@ string NiObjectNET::asString( bool verbose ) const {
 	NI_OBJECT_N_E_T_STRING
 }
 
-void NiObjectNET::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObjectNET::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_OBJECT_N_E_T_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysAgeDeathModifier.cpp b/src/obj/NiPSysAgeDeathModifier.cpp
index cd011126e638693474ff41fbe143ab8f1b2521f3..217f71415c0d8ea00adef38829b50bcea5b1f259 100644
--- a/src/obj/NiPSysAgeDeathModifier.cpp
+++ b/src/obj/NiPSysAgeDeathModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysAgeDeathModifier::asString( bool verbose ) const {
 	NI_P_SYS_AGE_DEATH_MODIFIER_STRING
 }
 
-void NiPSysAgeDeathModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysAgeDeathModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_AGE_DEATH_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysBombModifier.cpp b/src/obj/NiPSysBombModifier.cpp
index 9eefaa97789abde9a23f9c93039aae3cc7782c65..0d1efc25dd3d49a54fd559dfc22c5c41b41a309f 100644
--- a/src/obj/NiPSysBombModifier.cpp
+++ b/src/obj/NiPSysBombModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysBombModifier::asString( bool verbose ) const {
 	NI_P_SYS_BOMB_MODIFIER_STRING
 }
 
-void NiPSysBombModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBombModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_BOMB_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysBoundUpdateModifier.cpp b/src/obj/NiPSysBoundUpdateModifier.cpp
index 9a6a64a015ae16cdad2387a711efdad38317ac3c..bf8244dc98e86767671e512c700d9def09e40982 100644
--- a/src/obj/NiPSysBoundUpdateModifier.cpp
+++ b/src/obj/NiPSysBoundUpdateModifier.cpp
@@ -23,7 +23,7 @@ string NiPSysBoundUpdateModifier::asString( bool verbose ) const {
 	NI_P_SYS_BOUND_UPDATE_MODIFIER_STRING
 }
 
-void NiPSysBoundUpdateModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBoundUpdateModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_BOUND_UPDATE_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysBoxEmitter.cpp b/src/obj/NiPSysBoxEmitter.cpp
index 5e73d22c4ad9efffe65476da167ec06866565686..888a2ec91d0cf04423fc27baf163e5cb460af7eb 100644
--- a/src/obj/NiPSysBoxEmitter.cpp
+++ b/src/obj/NiPSysBoxEmitter.cpp
@@ -23,7 +23,7 @@ string NiPSysBoxEmitter::asString( bool verbose ) const {
 	NI_P_SYS_BOX_EMITTER_STRING
 }
 
-void NiPSysBoxEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBoxEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_BOX_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysColliderManager.cpp b/src/obj/NiPSysColliderManager.cpp
index d67b5fa42b6acf7dc870d4e4294be25eb24b2bd5..4f9646a7d8685c9bc117309accd496e196af2e99 100644
--- a/src/obj/NiPSysColliderManager.cpp
+++ b/src/obj/NiPSysColliderManager.cpp
@@ -24,7 +24,7 @@ string NiPSysColliderManager::asString( bool verbose ) const {
 	NI_P_SYS_COLLIDER_MANAGER_STRING
 }
 
-void NiPSysColliderManager::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColliderManager::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_COLLIDER_MANAGER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysColorModifier.cpp b/src/obj/NiPSysColorModifier.cpp
index 74947f329aa8485c07f50aea9c83412127b9b9d2..6b67ce5216c4052e826d994d0e5ec838fba9750b 100644
--- a/src/obj/NiPSysColorModifier.cpp
+++ b/src/obj/NiPSysColorModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysColorModifier::asString( bool verbose ) const {
 	NI_P_SYS_COLOR_MODIFIER_STRING
 }
 
-void NiPSysColorModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColorModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_COLOR_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysCylinderEmitter.cpp b/src/obj/NiPSysCylinderEmitter.cpp
index aefe22e712229ff841183a22d6766f5273a96c32..0859ee358fe18da3b574f154d5a7dfb303abb3fa 100644
--- a/src/obj/NiPSysCylinderEmitter.cpp
+++ b/src/obj/NiPSysCylinderEmitter.cpp
@@ -23,7 +23,7 @@ string NiPSysCylinderEmitter::asString( bool verbose ) const {
 	NI_P_SYS_CYLINDER_EMITTER_STRING
 }
 
-void NiPSysCylinderEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysCylinderEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_CYLINDER_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysData.cpp b/src/obj/NiPSysData.cpp
index 2b864c6f74fad07e8ab5654a25b9e08f7a19d97a..b64ee33618f2e7145aafe944aa2b7c2a755a534d 100644
--- a/src/obj/NiPSysData.cpp
+++ b/src/obj/NiPSysData.cpp
@@ -23,7 +23,7 @@ string NiPSysData::asString( bool verbose ) const {
 	NI_P_SYS_DATA_STRING
 }
 
-void NiPSysData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysDragModifier.cpp b/src/obj/NiPSysDragModifier.cpp
index 1a79567b857062df619e6206fea79b3917a03233..fa530a05a6c71d9ffbaba7ad2f7f7aaa2a53d80d 100644
--- a/src/obj/NiPSysDragModifier.cpp
+++ b/src/obj/NiPSysDragModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysDragModifier::asString( bool verbose ) const {
 	NI_P_SYS_DRAG_MODIFIER_STRING
 }
 
-void NiPSysDragModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysDragModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_DRAG_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitter.cpp b/src/obj/NiPSysEmitter.cpp
index fe9c9c1120c8d9c494c054efaaa0b30e2ed23623..28a92a8afc179c062bb10c17695ad392a6ac5e57 100644
--- a/src/obj/NiPSysEmitter.cpp
+++ b/src/obj/NiPSysEmitter.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitter::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_STRING
 }
 
-void NiPSysEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterCtlr.cpp b/src/obj/NiPSysEmitterCtlr.cpp
index 04284207c0345537e75afda130fb487f80d0a842..e9ef24944c5b60d9f087e0309115c26e673ad1d8 100644
--- a/src/obj/NiPSysEmitterCtlr.cpp
+++ b/src/obj/NiPSysEmitterCtlr.cpp
@@ -25,7 +25,7 @@ string NiPSysEmitterCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_CTLR_STRING
 }
 
-void NiPSysEmitterCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterCtlrData.cpp b/src/obj/NiPSysEmitterCtlrData.cpp
index a41c24b04b6bf75567c5aef158e280fc5705ce94..5b4b9f12f5d17eddb40b81e0a2fc4e7fd3203679 100644
--- a/src/obj/NiPSysEmitterCtlrData.cpp
+++ b/src/obj/NiPSysEmitterCtlrData.cpp
@@ -24,7 +24,7 @@ string NiPSysEmitterCtlrData::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_CTLR_DATA_STRING
 }
 
-void NiPSysEmitterCtlrData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlrData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_CTLR_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterDeclinationCtlr.cpp b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
index ac8eeaa5165211e652a35d8e0e4b1e4efaa4dc06..8e39b94af9e43091809de32170e812c174b38411 100644
--- a/src/obj/NiPSysEmitterDeclinationCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitterDeclinationCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_DECLINATION_CTLR_STRING
 }
 
-void NiPSysEmitterDeclinationCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterDeclinationCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_DECLINATION_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
index 6b9827adaf258f9c1dfe9cc6f9161bdf19b94d41..34c99eae44fdc491122cd141c81ef163a59b2712 100644
--- a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitterDeclinationVarCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_DECLINATION_VAR_CTLR_STRING
 }
 
-void NiPSysEmitterDeclinationVarCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterDeclinationVarCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_DECLINATION_VAR_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
index 2bd816b4bfe713289c5dbf154a17967ab6361483..3f42bc74d76cf0ac93472301c41f499b1fe3f15d 100644
--- a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
+++ b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitterInitialRadiusCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_INITIAL_RADIUS_CTLR_STRING
 }
 
-void NiPSysEmitterInitialRadiusCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterInitialRadiusCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_INITIAL_RADIUS_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
index be994f56333428270e058b5608c34b960cc13b65..81254106148f31ca8e2bb13a631f33ffddf3dbb9 100644
--- a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
+++ b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitterLifeSpanCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_STRING
 }
 
-void NiPSysEmitterLifeSpanCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterLifeSpanCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysEmitterSpeedCtlr.cpp b/src/obj/NiPSysEmitterSpeedCtlr.cpp
index e1d26bffb23473867feee53347931092cdf24007..c31ce1ed3eb63774c4a42bace8bb42d49c8dbcd0 100644
--- a/src/obj/NiPSysEmitterSpeedCtlr.cpp
+++ b/src/obj/NiPSysEmitterSpeedCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysEmitterSpeedCtlr::asString( bool verbose ) const {
 	NI_P_SYS_EMITTER_SPEED_CTLR_STRING
 }
 
-void NiPSysEmitterSpeedCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterSpeedCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_EMITTER_SPEED_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysGravityModifier.cpp b/src/obj/NiPSysGravityModifier.cpp
index 7635ecb9bdfe10d9cab071d5388669013a9b1b9f..64387a9fb98515f2f05340bab21bf420e7c5a613 100644
--- a/src/obj/NiPSysGravityModifier.cpp
+++ b/src/obj/NiPSysGravityModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysGravityModifier::asString( bool verbose ) const {
 	NI_P_SYS_GRAVITY_MODIFIER_STRING
 }
 
-void NiPSysGravityModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_GRAVITY_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysGravityStrengthCtlr.cpp b/src/obj/NiPSysGravityStrengthCtlr.cpp
index 511d9c3f9f123ca9e54cb30d9143e61b417d784a..ece29bdac9dd153c1cf46344cd7adc0fa25bca98 100644
--- a/src/obj/NiPSysGravityStrengthCtlr.cpp
+++ b/src/obj/NiPSysGravityStrengthCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysGravityStrengthCtlr::asString( bool verbose ) const {
 	NI_P_SYS_GRAVITY_STRENGTH_CTLR_STRING
 }
 
-void NiPSysGravityStrengthCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityStrengthCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_GRAVITY_STRENGTH_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysGrowFadeModifier.cpp b/src/obj/NiPSysGrowFadeModifier.cpp
index e621f94b31557c5a85914af1eb0bcc14ba0d46f3..31d2f48660f33889fbba40ed792bf0be33b44d1e 100644
--- a/src/obj/NiPSysGrowFadeModifier.cpp
+++ b/src/obj/NiPSysGrowFadeModifier.cpp
@@ -23,7 +23,7 @@ string NiPSysGrowFadeModifier::asString( bool verbose ) const {
 	NI_P_SYS_GROW_FADE_MODIFIER_STRING
 }
 
-void NiPSysGrowFadeModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGrowFadeModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_GROW_FADE_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysMeshEmitter.cpp b/src/obj/NiPSysMeshEmitter.cpp
index b56f79083c42d1664e4cd736b6ce891168b639c8..186ba55fe4beb381517e8e1ff13326e611474493 100644
--- a/src/obj/NiPSysMeshEmitter.cpp
+++ b/src/obj/NiPSysMeshEmitter.cpp
@@ -24,7 +24,7 @@ string NiPSysMeshEmitter::asString( bool verbose ) const {
 	NI_P_SYS_MESH_EMITTER_STRING
 }
 
-void NiPSysMeshEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_MESH_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysMeshUpdateModifier.cpp b/src/obj/NiPSysMeshUpdateModifier.cpp
index c5ed58cb54c06eccbb5e2fafeb9aaf2808f7d87a..51a0d563185a9aa50e59227bd99a7b6d73ffcd9d 100644
--- a/src/obj/NiPSysMeshUpdateModifier.cpp
+++ b/src/obj/NiPSysMeshUpdateModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysMeshUpdateModifier::asString( bool verbose ) const {
 	NI_P_SYS_MESH_UPDATE_MODIFIER_STRING
 }
 
-void NiPSysMeshUpdateModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshUpdateModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_MESH_UPDATE_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysModifier.cpp b/src/obj/NiPSysModifier.cpp
index 597d69e0a2516016c44be8ce93a76ab7958512c4..bf7ca9129f022e2e819e85eb7e5f97210a407a01 100644
--- a/src/obj/NiPSysModifier.cpp
+++ b/src/obj/NiPSysModifier.cpp
@@ -24,7 +24,7 @@ string NiPSysModifier::asString( bool verbose ) const {
 	NI_P_SYS_MODIFIER_STRING
 }
 
-void NiPSysModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysModifierActiveCtlr.cpp b/src/obj/NiPSysModifierActiveCtlr.cpp
index adda1c705f3a544a982e614882352a672fff0304..09ae38dc8b67c009e3cbb298d80d1428ec97f8df 100644
--- a/src/obj/NiPSysModifierActiveCtlr.cpp
+++ b/src/obj/NiPSysModifierActiveCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysModifierActiveCtlr::asString( bool verbose ) const {
 	NI_P_SYS_MODIFIER_ACTIVE_CTLR_STRING
 }
 
-void NiPSysModifierActiveCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifierActiveCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_MODIFIER_ACTIVE_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysPlanarCollider.cpp b/src/obj/NiPSysPlanarCollider.cpp
index 8ed804b5b63764b4de712b355dfdf313e21f72b4..a16a2b437f694b0ee40d0a2f66a3d1c72aa2a492 100644
--- a/src/obj/NiPSysPlanarCollider.cpp
+++ b/src/obj/NiPSysPlanarCollider.cpp
@@ -26,7 +26,7 @@ string NiPSysPlanarCollider::asString( bool verbose ) const {
 	NI_P_SYS_PLANAR_COLLIDER_STRING
 }
 
-void NiPSysPlanarCollider::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPlanarCollider::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_PLANAR_COLLIDER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysPositionModifier.cpp b/src/obj/NiPSysPositionModifier.cpp
index a6d1d32b247ee27f33fcc304d6d1695a7ca5a2de..601bae363c665a4055865b93959263dc2f6b828c 100644
--- a/src/obj/NiPSysPositionModifier.cpp
+++ b/src/obj/NiPSysPositionModifier.cpp
@@ -23,7 +23,7 @@ string NiPSysPositionModifier::asString( bool verbose ) const {
 	NI_P_SYS_POSITION_MODIFIER_STRING
 }
 
-void NiPSysPositionModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPositionModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_POSITION_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysResetOnLoopCtlr.cpp b/src/obj/NiPSysResetOnLoopCtlr.cpp
index 79c8b4a21e97388715d71fd606c8d26d9924cb38..952f01c23ffa248507d502595f70fb93223a2099 100644
--- a/src/obj/NiPSysResetOnLoopCtlr.cpp
+++ b/src/obj/NiPSysResetOnLoopCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysResetOnLoopCtlr::asString( bool verbose ) const {
 	NI_P_SYS_RESET_ON_LOOP_CTLR_STRING
 }
 
-void NiPSysResetOnLoopCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysResetOnLoopCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_RESET_ON_LOOP_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysRotationModifier.cpp b/src/obj/NiPSysRotationModifier.cpp
index 3803caf06c704358ebe02e68defd80d483c1b1d3..bce236e3cded0f74fa4acb85af5aa7f6715ec8f1 100644
--- a/src/obj/NiPSysRotationModifier.cpp
+++ b/src/obj/NiPSysRotationModifier.cpp
@@ -23,7 +23,7 @@ string NiPSysRotationModifier::asString( bool verbose ) const {
 	NI_P_SYS_ROTATION_MODIFIER_STRING
 }
 
-void NiPSysRotationModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysRotationModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_ROTATION_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysSpawnModifier.cpp b/src/obj/NiPSysSpawnModifier.cpp
index 983c1915d3ba31a6d21284ba089a931722919d22..04b5c5191461200d609bfeab4b902d40690420b6 100644
--- a/src/obj/NiPSysSpawnModifier.cpp
+++ b/src/obj/NiPSysSpawnModifier.cpp
@@ -23,7 +23,7 @@ string NiPSysSpawnModifier::asString( bool verbose ) const {
 	NI_P_SYS_SPAWN_MODIFIER_STRING
 }
 
-void NiPSysSpawnModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysSpawnModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_SPAWN_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysSphereEmitter.cpp b/src/obj/NiPSysSphereEmitter.cpp
index 7382f8452cc7bda2c40865c21690c2e0d4ce68b5..b5cf33d45ce673cda972df82d5ba640704c85347 100644
--- a/src/obj/NiPSysSphereEmitter.cpp
+++ b/src/obj/NiPSysSphereEmitter.cpp
@@ -23,7 +23,7 @@ string NiPSysSphereEmitter::asString( bool verbose ) const {
 	NI_P_SYS_SPHERE_EMITTER_STRING
 }
 
-void NiPSysSphereEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysSphereEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_SPHERE_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysUpdateCtlr.cpp b/src/obj/NiPSysUpdateCtlr.cpp
index 22db770fa50d23c32ed6cb4c86b7ee25f23bf8f0..1a1e9f5df8b8ca66439342238ee2e748d3ac45bc 100644
--- a/src/obj/NiPSysUpdateCtlr.cpp
+++ b/src/obj/NiPSysUpdateCtlr.cpp
@@ -23,7 +23,7 @@ string NiPSysUpdateCtlr::asString( bool verbose ) const {
 	NI_P_SYS_UPDATE_CTLR_STRING
 }
 
-void NiPSysUpdateCtlr::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysUpdateCtlr::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_UPDATE_CTLR_FIXLINKS
 }
 
diff --git a/src/obj/NiPSysVolumeEmitter.cpp b/src/obj/NiPSysVolumeEmitter.cpp
index 4dd44345ecde81bc3e34a0049e423e5bb10bacf8..86dc1891ce3d00b4d17edec3ddd992f54b214637 100644
--- a/src/obj/NiPSysVolumeEmitter.cpp
+++ b/src/obj/NiPSysVolumeEmitter.cpp
@@ -24,7 +24,7 @@ string NiPSysVolumeEmitter::asString( bool verbose ) const {
 	NI_P_SYS_VOLUME_EMITTER_STRING
 }
 
-void NiPSysVolumeEmitter::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysVolumeEmitter::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_P_SYS_VOLUME_EMITTER_FIXLINKS
 }
 
diff --git a/src/obj/NiPalette.cpp b/src/obj/NiPalette.cpp
index 281d07301d07f7aadd6df8d4dc1f2da3058737cb..cc891588ec2c8a3b8d74b579456d2fe1b4fec315 100644
--- a/src/obj/NiPalette.cpp
+++ b/src/obj/NiPalette.cpp
@@ -23,7 +23,7 @@ string NiPalette::asString( bool verbose ) const {
 	NI_PALETTE_STRING
 }
 
-void NiPalette::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPalette::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PALETTE_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleBomb.cpp b/src/obj/NiParticleBomb.cpp
index 7d478d15f8287f38732a3dd1be41796574bcc3cf..144488c6b8f453dc0a281a428f475682cd713c9e 100644
--- a/src/obj/NiParticleBomb.cpp
+++ b/src/obj/NiParticleBomb.cpp
@@ -23,7 +23,7 @@ string NiParticleBomb::asString( bool verbose ) const {
 	NI_PARTICLE_BOMB_STRING
 }
 
-void NiParticleBomb::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleBomb::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_BOMB_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleColorModifier.cpp b/src/obj/NiParticleColorModifier.cpp
index 8e4ae0eaef94f30d5dce3d35b588bca9ebe6f4ea..7872c85c042c7846e1fb52173fefd5f555a86c56 100644
--- a/src/obj/NiParticleColorModifier.cpp
+++ b/src/obj/NiParticleColorModifier.cpp
@@ -24,7 +24,7 @@ string NiParticleColorModifier::asString( bool verbose ) const {
 	NI_PARTICLE_COLOR_MODIFIER_STRING
 }
 
-void NiParticleColorModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleColorModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_COLOR_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleGrowFade.cpp b/src/obj/NiParticleGrowFade.cpp
index a9f2a5fc31c1a9c85b59c78017ee5c371ee7f40f..08cdfa7eeb2d622a0c9d5f394a19b60a91f11613 100644
--- a/src/obj/NiParticleGrowFade.cpp
+++ b/src/obj/NiParticleGrowFade.cpp
@@ -23,7 +23,7 @@ string NiParticleGrowFade::asString( bool verbose ) const {
 	NI_PARTICLE_GROW_FADE_STRING
 }
 
-void NiParticleGrowFade::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleGrowFade::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_GROW_FADE_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleMeshModifier.cpp b/src/obj/NiParticleMeshModifier.cpp
index 11648910adf080f4290c5933bfa1f914b5d1157f..b0a85bd3249477d329e6d9c509811f5a0e462de0 100644
--- a/src/obj/NiParticleMeshModifier.cpp
+++ b/src/obj/NiParticleMeshModifier.cpp
@@ -24,7 +24,7 @@ string NiParticleMeshModifier::asString( bool verbose ) const {
 	NI_PARTICLE_MESH_MODIFIER_STRING
 }
 
-void NiParticleMeshModifier::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshModifier::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_MESH_MODIFIER_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleMeshes.cpp b/src/obj/NiParticleMeshes.cpp
index ffac7443f3382b3da2292375ef0c720184e84161..f1676db8a6879a7fa9ecee83b57dd7de934ef38a 100644
--- a/src/obj/NiParticleMeshes.cpp
+++ b/src/obj/NiParticleMeshes.cpp
@@ -23,7 +23,7 @@ string NiParticleMeshes::asString( bool verbose ) const {
 	NI_PARTICLE_MESHES_STRING
 }
 
-void NiParticleMeshes::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshes::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_MESHES_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleMeshesData.cpp b/src/obj/NiParticleMeshesData.cpp
index a2c45fb31ffb6a402373d1046fd6c22e8cef7c03..62b1cdcf782bd0abc686668aaf6a0f60c91f49d4 100644
--- a/src/obj/NiParticleMeshesData.cpp
+++ b/src/obj/NiParticleMeshesData.cpp
@@ -24,7 +24,7 @@ string NiParticleMeshesData::asString( bool verbose ) const {
 	NI_PARTICLE_MESHES_DATA_STRING
 }
 
-void NiParticleMeshesData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshesData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_MESHES_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleRotation.cpp b/src/obj/NiParticleRotation.cpp
index 2bc7c7b00125fb6b482631b926ab24899852fc36..137b2f38937f615654cd30f1e933cd13a438eb16 100644
--- a/src/obj/NiParticleRotation.cpp
+++ b/src/obj/NiParticleRotation.cpp
@@ -23,7 +23,7 @@ string NiParticleRotation::asString( bool verbose ) const {
 	NI_PARTICLE_ROTATION_STRING
 }
 
-void NiParticleRotation::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleRotation::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_ROTATION_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleSystem.cpp b/src/obj/NiParticleSystem.cpp
index 1513b329c0bb57d29dde99c34d345c6e5f177126..0c3e672d46e87b66fda37455cc889bd35c66f342 100644
--- a/src/obj/NiParticleSystem.cpp
+++ b/src/obj/NiParticleSystem.cpp
@@ -24,7 +24,7 @@ string NiParticleSystem::asString( bool verbose ) const {
 	NI_PARTICLE_SYSTEM_STRING
 }
 
-void NiParticleSystem::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystem::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_SYSTEM_FIXLINKS
 }
 
diff --git a/src/obj/NiParticleSystemController.cpp b/src/obj/NiParticleSystemController.cpp
index 47fb20716beadc450ff575e522a9f55d1865d2a1..90f1af976afce319e16f005e641af89f5a6b3589 100644
--- a/src/obj/NiParticleSystemController.cpp
+++ b/src/obj/NiParticleSystemController.cpp
@@ -26,7 +26,7 @@ string NiParticleSystemController::asString( bool verbose ) const {
 	NI_PARTICLE_SYSTEM_CONTROLLER_STRING
 }
 
-void NiParticleSystemController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystemController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLE_SYSTEM_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiParticles.cpp b/src/obj/NiParticles.cpp
index 7a2bae4c816c4715779ce80256cae09dcec10472..022988941fd4f7062d68d70835a70e53da8eba40 100644
--- a/src/obj/NiParticles.cpp
+++ b/src/obj/NiParticles.cpp
@@ -23,7 +23,7 @@ string NiParticles::asString( bool verbose ) const {
 	NI_PARTICLES_STRING
 }
 
-void NiParticles::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticles::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLES_FIXLINKS
 }
 
diff --git a/src/obj/NiParticlesData.cpp b/src/obj/NiParticlesData.cpp
index baea13ed32449470ba9efcba4929289437d730fe..a60cbf6f11f59559eca7ed62ca30ff8ed1b6ff37 100644
--- a/src/obj/NiParticlesData.cpp
+++ b/src/obj/NiParticlesData.cpp
@@ -23,7 +23,7 @@ string NiParticlesData::asString( bool verbose ) const {
 	NI_PARTICLES_DATA_STRING
 }
 
-void NiParticlesData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticlesData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PARTICLES_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiPathController.cpp b/src/obj/NiPathController.cpp
index 55424f12f49eab5bb523b1e54b877d5083b568cf..f702780980a92bfc870ff285c42c845510f644b1 100644
--- a/src/obj/NiPathController.cpp
+++ b/src/obj/NiPathController.cpp
@@ -25,7 +25,7 @@ string NiPathController::asString( bool verbose ) const {
 	NI_PATH_CONTROLLER_STRING
 }
 
-void NiPathController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PATH_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiPathInterpolator.cpp b/src/obj/NiPathInterpolator.cpp
index 659258459a6dc966037b44e892b17fea8a2c5e70..31c6540b7724ac9c88031aa08d161d99eb832e3b 100644
--- a/src/obj/NiPathInterpolator.cpp
+++ b/src/obj/NiPathInterpolator.cpp
@@ -25,7 +25,7 @@ string NiPathInterpolator::asString( bool verbose ) const {
 	NI_PATH_INTERPOLATOR_STRING
 }
 
-void NiPathInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PATH_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiPixelData.cpp b/src/obj/NiPixelData.cpp
index 5d35c9be1789f19abffa5ba56dfd1a82c0950126..687462a49ce98e7a8b107f7836023fcca054b6c1 100644
--- a/src/obj/NiPixelData.cpp
+++ b/src/obj/NiPixelData.cpp
@@ -26,7 +26,7 @@ string NiPixelData::asString( bool verbose ) const {
 	NI_PIXEL_DATA_STRING
 }
 
-void NiPixelData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPixelData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PIXEL_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiPlanarCollider.cpp b/src/obj/NiPlanarCollider.cpp
index f36292eb09f47eb7b56af76c6ad443dad586ef49..f699eb9537aa6f63015a5a1d550c299f7b429fbb 100644
--- a/src/obj/NiPlanarCollider.cpp
+++ b/src/obj/NiPlanarCollider.cpp
@@ -23,7 +23,7 @@ string NiPlanarCollider::asString( bool verbose ) const {
 	NI_PLANAR_COLLIDER_STRING
 }
 
-void NiPlanarCollider::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPlanarCollider::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PLANAR_COLLIDER_FIXLINKS
 }
 
diff --git a/src/obj/NiPoint3Interpolator.cpp b/src/obj/NiPoint3Interpolator.cpp
index 6a4c3eeb0cfcde16f0c3f39cce412b82fd58945e..5f9a339de6645c57c610e5fd2aaf63f6717b96c8 100644
--- a/src/obj/NiPoint3Interpolator.cpp
+++ b/src/obj/NiPoint3Interpolator.cpp
@@ -24,7 +24,7 @@ string NiPoint3Interpolator::asString( bool verbose ) const {
 	NI_POINT3_INTERPOLATOR_STRING
 }
 
-void NiPoint3Interpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPoint3Interpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_POINT3_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiPointLight.cpp b/src/obj/NiPointLight.cpp
index 7cd51183c45b0749526831f292a24b8f5bc1947d..6cf50f0f979960bfd77561a5cc83dd8af49c1717 100644
--- a/src/obj/NiPointLight.cpp
+++ b/src/obj/NiPointLight.cpp
@@ -23,7 +23,7 @@ string NiPointLight::asString( bool verbose ) const {
 	NI_POINT_LIGHT_STRING
 }
 
-void NiPointLight::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPointLight::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_POINT_LIGHT_FIXLINKS
 }
 
diff --git a/src/obj/NiPosData.cpp b/src/obj/NiPosData.cpp
index 9bc3ea9b2e65e51210363a10e4b77c5b75014ef7..ce1fc531e5ca229ff9b2d0915886d42695ffc7db 100644
--- a/src/obj/NiPosData.cpp
+++ b/src/obj/NiPosData.cpp
@@ -24,7 +24,7 @@ string NiPosData::asString( bool verbose ) const {
 	NI_POS_DATA_STRING
 }
 
-void NiPosData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPosData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_POS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiProperty.cpp b/src/obj/NiProperty.cpp
index d2da921bfad5f4074ee531008e3fb1fdb98163c7..7a1cace6f7cfc1ed648603e58adf15c6a1ee00c6 100644
--- a/src/obj/NiProperty.cpp
+++ b/src/obj/NiProperty.cpp
@@ -23,7 +23,7 @@ string NiProperty::asString( bool verbose ) const {
 	NI_PROPERTY_STRING
 }
 
-void NiProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiRangeLODData.cpp b/src/obj/NiRangeLODData.cpp
index 1adf25079bf040258697b51ed542a681c4100fb3..cbffda0ca1f5c971967aa5f2b1aaa73e3d2dbe87 100644
--- a/src/obj/NiRangeLODData.cpp
+++ b/src/obj/NiRangeLODData.cpp
@@ -24,7 +24,7 @@ string NiRangeLODData::asString( bool verbose ) const {
 	NI_RANGE_L_O_D_DATA_STRING
 }
 
-void NiRangeLODData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRangeLODData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_RANGE_L_O_D_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiRotatingParticles.cpp b/src/obj/NiRotatingParticles.cpp
index a67771fdffd5854d0d4ffe917530d75563c5b4c0..ccf0a689417db33be4c36f64132841a3ec3b94f2 100644
--- a/src/obj/NiRotatingParticles.cpp
+++ b/src/obj/NiRotatingParticles.cpp
@@ -23,7 +23,7 @@ string NiRotatingParticles::asString( bool verbose ) const {
 	NI_ROTATING_PARTICLES_STRING
 }
 
-void NiRotatingParticles::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRotatingParticles::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_ROTATING_PARTICLES_FIXLINKS
 }
 
diff --git a/src/obj/NiRotatingParticlesData.cpp b/src/obj/NiRotatingParticlesData.cpp
index 9e2f4319fe4f2f72ae477a57f5613c99ed8d1b4b..8659ece2c046cae87373043298fb1d2c5b4f695a 100644
--- a/src/obj/NiRotatingParticlesData.cpp
+++ b/src/obj/NiRotatingParticlesData.cpp
@@ -23,7 +23,7 @@ string NiRotatingParticlesData::asString( bool verbose ) const {
 	NI_ROTATING_PARTICLES_DATA_STRING
 }
 
-void NiRotatingParticlesData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiRotatingParticlesData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_ROTATING_PARTICLES_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiScreenLODData.cpp b/src/obj/NiScreenLODData.cpp
index 7c777080eb431ea6890bc1412f901e512edfae4f..054021c265fef53ecb076091c5503187634382c5 100644
--- a/src/obj/NiScreenLODData.cpp
+++ b/src/obj/NiScreenLODData.cpp
@@ -23,7 +23,7 @@ string NiScreenLODData::asString( bool verbose ) const {
 	NI_SCREEN_L_O_D_DATA_STRING
 }
 
-void NiScreenLODData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiScreenLODData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SCREEN_L_O_D_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiSequenceStreamHelper.cpp b/src/obj/NiSequenceStreamHelper.cpp
index 0bfb79f6fdb4355d370162c89aa3df25c50ef9a5..24ba3c11c14b829222a86f048020d56c3206bb5b 100644
--- a/src/obj/NiSequenceStreamHelper.cpp
+++ b/src/obj/NiSequenceStreamHelper.cpp
@@ -23,7 +23,7 @@ string NiSequenceStreamHelper::asString( bool verbose ) const {
 	NI_SEQUENCE_STREAM_HELPER_STRING
 }
 
-void NiSequenceStreamHelper::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSequenceStreamHelper::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SEQUENCE_STREAM_HELPER_FIXLINKS
 }
 
diff --git a/src/obj/NiShadeProperty.cpp b/src/obj/NiShadeProperty.cpp
index 797faf4cc86adce2de3ba660f6788ace60cac9b2..e3146341bf93ed611c6b0b824f31aa07fb7ffd03 100644
--- a/src/obj/NiShadeProperty.cpp
+++ b/src/obj/NiShadeProperty.cpp
@@ -23,7 +23,7 @@ string NiShadeProperty::asString( bool verbose ) const {
 	NI_SHADE_PROPERTY_STRING
 }
 
-void NiShadeProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiShadeProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SHADE_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiSingleInterpolatorController.cpp b/src/obj/NiSingleInterpolatorController.cpp
index e87c0be4da5e9a60f80f72b83eb10a600bc8255b..e88c652154bbe2d219b4d71be1d1fabedf537954 100644
--- a/src/obj/NiSingleInterpolatorController.cpp
+++ b/src/obj/NiSingleInterpolatorController.cpp
@@ -24,7 +24,7 @@ string NiSingleInterpolatorController::asString( bool verbose ) const {
 	NI_SINGLE_INTERPOLATOR_CONTROLLER_STRING
 }
 
-void NiSingleInterpolatorController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSingleInterpolatorController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SINGLE_INTERPOLATOR_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp
index 8bbdd96203f7b8fa93c091e1a2caf21a35cdb8d5..aad3cd244891c519973ccad8eaf02b1f7059fe81 100644
--- a/src/obj/NiSkinData.cpp
+++ b/src/obj/NiSkinData.cpp
@@ -29,7 +29,7 @@ string NiSkinData::asString( bool verbose ) const {
 	NI_SKIN_DATA_STRING
 }
 
-void NiSkinData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SKIN_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiSkinInstance.cpp b/src/obj/NiSkinInstance.cpp
index 282ad2521049a52962375e5d8c8f8f14e1792d0f..99b157336d1384394a76ee4cde989fba817691ef 100644
--- a/src/obj/NiSkinInstance.cpp
+++ b/src/obj/NiSkinInstance.cpp
@@ -63,7 +63,7 @@ string NiSkinInstance::asString( bool verbose ) const {
 	NI_SKIN_INSTANCE_STRING
 }
 
-void NiSkinInstance::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinInstance::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SKIN_INSTANCE_FIXLINKS
 
 	//Inform newly fixed skeleton root of attachment
diff --git a/src/obj/NiSkinPartition.cpp b/src/obj/NiSkinPartition.cpp
index b303faf28cac200f9b3ec7d5257a9412647da653..bd1c73991c2231caec196534eb70141fb7d7f159 100644
--- a/src/obj/NiSkinPartition.cpp
+++ b/src/obj/NiSkinPartition.cpp
@@ -43,7 +43,7 @@ string NiSkinPartition::asString( bool verbose ) const {
 	NI_SKIN_PARTITION_STRING
 }
 
-void NiSkinPartition::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinPartition::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SKIN_PARTITION_FIXLINKS
 }
 
diff --git a/src/obj/NiSourceTexture.cpp b/src/obj/NiSourceTexture.cpp
index b817950276a0651a05f981696e8b37279540b6ee..db0d86793395bf3ec97e9ef0dfd55af7e226b0cb 100644
--- a/src/obj/NiSourceTexture.cpp
+++ b/src/obj/NiSourceTexture.cpp
@@ -25,7 +25,7 @@ string NiSourceTexture::asString( bool verbose ) const {
 	NI_SOURCE_TEXTURE_STRING
 }
 
-void NiSourceTexture::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSourceTexture::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SOURCE_TEXTURE_FIXLINKS
 }
 
diff --git a/src/obj/NiSpecularProperty.cpp b/src/obj/NiSpecularProperty.cpp
index 23f1bf93d4ec84c0a9973a1b368977964c73c144..53611d364839daf589b1c741fff8da6a9e24674f 100644
--- a/src/obj/NiSpecularProperty.cpp
+++ b/src/obj/NiSpecularProperty.cpp
@@ -23,7 +23,7 @@ string NiSpecularProperty::asString( bool verbose ) const {
 	NI_SPECULAR_PROPERTY_STRING
 }
 
-void NiSpecularProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSpecularProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SPECULAR_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiSphericalCollider.cpp b/src/obj/NiSphericalCollider.cpp
index e29db3fdefc91c28a47ba6b6a837a510c785d96c..cc8b72c2e450dd353ed1c104a1239b49ebe99bfa 100644
--- a/src/obj/NiSphericalCollider.cpp
+++ b/src/obj/NiSphericalCollider.cpp
@@ -23,7 +23,7 @@ string NiSphericalCollider::asString( bool verbose ) const {
 	NI_SPHERICAL_COLLIDER_STRING
 }
 
-void NiSphericalCollider::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSphericalCollider::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SPHERICAL_COLLIDER_FIXLINKS
 }
 
diff --git a/src/obj/NiSpotLight.cpp b/src/obj/NiSpotLight.cpp
index 4e11bbae9c6c7c1e93d34e1333ef5612eb114b46..c3bcc369e92d7fd4db7b01ce7867cad6d4360abb 100644
--- a/src/obj/NiSpotLight.cpp
+++ b/src/obj/NiSpotLight.cpp
@@ -23,7 +23,7 @@ string NiSpotLight::asString( bool verbose ) const {
 	NI_SPOT_LIGHT_STRING
 }
 
-void NiSpotLight::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSpotLight::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_SPOT_LIGHT_FIXLINKS
 }
 
diff --git a/src/obj/NiStencilProperty.cpp b/src/obj/NiStencilProperty.cpp
index a9b2061115c74d210745289d039625bdcdfeac0a..ed93e9380a8bb3f491bb3f42331928ea4cd93f1b 100644
--- a/src/obj/NiStencilProperty.cpp
+++ b/src/obj/NiStencilProperty.cpp
@@ -23,7 +23,7 @@ string NiStencilProperty::asString( bool verbose ) const {
 	NI_STENCIL_PROPERTY_STRING
 }
 
-void NiStencilProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStencilProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_STENCIL_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiStringExtraData.cpp b/src/obj/NiStringExtraData.cpp
index ddefbe2056bdae8d7d247f733958418ed5c846c9..056d02af520563a39e1182a998c0002fbd9fe8cd 100644
--- a/src/obj/NiStringExtraData.cpp
+++ b/src/obj/NiStringExtraData.cpp
@@ -23,7 +23,7 @@ string NiStringExtraData::asString( bool verbose ) const {
 	NI_STRING_EXTRA_DATA_STRING
 }
 
-void NiStringExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_STRING_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiStringPalette.cpp b/src/obj/NiStringPalette.cpp
index 52a833d161734bad2f9fcf7f86ea04dc7baeef71..8f9f4b9298c83a3666923da8e4e357662b2e7bd9 100644
--- a/src/obj/NiStringPalette.cpp
+++ b/src/obj/NiStringPalette.cpp
@@ -24,7 +24,7 @@ string NiStringPalette::asString( bool verbose ) const {
 	NI_STRING_PALETTE_STRING
 }
 
-void NiStringPalette::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringPalette::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_STRING_PALETTE_FIXLINKS
 }
 
diff --git a/src/obj/NiStringsExtraData.cpp b/src/obj/NiStringsExtraData.cpp
index a0ae5fd5cdd271853a0b2f30617bb725c4100078..8ca9d6d33e53f53382977f798d16a07ac14881c3 100644
--- a/src/obj/NiStringsExtraData.cpp
+++ b/src/obj/NiStringsExtraData.cpp
@@ -23,7 +23,7 @@ string NiStringsExtraData::asString( bool verbose ) const {
 	NI_STRINGS_EXTRA_DATA_STRING
 }
 
-void NiStringsExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiStringsExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_STRINGS_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiTextKeyExtraData.cpp b/src/obj/NiTextKeyExtraData.cpp
index 7eecc0e43b26cc758c31ae03e5989c1bbfded951..4447372ae2df12be697e676cda993c68ff592086 100644
--- a/src/obj/NiTextKeyExtraData.cpp
+++ b/src/obj/NiTextKeyExtraData.cpp
@@ -23,7 +23,7 @@ string NiTextKeyExtraData::asString( bool verbose ) const {
 	NI_TEXT_KEY_EXTRA_DATA_STRING
 }
 
-void NiTextKeyExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextKeyExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TEXT_KEY_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiTextureEffect.cpp b/src/obj/NiTextureEffect.cpp
index 0644dee7c1b081d097ef85a98f23db2aaa9fc7f8..ebbd6c55c9e5da80402e3866440e5a58ca7c5d1b 100644
--- a/src/obj/NiTextureEffect.cpp
+++ b/src/obj/NiTextureEffect.cpp
@@ -24,7 +24,7 @@ string NiTextureEffect::asString( bool verbose ) const {
 	NI_TEXTURE_EFFECT_STRING
 }
 
-void NiTextureEffect::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureEffect::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TEXTURE_EFFECT_FIXLINKS
 }
 
diff --git a/src/obj/NiTextureTransformController.cpp b/src/obj/NiTextureTransformController.cpp
index d2cf04a61ffec8feca2332ae116b990144803abe..87e496535aae511f3c8dda9a756c49587f6fa577 100644
--- a/src/obj/NiTextureTransformController.cpp
+++ b/src/obj/NiTextureTransformController.cpp
@@ -24,7 +24,7 @@ string NiTextureTransformController::asString( bool verbose ) const {
 	NI_TEXTURE_TRANSFORM_CONTROLLER_STRING
 }
 
-void NiTextureTransformController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureTransformController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TEXTURE_TRANSFORM_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiTexturingProperty.cpp b/src/obj/NiTexturingProperty.cpp
index 7cc875a31dc88a37a10aaf665958921a3153c277..feb3a9c6b83bd5439732c07de7ec4d7455df1a61 100644
--- a/src/obj/NiTexturingProperty.cpp
+++ b/src/obj/NiTexturingProperty.cpp
@@ -25,7 +25,7 @@ string NiTexturingProperty::asString( bool verbose ) const {
 	NI_TEXTURING_PROPERTY_STRING
 }
 
-void NiTexturingProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTexturingProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TEXTURING_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiTimeController.cpp b/src/obj/NiTimeController.cpp
index bd76e052a72a1d87140f99a02e24f12abf9e0241..1e7e7b79254272ea0f66b36d668231e850c91a1d 100644
--- a/src/obj/NiTimeController.cpp
+++ b/src/obj/NiTimeController.cpp
@@ -24,7 +24,7 @@ string NiTimeController::asString( bool verbose ) const {
 	NI_TIME_CONTROLLER_STRING
 }
 
-void NiTimeController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTimeController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TIME_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiTransformController.cpp b/src/obj/NiTransformController.cpp
index 090a098c003cbc07d21ac22f1df3eb094187540b..0201f025410e7d8d3cfb4788bbaa8ce4844ff8a1 100644
--- a/src/obj/NiTransformController.cpp
+++ b/src/obj/NiTransformController.cpp
@@ -23,7 +23,7 @@ string NiTransformController::asString( bool verbose ) const {
 	NI_TRANSFORM_CONTROLLER_STRING
 }
 
-void NiTransformController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRANSFORM_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiTransformData.cpp b/src/obj/NiTransformData.cpp
index 7da3fb3c2c9f038a473351748aab94d86a68e885..b4e33ce5cb62c320dbf78d22cba9f3fa8b2b4ddc 100644
--- a/src/obj/NiTransformData.cpp
+++ b/src/obj/NiTransformData.cpp
@@ -23,7 +23,7 @@ string NiTransformData::asString( bool verbose ) const {
 	NI_TRANSFORM_DATA_STRING
 }
 
-void NiTransformData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRANSFORM_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiTransformInterpolator.cpp b/src/obj/NiTransformInterpolator.cpp
index 9c6b388bdd233b5843ea154d72112d5224e5ca32..b42a809c1d6ac25977cd933ab32ddaa3f071b106 100644
--- a/src/obj/NiTransformInterpolator.cpp
+++ b/src/obj/NiTransformInterpolator.cpp
@@ -24,7 +24,7 @@ string NiTransformInterpolator::asString( bool verbose ) const {
 	NI_TRANSFORM_INTERPOLATOR_STRING
 }
 
-void NiTransformInterpolator::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformInterpolator::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRANSFORM_INTERPOLATOR_FIXLINKS
 }
 
diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp
index 6cbc30a9d92f5d1f349f6bf9aab4aa93306ce301..34c7a9e012a9e89fc9ae1f042be1d3a131c62fcd 100644
--- a/src/obj/NiTriBasedGeom.cpp
+++ b/src/obj/NiTriBasedGeom.cpp
@@ -30,7 +30,7 @@ string NiTriBasedGeom::asString( bool verbose ) const {
 	NI_TRI_BASED_GEOM_STRING
 }
 
-void NiTriBasedGeom::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriBasedGeom::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_BASED_GEOM_FIXLINKS
 }
 
diff --git a/src/obj/NiTriBasedGeomData.cpp b/src/obj/NiTriBasedGeomData.cpp
index ebcd114b4a48adc25496ead8c4454ed4a9e1f07f..1c44b0ef6741eab8cf0ee92164fcceabe076384b 100644
--- a/src/obj/NiTriBasedGeomData.cpp
+++ b/src/obj/NiTriBasedGeomData.cpp
@@ -24,7 +24,7 @@ string NiTriBasedGeomData::asString( bool verbose ) const {
 	NI_TRI_BASED_GEOM_DATA_STRING
 }
 
-void NiTriBasedGeomData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriBasedGeomData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_BASED_GEOM_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiTriShape.cpp b/src/obj/NiTriShape.cpp
index 2210956fd60ea6e098869e5375aca5c2511a8360..eacc247dbb00497aa7a251821e21a6641a5cb41d 100644
--- a/src/obj/NiTriShape.cpp
+++ b/src/obj/NiTriShape.cpp
@@ -23,7 +23,7 @@ string NiTriShape::asString( bool verbose ) const {
 	NI_TRI_SHAPE_STRING
 }
 
-void NiTriShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/NiTriShapeData.cpp b/src/obj/NiTriShapeData.cpp
index 4da709e637ccb95af293eedcf339e19f500a86a4..c93f469142ee8bda0785b18007235292b01592a4 100644
--- a/src/obj/NiTriShapeData.cpp
+++ b/src/obj/NiTriShapeData.cpp
@@ -24,7 +24,7 @@ string NiTriShapeData::asString( bool verbose ) const {
 	NI_TRI_SHAPE_DATA_STRING
 }
 
-void NiTriShapeData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriShapeData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_SHAPE_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiTriStrips.cpp b/src/obj/NiTriStrips.cpp
index 4a248b8d25535735c7fd80b0bd3a7839574c4583..4739e47f5e7fe9463441d60e8e496464d40cbbdb 100644
--- a/src/obj/NiTriStrips.cpp
+++ b/src/obj/NiTriStrips.cpp
@@ -23,7 +23,7 @@ string NiTriStrips::asString( bool verbose ) const {
 	NI_TRI_STRIPS_STRING
 }
 
-void NiTriStrips::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriStrips::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_STRIPS_FIXLINKS
 }
 
diff --git a/src/obj/NiTriStripsData.cpp b/src/obj/NiTriStripsData.cpp
index f8dc1289a224166be7dbd6dbb2084a03f55df961..def72f7e1e0bb1818e60f26099fed9d51d06592d 100644
--- a/src/obj/NiTriStripsData.cpp
+++ b/src/obj/NiTriStripsData.cpp
@@ -32,7 +32,7 @@ string NiTriStripsData::asString( bool verbose ) const {
 	NI_TRI_STRIPS_DATA_STRING
 }
 
-void NiTriStripsData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTriStripsData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_TRI_STRIPS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiUVController.cpp b/src/obj/NiUVController.cpp
index e2219b6fd20cb5fce6ed063dd5f9916939c2e432..7bbcc90bb2e29176785fc6caed8612dd528fdd31 100644
--- a/src/obj/NiUVController.cpp
+++ b/src/obj/NiUVController.cpp
@@ -24,7 +24,7 @@ string NiUVController::asString( bool verbose ) const {
 	NI_U_V_CONTROLLER_STRING
 }
 
-void NiUVController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_U_V_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiUVData.cpp b/src/obj/NiUVData.cpp
index bcc144f48896416b202f00e08e0606b319581782..7231ac00db845beec9cb1d8ab1761f1f575db425 100644
--- a/src/obj/NiUVData.cpp
+++ b/src/obj/NiUVData.cpp
@@ -24,7 +24,7 @@ string NiUVData::asString( bool verbose ) const {
 	NI_U_V_DATA_STRING
 }
 
-void NiUVData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_U_V_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiVectorExtraData.cpp b/src/obj/NiVectorExtraData.cpp
index ba8f3a234ca2367d8155fb4325c15e0a9e9f6b4b..8fd071266d1415bbe19f51f47304d5e084132943 100644
--- a/src/obj/NiVectorExtraData.cpp
+++ b/src/obj/NiVectorExtraData.cpp
@@ -23,7 +23,7 @@ string NiVectorExtraData::asString( bool verbose ) const {
 	NI_VECTOR_EXTRA_DATA_STRING
 }
 
-void NiVectorExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVectorExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_VECTOR_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiVertWeightsExtraData.cpp b/src/obj/NiVertWeightsExtraData.cpp
index 6ed76fa2ba08abb7157a6ec4673510ddf76e40a6..712c7ff41f72b1c3d552e24b780673dcec05935f 100644
--- a/src/obj/NiVertWeightsExtraData.cpp
+++ b/src/obj/NiVertWeightsExtraData.cpp
@@ -23,7 +23,7 @@ string NiVertWeightsExtraData::asString( bool verbose ) const {
 	NI_VERT_WEIGHTS_EXTRA_DATA_STRING
 }
 
-void NiVertWeightsExtraData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVertWeightsExtraData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_VERT_WEIGHTS_EXTRA_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiVertexColorProperty.cpp b/src/obj/NiVertexColorProperty.cpp
index 84588863373e38cfe5c846fffb19915a6a6e36b5..7e86e5bbf067585fb874dcddb43387c22146e3e3 100644
--- a/src/obj/NiVertexColorProperty.cpp
+++ b/src/obj/NiVertexColorProperty.cpp
@@ -23,7 +23,7 @@ string NiVertexColorProperty::asString( bool verbose ) const {
 	NI_VERTEX_COLOR_PROPERTY_STRING
 }
 
-void NiVertexColorProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVertexColorProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_VERTEX_COLOR_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiVisController.cpp b/src/obj/NiVisController.cpp
index 598bbcd49c3738d8fee25c6e0f1a488868ffc782..13816e0ccc117c752f75b5820026bc0fd544c578 100644
--- a/src/obj/NiVisController.cpp
+++ b/src/obj/NiVisController.cpp
@@ -24,7 +24,7 @@ string NiVisController::asString( bool verbose ) const {
 	NI_VIS_CONTROLLER_STRING
 }
 
-void NiVisController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_VIS_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/NiVisData.cpp b/src/obj/NiVisData.cpp
index 12e83ea5e326297f5ed4b1319009fc12002232d4..0f133f48d22d6ada3fde61e679a4d103c042da47 100644
--- a/src/obj/NiVisData.cpp
+++ b/src/obj/NiVisData.cpp
@@ -23,7 +23,7 @@ string NiVisData::asString( bool verbose ) const {
 	NI_VIS_DATA_STRING
 }
 
-void NiVisData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_VIS_DATA_FIXLINKS
 }
 
diff --git a/src/obj/NiWireframeProperty.cpp b/src/obj/NiWireframeProperty.cpp
index 2bbae782df9866d77ed22664e663a598dbeb4b6d..b49663555f0096e9098072864c7dffeb7c415fa7 100644
--- a/src/obj/NiWireframeProperty.cpp
+++ b/src/obj/NiWireframeProperty.cpp
@@ -23,7 +23,7 @@ string NiWireframeProperty::asString( bool verbose ) const {
 	NI_WIREFRAME_PROPERTY_STRING
 }
 
-void NiWireframeProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiWireframeProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_WIREFRAME_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/NiZBufferProperty.cpp b/src/obj/NiZBufferProperty.cpp
index af1a0a0cca269ad131a773e107cc284d9253ce50..0e6b5ffff4a26a0a9ece80dcc97703c71d5e4fe4 100644
--- a/src/obj/NiZBufferProperty.cpp
+++ b/src/obj/NiZBufferProperty.cpp
@@ -23,7 +23,7 @@ string NiZBufferProperty::asString( bool verbose ) const {
 	NI_Z_BUFFER_PROPERTY_STRING
 }
 
-void NiZBufferProperty::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiZBufferProperty::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NI_Z_BUFFER_PROPERTY_FIXLINKS
 }
 
diff --git a/src/obj/RootCollisionNode.cpp b/src/obj/RootCollisionNode.cpp
index 97cfea29f5a0f438abfeeef7e3040e20e7f4ff06..cb558a92f072fda52245dc162cd5291e67313b43 100644
--- a/src/obj/RootCollisionNode.cpp
+++ b/src/obj/RootCollisionNode.cpp
@@ -23,7 +23,7 @@ string RootCollisionNode::asString( bool verbose ) const {
 	ROOT_COLLISION_NODE_STRING
 }
 
-void RootCollisionNode::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void RootCollisionNode::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	ROOT_COLLISION_NODE_FIXLINKS
 }
 
diff --git a/src/obj/bhkBlendCollisionObject.cpp b/src/obj/bhkBlendCollisionObject.cpp
index 6657e2c3f7ad614bf51e32868d957edcb81b9073..f117fd80e672a13b5488a70657c1c38d2babcf30 100644
--- a/src/obj/bhkBlendCollisionObject.cpp
+++ b/src/obj/bhkBlendCollisionObject.cpp
@@ -23,7 +23,7 @@ string bhkBlendCollisionObject::asString( bool verbose ) const {
 	BHK_BLEND_COLLISION_OBJECT_STRING
 }
 
-void bhkBlendCollisionObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBlendCollisionObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_BLEND_COLLISION_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/bhkBlendController.cpp b/src/obj/bhkBlendController.cpp
index 729c097b1e464fc5e46d41b9001f37281f2028e4..9edbf53d0d83b65492195780a772f15ebafffa42 100644
--- a/src/obj/bhkBlendController.cpp
+++ b/src/obj/bhkBlendController.cpp
@@ -23,7 +23,7 @@ string bhkBlendController::asString( bool verbose ) const {
 	BHK_BLEND_CONTROLLER_STRING
 }
 
-void bhkBlendController::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBlendController::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_BLEND_CONTROLLER_FIXLINKS
 }
 
diff --git a/src/obj/bhkBoxShape.cpp b/src/obj/bhkBoxShape.cpp
index 1b63072a69287d0b13c2ef2bf5823057e7f056c3..5f9662fa54c5b3a8f6571524d8d7eff134dc2e41 100644
--- a/src/obj/bhkBoxShape.cpp
+++ b/src/obj/bhkBoxShape.cpp
@@ -23,7 +23,7 @@ string bhkBoxShape::asString( bool verbose ) const {
 	BHK_BOX_SHAPE_STRING
 }
 
-void bhkBoxShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkBoxShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_BOX_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkCapsuleShape.cpp b/src/obj/bhkCapsuleShape.cpp
index 7939a8c89b9a1169b50b459d75ec42e471fd741d..044da8458d8f0a7d8e90e1cacddc5a08d7bae385 100644
--- a/src/obj/bhkCapsuleShape.cpp
+++ b/src/obj/bhkCapsuleShape.cpp
@@ -23,7 +23,7 @@ string bhkCapsuleShape::asString( bool verbose ) const {
 	BHK_CAPSULE_SHAPE_STRING
 }
 
-void bhkCapsuleShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkCapsuleShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_CAPSULE_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkCollisionObject.cpp b/src/obj/bhkCollisionObject.cpp
index dcb89a538f8ccd7ee57d1dff5f44380010907e79..ece70244d6de74321a01c0d0dc7348fa3fa7aed4 100644
--- a/src/obj/bhkCollisionObject.cpp
+++ b/src/obj/bhkCollisionObject.cpp
@@ -23,7 +23,7 @@ string bhkCollisionObject::asString( bool verbose ) const {
 	BHK_COLLISION_OBJECT_STRING
 }
 
-void bhkCollisionObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkCollisionObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_COLLISION_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/bhkConvexShape.cpp b/src/obj/bhkConvexShape.cpp
index 9d3665d4c68b4ce92e39d46302d38e60b02c2993..d821141709467eb55a0c5109036c5718733912bc 100644
--- a/src/obj/bhkConvexShape.cpp
+++ b/src/obj/bhkConvexShape.cpp
@@ -23,7 +23,7 @@ string bhkConvexShape::asString( bool verbose ) const {
 	BHK_CONVEX_SHAPE_STRING
 }
 
-void bhkConvexShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_CONVEX_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkConvexTransformShape.cpp b/src/obj/bhkConvexTransformShape.cpp
index 895b9ceeb73709e1e33398fdea0e76afe0374387..fa79033649ecc1cb9a83e0af05ce4a3fc6b0825c 100644
--- a/src/obj/bhkConvexTransformShape.cpp
+++ b/src/obj/bhkConvexTransformShape.cpp
@@ -23,7 +23,7 @@ string bhkConvexTransformShape::asString( bool verbose ) const {
 	BHK_CONVEX_TRANSFORM_SHAPE_STRING
 }
 
-void bhkConvexTransformShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexTransformShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_CONVEX_TRANSFORM_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkConvexVerticesShape.cpp b/src/obj/bhkConvexVerticesShape.cpp
index db0390264597e5f800a548faee39fc2a8521a400..93836ba835b0a90b8d4e1cacd1de367d5131bf7d 100644
--- a/src/obj/bhkConvexVerticesShape.cpp
+++ b/src/obj/bhkConvexVerticesShape.cpp
@@ -23,7 +23,7 @@ string bhkConvexVerticesShape::asString( bool verbose ) const {
 	BHK_CONVEX_VERTICES_SHAPE_STRING
 }
 
-void bhkConvexVerticesShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkConvexVerticesShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_CONVEX_VERTICES_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkEntity.cpp b/src/obj/bhkEntity.cpp
index a6d859c1b2d47eaa686f455505ef48606192ef2d..6e8cf3bd33cf9fcb4c3e0b98365abc6a150b7309 100644
--- a/src/obj/bhkEntity.cpp
+++ b/src/obj/bhkEntity.cpp
@@ -24,7 +24,7 @@ string bhkEntity::asString( bool verbose ) const {
 	BHK_ENTITY_STRING
 }
 
-void bhkEntity::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkEntity::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_ENTITY_FIXLINKS
 }
 
diff --git a/src/obj/bhkHingeConstraint.cpp b/src/obj/bhkHingeConstraint.cpp
index 2a6cf72f0af6d0f36f1f266e9cfdf1d921686d37..62eaf61a4c71f18c0fe2420d885e54b4f80c6642 100644
--- a/src/obj/bhkHingeConstraint.cpp
+++ b/src/obj/bhkHingeConstraint.cpp
@@ -23,7 +23,7 @@ string bhkHingeConstraint::asString( bool verbose ) const {
 	BHK_HINGE_CONSTRAINT_STRING
 }
 
-void bhkHingeConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkHingeConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_HINGE_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkLimitedHingeConstraint.cpp b/src/obj/bhkLimitedHingeConstraint.cpp
index d815a8ae613b45668965780cbc0972630f870b1a..d15a620e007d450030fd9a3099603109a97c6c74 100644
--- a/src/obj/bhkLimitedHingeConstraint.cpp
+++ b/src/obj/bhkLimitedHingeConstraint.cpp
@@ -24,7 +24,7 @@ string bhkLimitedHingeConstraint::asString( bool verbose ) const {
 	BHK_LIMITED_HINGE_CONSTRAINT_STRING
 }
 
-void bhkLimitedHingeConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkLimitedHingeConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_LIMITED_HINGE_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkListShape.cpp b/src/obj/bhkListShape.cpp
index f21dd12b4d3a49a3e5083926a1f2ff2c79c3858d..0165a56944b5d681884840c7f6bb5d3ba3632e0c 100644
--- a/src/obj/bhkListShape.cpp
+++ b/src/obj/bhkListShape.cpp
@@ -24,7 +24,7 @@ string bhkListShape::asString( bool verbose ) const {
 	BHK_LIST_SHAPE_STRING
 }
 
-void bhkListShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkListShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_LIST_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkMalleableConstraint.cpp b/src/obj/bhkMalleableConstraint.cpp
index 33f0df47b2266a3921688406ce9130b306224f91..1a146837865f1d2d256ea680a1fc1177d28b2587 100644
--- a/src/obj/bhkMalleableConstraint.cpp
+++ b/src/obj/bhkMalleableConstraint.cpp
@@ -26,7 +26,7 @@ string bhkMalleableConstraint::asString( bool verbose ) const {
 	BHK_MALLEABLE_CONSTRAINT_STRING
 }
 
-void bhkMalleableConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMalleableConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_MALLEABLE_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkMoppBvTreeShape.cpp b/src/obj/bhkMoppBvTreeShape.cpp
index d2ad26d30fd2caa8d04b6278ac3deb1206b376ee..95555c674adcbccb5db5d546ad93a2f07e6e2702 100644
--- a/src/obj/bhkMoppBvTreeShape.cpp
+++ b/src/obj/bhkMoppBvTreeShape.cpp
@@ -24,7 +24,7 @@ string bhkMoppBvTreeShape::asString( bool verbose ) const {
 	BHK_MOPP_BV_TREE_SHAPE_STRING
 }
 
-void bhkMoppBvTreeShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMoppBvTreeShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_MOPP_BV_TREE_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkMultiSphereShape.cpp b/src/obj/bhkMultiSphereShape.cpp
index 754ed15515538fede21b564711549fac18a19513..c326402d2d2495491d2af63612c27b769bfdd270 100644
--- a/src/obj/bhkMultiSphereShape.cpp
+++ b/src/obj/bhkMultiSphereShape.cpp
@@ -24,7 +24,7 @@ string bhkMultiSphereShape::asString( bool verbose ) const {
 	BHK_MULTI_SPHERE_SHAPE_STRING
 }
 
-void bhkMultiSphereShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMultiSphereShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_MULTI_SPHERE_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkNiTriStripsShape.cpp b/src/obj/bhkNiTriStripsShape.cpp
index 763b96525cab4232847666aff7f68c1d27ce77a5..422d38df8cd65cbb9b218a27bf5a186dad8ee405 100644
--- a/src/obj/bhkNiTriStripsShape.cpp
+++ b/src/obj/bhkNiTriStripsShape.cpp
@@ -24,7 +24,7 @@ string bhkNiTriStripsShape::asString( bool verbose ) const {
 	BHK_NI_TRI_STRIPS_SHAPE_STRING
 }
 
-void bhkNiTriStripsShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkNiTriStripsShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_NI_TRI_STRIPS_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkPackedNiTriStripsShape.cpp b/src/obj/bhkPackedNiTriStripsShape.cpp
index d56bba086fa67d0a3d36eaaab99d5012571b81c7..a85ae3ddfc6689b5548ca4300c62debface558bd 100644
--- a/src/obj/bhkPackedNiTriStripsShape.cpp
+++ b/src/obj/bhkPackedNiTriStripsShape.cpp
@@ -24,7 +24,7 @@ string bhkPackedNiTriStripsShape::asString( bool verbose ) const {
 	BHK_PACKED_NI_TRI_STRIPS_SHAPE_STRING
 }
 
-void bhkPackedNiTriStripsShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPackedNiTriStripsShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_PACKED_NI_TRI_STRIPS_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkPrismaticConstraint.cpp b/src/obj/bhkPrismaticConstraint.cpp
index 15fc5e3af4b60c4d5c48f763ca7f43f9b715f13b..d06a99b5a3da1bb8784aff7fac845872ca663071 100644
--- a/src/obj/bhkPrismaticConstraint.cpp
+++ b/src/obj/bhkPrismaticConstraint.cpp
@@ -23,7 +23,7 @@ string bhkPrismaticConstraint::asString( bool verbose ) const {
 	BHK_PRISMATIC_CONSTRAINT_STRING
 }
 
-void bhkPrismaticConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPrismaticConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_PRISMATIC_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkRagdollConstraint.cpp b/src/obj/bhkRagdollConstraint.cpp
index 53280ea735d5aa7fd2421da5a5ac60dfd4e7fbb3..40a1327520ee97f44bf77e14f4ef1a2d69edbcc5 100644
--- a/src/obj/bhkRagdollConstraint.cpp
+++ b/src/obj/bhkRagdollConstraint.cpp
@@ -23,7 +23,7 @@ string bhkRagdollConstraint::asString( bool verbose ) const {
 	BHK_RAGDOLL_CONSTRAINT_STRING
 }
 
-void bhkRagdollConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRagdollConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_RAGDOLL_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkRefObject.cpp b/src/obj/bhkRefObject.cpp
index 905a212d985072b479308a940773505eb5c056b7..f6d249e14d200ca58c616ee29c436c49e7317a03 100644
--- a/src/obj/bhkRefObject.cpp
+++ b/src/obj/bhkRefObject.cpp
@@ -23,7 +23,7 @@ string bhkRefObject::asString( bool verbose ) const {
 	BHK_REF_OBJECT_STRING
 }
 
-void bhkRefObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRefObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_REF_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/bhkRigidBody.cpp b/src/obj/bhkRigidBody.cpp
index db553c20de3553b42a4b64afc432c2f43e29e613..5c231af807218b65a8371d1389debd8afb7a6ab1 100644
--- a/src/obj/bhkRigidBody.cpp
+++ b/src/obj/bhkRigidBody.cpp
@@ -25,7 +25,7 @@ string bhkRigidBody::asString( bool verbose ) const {
 	BHK_RIGID_BODY_STRING
 }
 
-void bhkRigidBody::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBody::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_RIGID_BODY_FIXLINKS
 }
 
diff --git a/src/obj/bhkRigidBodyT.cpp b/src/obj/bhkRigidBodyT.cpp
index 44fb735f5db97d9c6a2d6da32f3b9082a3a6c8f5..e8722ac648eb13fa7df995490e5204ff787faf42 100644
--- a/src/obj/bhkRigidBodyT.cpp
+++ b/src/obj/bhkRigidBodyT.cpp
@@ -23,7 +23,7 @@ string bhkRigidBodyT::asString( bool verbose ) const {
 	BHK_RIGID_BODY_T_STRING
 }
 
-void bhkRigidBodyT::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBodyT::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_RIGID_BODY_T_FIXLINKS
 }
 
diff --git a/src/obj/bhkSPCollisionObject.cpp b/src/obj/bhkSPCollisionObject.cpp
index 46829d6b50a7485067cd499060bb98b04db89e05..d7cd0ba20b03fc3ce230cdc136238c3bb81366ae 100644
--- a/src/obj/bhkSPCollisionObject.cpp
+++ b/src/obj/bhkSPCollisionObject.cpp
@@ -23,7 +23,7 @@ string bhkSPCollisionObject::asString( bool verbose ) const {
 	BHK_S_P_COLLISION_OBJECT_STRING
 }
 
-void bhkSPCollisionObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSPCollisionObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_S_P_COLLISION_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/bhkSerializable.cpp b/src/obj/bhkSerializable.cpp
index 65ba8927aa75e8db9237edd3edf160203c15ebe9..e49e98eff9bef4f011ae1e9e96361eeb23cf9ecb 100644
--- a/src/obj/bhkSerializable.cpp
+++ b/src/obj/bhkSerializable.cpp
@@ -23,7 +23,7 @@ string bhkSerializable::asString( bool verbose ) const {
 	BHK_SERIALIZABLE_STRING
 }
 
-void bhkSerializable::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSerializable::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_SERIALIZABLE_FIXLINKS
 }
 
diff --git a/src/obj/bhkShape.cpp b/src/obj/bhkShape.cpp
index f1dd46f89aea476269ac93f8dd197d18fb021889..0a23ff6fc5ec613f665eb921d8e47df9da058889 100644
--- a/src/obj/bhkShape.cpp
+++ b/src/obj/bhkShape.cpp
@@ -23,7 +23,7 @@ string bhkShape::asString( bool verbose ) const {
 	BHK_SHAPE_STRING
 }
 
-void bhkShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkSimpleShapePhantom.cpp b/src/obj/bhkSimpleShapePhantom.cpp
index 586fabd8c4e6906761c4f302b36a1975b3ff80fb..17ed93c07359ff44513413e660231309ab559fe8 100644
--- a/src/obj/bhkSimpleShapePhantom.cpp
+++ b/src/obj/bhkSimpleShapePhantom.cpp
@@ -23,7 +23,7 @@ string bhkSimpleShapePhantom::asString( bool verbose ) const {
 	BHK_SIMPLE_SHAPE_PHANTOM_STRING
 }
 
-void bhkSimpleShapePhantom::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSimpleShapePhantom::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_SIMPLE_SHAPE_PHANTOM_FIXLINKS
 }
 
diff --git a/src/obj/bhkSphereRepShape.cpp b/src/obj/bhkSphereRepShape.cpp
index 10dc2c9abf62a37ce7bd01ed5b280ab8f0195c44..3de723e0c5f5aca7f03156d262cc1a6a14da87eb 100644
--- a/src/obj/bhkSphereRepShape.cpp
+++ b/src/obj/bhkSphereRepShape.cpp
@@ -23,7 +23,7 @@ string bhkSphereRepShape::asString( bool verbose ) const {
 	BHK_SPHERE_REP_SHAPE_STRING
 }
 
-void bhkSphereRepShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSphereRepShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_SPHERE_REP_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkSphereShape.cpp b/src/obj/bhkSphereShape.cpp
index 773b06d96589888ab51af0416e54e5848f3e2f6b..3681512515fe562fd3f30952d576696dbbac2625 100644
--- a/src/obj/bhkSphereShape.cpp
+++ b/src/obj/bhkSphereShape.cpp
@@ -23,7 +23,7 @@ string bhkSphereShape::asString( bool verbose ) const {
 	BHK_SPHERE_SHAPE_STRING
 }
 
-void bhkSphereShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkSphereShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_SPHERE_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkStiffSpringConstraint.cpp b/src/obj/bhkStiffSpringConstraint.cpp
index eaa7ea490a0e713d005d5aa828257353e14e1d95..c0dd81a394e9bbdbc5a5bc506b6b5a0e319fc672 100644
--- a/src/obj/bhkStiffSpringConstraint.cpp
+++ b/src/obj/bhkStiffSpringConstraint.cpp
@@ -23,7 +23,7 @@ string bhkStiffSpringConstraint::asString( bool verbose ) const {
 	BHK_STIFF_SPRING_CONSTRAINT_STRING
 }
 
-void bhkStiffSpringConstraint::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkStiffSpringConstraint::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_STIFF_SPRING_CONSTRAINT_FIXLINKS
 }
 
diff --git a/src/obj/bhkTransformShape.cpp b/src/obj/bhkTransformShape.cpp
index 2d9c6f0c4f92f952f37a7d3e35058a606b1d10a9..17f0ab6a14f768d55b14ca6fe382e74daa240452 100644
--- a/src/obj/bhkTransformShape.cpp
+++ b/src/obj/bhkTransformShape.cpp
@@ -23,7 +23,7 @@ string bhkTransformShape::asString( bool verbose ) const {
 	BHK_TRANSFORM_SHAPE_STRING
 }
 
-void bhkTransformShape::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkTransformShape::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_TRANSFORM_SHAPE_FIXLINKS
 }
 
diff --git a/src/obj/bhkWorldObject.cpp b/src/obj/bhkWorldObject.cpp
index e960609c71cc381d3dab6053c91a9b4f16ee7f20..6eabaae041613838734fde1b8844e377b1087513 100644
--- a/src/obj/bhkWorldObject.cpp
+++ b/src/obj/bhkWorldObject.cpp
@@ -23,7 +23,7 @@ string bhkWorldObject::asString( bool verbose ) const {
 	BHK_WORLD_OBJECT_STRING
 }
 
-void bhkWorldObject::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkWorldObject::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	BHK_WORLD_OBJECT_FIXLINKS
 }
 
diff --git a/src/obj/hkPackedNiTriStripsData.cpp b/src/obj/hkPackedNiTriStripsData.cpp
index 11642ba8398f9e8ae2393d8f032fd8fc627c8a8a..d9adbddb9f0e729ab98eb85af5dffb18d340d2fc 100644
--- a/src/obj/hkPackedNiTriStripsData.cpp
+++ b/src/obj/hkPackedNiTriStripsData.cpp
@@ -24,7 +24,7 @@ string hkPackedNiTriStripsData::asString( bool verbose ) const {
 	HK_PACKED_NI_TRI_STRIPS_DATA_STRING
 }
 
-void hkPackedNiTriStripsData::FixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+void hkPackedNiTriStripsData::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	HK_PACKED_NI_TRI_STRIPS_DATA_FIXLINKS
 }