diff --git a/include/NIF_IO.h b/include/NIF_IO.h
index a53d34e60dce8c8ab60ff4277b37af24b19c2612..228e50296fdc9f99921daea6184391357b009bcf 100644
--- a/include/NIF_IO.h
+++ b/include/NIF_IO.h
@@ -257,110 +257,110 @@ void WriteBool( bool val, ostream& out, unsigned int version );
 //--Basic Types--//
 
 //int
-void NifStream( int & val, istream& in, unsigned int version = 0 );
-void NifStream( int const & val, ostream& out, unsigned int version = 0  );
+void NifStream( int & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( int const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //unsigned int
-void NifStream( unsigned int & val, istream& in, unsigned int version = 0 );
-void NifStream( unsigned int const & val, ostream& out, unsigned int version = 0  );
+void NifStream( unsigned int & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( unsigned int const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //unsigned short
-void NifStream( unsigned short & val, istream& in, unsigned int version = 0 );
-void NifStream( unsigned short const & val, ostream& out, unsigned int version = 0  );
+void NifStream( unsigned short & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( unsigned short const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //short
-void NifStream( short & val, istream& in, unsigned int version = 0 );
-void NifStream( short const & val, ostream& out, unsigned int version = 0  );
+void NifStream( short & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( short const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //byte
-void NifStream( byte & val, istream& in, unsigned int version = 0 );
-void NifStream( byte const & val, ostream& out, unsigned int version = 0  );
+void NifStream( byte & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( byte const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //bool
-void NifStream( bool & val, istream& in, unsigned int version );  // version is significant
-void NifStream( bool const & val, ostream& out, unsigned int version ); // version is significant
+void NifStream( bool & val, istream& in, const NifInfo & info = NifInfo() );  // version is significant
+void NifStream( bool const & val, ostream& out, const NifInfo & info = NifInfo() ); // version is significant
 
 //float
-void NifStream( float & val, istream& in, unsigned int version = 0 );
-void NifStream( float const & val, ostream& out, unsigned int version = 0  );
+void NifStream( float & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( float const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //string
-void NifStream( string & val, istream& in, unsigned int version = 0 );
-void NifStream( string const & val, ostream& out, unsigned int version = 0  );
+void NifStream( string & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( string const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //--Structs--//
 
 //TexCoord
-void NifStream( TexCoord & val, istream& in, unsigned int version = 0 );
-void NifStream( TexCoord const & val, ostream& out, unsigned int version = 0 );
+void NifStream( TexCoord & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexCoord const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Triangle
-void NifStream( Triangle & val, istream& in, unsigned int version = 0 );
-void NifStream( Triangle const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Triangle & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Triangle const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Vector3
-void NifStream( Vector3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Vector3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Vector3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Vector3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Float2
-void NifStream( Float2 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float2 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float2 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float2 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix22
-void NifStream( Matrix22 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix22 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix22 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix22 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Float3
-void NifStream( Float3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix33
-void NifStream( Matrix33 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix33 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix33 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix33 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Float4
-void NifStream( Float4 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float4 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float4 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float4 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix44
-void NifStream( Matrix44 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix44 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix44 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix44 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Color3
-void NifStream( Color3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Color3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Color3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Color3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Color4
-void NifStream( Color4 & val, istream& in, unsigned int version = 0 );
-void NifStream( Color4 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Color4 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Color4 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Quaternion
-void NifStream( Quaternion & val, istream& in, unsigned int version = 0 );
-void NifStream( Quaternion const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Quaternion & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Quaternion const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, unsigned int & version ); //Sets the passed in version varible
-void NifStream( HeaderString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( HeaderString & val, istream& in, NifInfo & info ); //Sets the passed in info
+void NifStream( HeaderString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, HeaderString const & val );
 
 //LineString
-void NifStream( LineString & val, istream& in, unsigned int version );
-void NifStream( LineString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( LineString & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( LineString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, LineString const & val );
 
 //ShortString
-void NifStream( ShortString & val, istream& in, unsigned int version = 0 );
-void NifStream( ShortString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ShortString & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ShortString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, ShortString const & val );
 
 //--Templates--//
 
-void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyType type );
-void NifStream( Key<Quaternion> const & key, ostream& file, unsigned int version,  KeyType type );
+void NifStream( Key<Quaternion> & key, istream& file, const NifInfo & info, KeyType type );
+void NifStream( Key<Quaternion> const & key, ostream& file, const NifInfo & info,  KeyType type );
 
 //Key<T>
 template <class T> 
-void NifStream( Key<T> & key, istream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<T> & key, istream& file, const NifInfo & info, KeyType type ) {
 	key.time = ReadFloat( file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -384,12 +384,12 @@ void NifStream( Key<T> & key, istream& file, unsigned int version, KeyType type
 }
 
 template <class T> 
-void NifStream( Key<T> & key, istream & file, unsigned int version, int type ) {
-	NifStream( key, file, version, (KeyType)type );
+void NifStream( Key<T> & key, istream & file, const NifInfo & info, int type ) {
+	NifStream( key, file, info, (KeyType)type );
 }
 
 template <class T> 
-void NifStream( Key<T> const & key, ostream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<T> const & key, ostream& file, const NifInfo & info, KeyType type ) {
 	WriteFloat( key.time, file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -413,8 +413,8 @@ void NifStream( Key<T> const & key, ostream& file, unsigned int version, KeyType
 }
 
 template <class T> 
-void NifStream( Key<T> const & key, ostream & file, unsigned int version, int type ) {
-	NifStream( key, file, version, (KeyType)type );
+void NifStream( Key<T> const & key, ostream & file, const NifInfo & info, int type ) {
+	NifStream( key, file, info, (KeyType)type );
 }
 
 //The HexString function creates a formatted hex display of the given data for use in printing
diff --git a/include/gen/Footer.h b/include/gen/Footer.h
index 32bb6a29116ad6153ff3573121e91ff89ee44b0f..908ddb4debb8b0f4851c3f5fc6250001cd87dbb5 100644
--- a/include/gen/Footer.h
+++ b/include/gen/Footer.h
@@ -44,8 +44,8 @@ struct Footer {
 	 * Bip Head node).
 	 */
 	vector<Ref<NiObject > > roots;
-	NIFLIB_HIDDEN void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_HIDDEN string asString( bool verbose = false ) const;
 };
 
diff --git a/include/gen/Header.h b/include/gen/Header.h
index 0385669781af4b247625dfad557f1bb5eaa1d5f9..1fc59eb47d679ab1d0d8d50f84de79671973a4ca 100644
--- a/include/gen/Header.h
+++ b/include/gen/Header.h
@@ -95,8 +95,8 @@ struct Header {
 	 * Unknown.
 	 */
 	unsigned int unknownInt2;
-	NIFLIB_HIDDEN void Read( istream& in );
-	NIFLIB_HIDDEN void Write( ostream& out ) const;
+	NIFLIB_HIDDEN NifInfo Read( istream& in );
+	NIFLIB_HIDDEN void Write( ostream& out, const NifInfo & info = NifInfo() ) const;
 	NIFLIB_HIDDEN string asString( bool verbose = false ) const;
 };
 
diff --git a/include/gen/enums_intl.h b/include/gen/enums_intl.h
index 67cef47dc64bbcf33388fcf2f5fce8481ba5fe12..1d4d0908f6bc7c2f5ba85b316b7aad8674eb239d 100644
--- a/include/gen/enums_intl.h
+++ b/include/gen/enums_intl.h
@@ -18,134 +18,134 @@ namespace Niflib {
 
 //---ForceType---//
 
-void NifStream( ForceType & val, istream& in, unsigned int version = 0 );
-void NifStream( ForceType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ForceType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ForceType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---HavokMaterial---//
 
-void NifStream( HavokMaterial & val, istream& in, unsigned int version = 0 );
-void NifStream( HavokMaterial const & val, ostream& out, unsigned int version = 0  );
+void NifStream( HavokMaterial & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( HavokMaterial const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---CompareMode---//
 
-void NifStream( CompareMode & val, istream& in, unsigned int version = 0 );
-void NifStream( CompareMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( CompareMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( CompareMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexFilterMode---//
 
-void NifStream( TexFilterMode & val, istream& in, unsigned int version = 0 );
-void NifStream( TexFilterMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexFilterMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexFilterMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---LightMode---//
 
-void NifStream( LightMode & val, istream& in, unsigned int version = 0 );
-void NifStream( LightMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( LightMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( LightMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MipMapFormat---//
 
-void NifStream( MipMapFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( MipMapFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MipMapFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MipMapFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---StencilAction---//
 
-void NifStream( StencilAction & val, istream& in, unsigned int version = 0 );
-void NifStream( StencilAction const & val, ostream& out, unsigned int version = 0  );
+void NifStream( StencilAction & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( StencilAction const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---OblivionLayer---//
 
-void NifStream( OblivionLayer & val, istream& in, unsigned int version = 0 );
-void NifStream( OblivionLayer const & val, ostream& out, unsigned int version = 0  );
+void NifStream( OblivionLayer & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( OblivionLayer const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---FaceDrawMode---//
 
-void NifStream( FaceDrawMode & val, istream& in, unsigned int version = 0 );
-void NifStream( FaceDrawMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( FaceDrawMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( FaceDrawMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---AlphaFormat---//
 
-void NifStream( AlphaFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( AlphaFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( AlphaFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( AlphaFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---KeyType---//
 
-void NifStream( KeyType & val, istream& in, unsigned int version = 0 );
-void NifStream( KeyType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( KeyType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( KeyType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---VertMode---//
 
-void NifStream( VertMode & val, istream& in, unsigned int version = 0 );
-void NifStream( VertMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( VertMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( VertMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---ApplyMode---//
 
-void NifStream( ApplyMode & val, istream& in, unsigned int version = 0 );
-void NifStream( ApplyMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ApplyMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ApplyMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MotionSystem---//
 
-void NifStream( MotionSystem & val, istream& in, unsigned int version = 0 );
-void NifStream( MotionSystem const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MotionSystem & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MotionSystem const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---BillboardMode---//
 
-void NifStream( BillboardMode & val, istream& in, unsigned int version = 0 );
-void NifStream( BillboardMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( BillboardMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( BillboardMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexType---//
 
-void NifStream( TexType & val, istream& in, unsigned int version = 0 );
-void NifStream( TexType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---PixelLayout---//
 
-void NifStream( PixelLayout & val, istream& in, unsigned int version = 0 );
-void NifStream( PixelLayout const & val, ostream& out, unsigned int version = 0  );
+void NifStream( PixelLayout & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( PixelLayout const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexClampMode---//
 
-void NifStream( TexClampMode & val, istream& in, unsigned int version = 0 );
-void NifStream( TexClampMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexClampMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexClampMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MotionQuality---//
 
-void NifStream( MotionQuality & val, istream& in, unsigned int version = 0 );
-void NifStream( MotionQuality const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MotionQuality & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MotionQuality const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---PixelFormat---//
 
-void NifStream( PixelFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( PixelFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( PixelFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( PixelFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---CycleType---//
 
-void NifStream( CycleType & val, istream& in, unsigned int version = 0 );
-void NifStream( CycleType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( CycleType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( CycleType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---FieldType---//
 
-void NifStream( FieldType & val, istream& in, unsigned int version = 0 );
-void NifStream( FieldType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( FieldType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( FieldType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 }
 #endif
diff --git a/include/nif_basic_types.h b/include/nif_basic_types.h
index 946b625bfa2140b75c18994cdf310137309712bc..ef1b7191f943a7bf22b65eba75f39d36ef25b7c8 100644
--- a/include/nif_basic_types.h
+++ b/include/nif_basic_types.h
@@ -6,6 +6,8 @@ All rights reserved.  Please see niflib.h for licence. */
 
 #include <string>
 #include "gen/enums.h"
+#include "nif_versions.h"
+
 namespace Niflib {
 using namespace std;
 
@@ -26,6 +28,39 @@ struct LineString {
 typedef unsigned char	byte;
 #endif
 
+/*! Specifies the low-level nature of the storage process */
+enum EndianType {
+	BIG_ENDIAN = 0, /*!< Big Endian storage, such as that used by PowerPC processors */
+	LITTLE_ENDIAN = 1 /*!< Little Endian storage, such as that used by x86 processors */
+};
+
+//--Structures--//
+
+/*! 
+ * Used to specify optional ways the NIF file is to be written or retrieve information about
+ * the way an existing file was stored. 
+ */
+struct NifInfo {
+	NifInfo() : version(VER_4_0_0_2), userVersion(0), userVersion2(0), endian(LITTLE_ENDIAN) {}
+	NifInfo( unsigned version, unsigned userVersion = 0, unsigned userVersion2 = 0) {
+		this->version = version;
+		this->userVersion = userVersion;
+		this->userVersion2 = userVersion2;
+		endian = LITTLE_ENDIAN;
+	}
+	unsigned version;
+	unsigned userVersion;
+	unsigned userVersion2;
+	/*! Specifies which low-level number storage format to use. Should match the processor type for the target system. */
+	EndianType endian;
+	/*! This is only supported in Oblivion.  It contains the name of the person who created the NIF file. */
+	string creator;
+	/*! This is only supported in Oblivion.  It seems to contiain the type of script or program used to export the file. */
+	string exportInfo1;
+	/*! This is only supported in Oblivion.  It seems to contain the more specific script or options of the above. */
+	string exportInfo2;
+};
+
 //TODO:  This is temporary to make it compile.  Should eventually be adjusted to display 1's and 0's insted of as an int.
 typedef unsigned short Flags;
 }
diff --git a/include/niflib.h b/include/niflib.h
index 2177a51c737e98c190121a2925288db40a89b0e7..c8a8110bcbce0b8be80b81e013a0df0ee5c3a383 100644
--- a/include/niflib.h
+++ b/include/niflib.h
@@ -84,34 +84,6 @@ enum ExportOptions {
 	EXPORT_KF_MULTI = 4 /*!< multiple KF */
 };
 
-//--Structures--//
-
-struct NifInfo {
-	NifInfo() : version(VER_4_0_0_2), userVersion(0), userVersion2(0), endian(INFO_LITTLE_ENDIAN) {}
-	NifInfo( unsigned version, unsigned userVersion = 0, unsigned userVersion2 = 0) {
-		this->version = version;
-		this->userVersion = userVersion;
-		this->userVersion2 = userVersion2;
-		endian = INFO_LITTLE_ENDIAN;
-	}
-	//TODO: Implement endian support
-	enum EndianType {
-		INFO_BIG_ENDIAN = 0,
-		INFO_LITTLE_ENDIAN = 1
-	}; 
-	unsigned version;
-	unsigned userVersion;
-	unsigned  userVersion2;
-	/*! This is not yet supported. */
-	EndianType endian;
-	/*! This is only supported in Oblivion.  It contains the name of the person who created the NIF file. */
-	string creator;
-	/*! This is only supported in Oblivion.  It seems to contiain the type of script or program used to export the file. */
-	string exportInfo1;
-	/*! This is only supported in Oblivion.  It seems to contain the more specific script or options of the above. */
-	string exportInfo2;
-};
-
 //--Main Functions--//
 
 /*!
@@ -219,7 +191,7 @@ NIFLIB_API Ref<NiObject> ReadNifTree( istream & in, NifInfo * info = NULL );
  * 
  * \sa ReadNifList, WriteNifTree
  */
-NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const NifInfo & info );
+NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const NifInfo & info = NifInfo() );
 
 /*!
  * Writes a nif tree to an ostream starting at the given root block.
@@ -227,7 +199,7 @@ NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const N
  * \param[in] root The root block to start from when writing out the NIF data.  All decedents of this block will be written to the stream in tree-descending order.
  * \param[in] info A NifInfo structure that contains information such as the version of the NIF file to create.
  */
-NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & info );
+NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & info = NifInfo() );
 
 /*!
  * Writes a bunch of files given a base file name, and a pointer to the root block of the Nif file tree.
@@ -237,7 +209,7 @@ NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & inf
  * \param[in] export_files What files to write: NIF, NIF + KF + KFM, NIF + KF's + KFM, KF only, KF's only
  * \param[in] kf_type The KF type (Morrowind style, DAoC style, CivIV style, ...)
  */
-NIFLIB_API void WriteFileGroup( string const & file_name, NiObject * root, const NifInfo & info, ExportOptions export_files = EXPORT_NIF, NifGame kf_type = KF_MW);
+NIFLIB_API void WriteFileGroup( string const & file_name, NiObject * root, const NifInfo & info = NifInfo(), ExportOptions export_files = EXPORT_NIF, NifGame kf_type = KF_MW);
 
 /*!
  * Creates a clone of an entire tree of objects.
diff --git a/include/obj/ABoneLODController.h b/include/obj/ABoneLODController.h
index 59e1b11c3aa25cad783f6af4df483cee23e395a2..6175d21dd924dcc3c69ead1a828dee4cf5f60a29 100644
--- a/include/obj/ABoneLODController.h
+++ b/include/obj/ABoneLODController.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -75,10 +75,10 @@ public:
 protected:
 	A_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AKeyedData.h b/include/obj/AKeyedData.h
index 106900906e18cb19a9628e706f0daeb4f66ad6a5..394e97984e988304de54c6e967a03081683e3ee6 100644
--- a/include/obj/AKeyedData.h
+++ b/include/obj/AKeyedData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_KEYED_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/APSysCtlr.h b/include/obj/APSysCtlr.h
index 683c3869e8bcc20cda17113f85a0824bedfe8133..706ee54c20fcc77be3904901ad8c01194ca6ac61 100644
--- a/include/obj/APSysCtlr.h
+++ b/include/obj/APSysCtlr.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	A_P_SYS_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/APSysData.h b/include/obj/APSysData.h
index 30cde046825ffeaf1d231a3831928789af0e6d9f..acbf4ef651c18be59904c0386fe2204117e7bd89 100644
--- a/include/obj/APSysData.h
+++ b/include/obj/APSysData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AParticleModifier.h b/include/obj/AParticleModifier.h
index c462d4a3eace9ea28e1a20fbc381acce2ba5f5db..101be6f8b84f538de9123717a57252f09af20351 100644
--- a/include/obj/AParticleModifier.h
+++ b/include/obj/AParticleModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_PARTICLE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkConstraint.h b/include/obj/AbhkConstraint.h
index c3f5a7b39b6d0bbbe1157773085fc17f73f94386..7014cf2c9615e6b1adc8bacfd535d36865fab2f3 100644
--- a/include/obj/AbhkConstraint.h
+++ b/include/obj/AbhkConstraint.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkRagdollConstraint.h b/include/obj/AbhkRagdollConstraint.h
index c0010df51dac6f4a3e6970eca72965ae58005d3a..11f2a52ca946a93dc21b03f1af2756cfdd25848f 100644
--- a/include/obj/AbhkRagdollConstraint.h
+++ b/include/obj/AbhkRagdollConstraint.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_RAGDOLL_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkShapeCollection.h b/include/obj/AbhkShapeCollection.h
index b714762d98a6d6df8087f1814a26e7383178dc9e..3e13baf509febaf2c852f5ca03473445b45a751c 100644
--- a/include/obj/AbhkShapeCollection.h
+++ b/include/obj/AbhkShapeCollection.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_SHAPE_COLLECTION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AvoidNode.h b/include/obj/AvoidNode.h
index c4fa25e7880c9f298d309ee28c14ad06da2a5323..486ca0019797c0c801b7b4096db4bf1caf474f43 100644
--- a/include/obj/AvoidNode.h
+++ b/include/obj/AvoidNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	AVOID_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSBound.h b/include/obj/BSBound.h
index 5be87a32be6573f9acefc106e931ff16bd290eb8..7db2acb2a652efeaeee2c3a15dcb2a71ea628498 100644
--- a/include/obj/BSBound.h
+++ b/include/obj/BSBound.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	B_S_BOUND_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSFurnitureMarker.h b/include/obj/BSFurnitureMarker.h
index 38802c2b0ffb6fce74bf38b964d48325988aaacc..f944626e2cd7db95eecae523ca757b2e04f35f10 100644
--- a/include/obj/BSFurnitureMarker.h
+++ b/include/obj/BSFurnitureMarker.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<FurniturePosition> GetFurniturePositions() const;
@@ -42,10 +42,10 @@ public:
 protected:
 	B_S_FURNITURE_MARKER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSKeyframeController.h b/include/obj/BSKeyframeController.h
index 742521b5db38a9e6466ddbcf6d55812554bef0b4..ad05e261ddba64675b968560cec31d601a841570 100644
--- a/include/obj/BSKeyframeController.h
+++ b/include/obj/BSKeyframeController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_KEYFRAME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSPSysArrayEmitter.h b/include/obj/BSPSysArrayEmitter.h
index 088276a8ba101964755fcebbf2b75e6f1dd995ec..2d56fdcaa46ff8540d5e9474c441e0f65e78dfee 100644
--- a/include/obj/BSPSysArrayEmitter.h
+++ b/include/obj/BSPSysArrayEmitter.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_P_SYS_ARRAY_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSParentVelocityModifier.h b/include/obj/BSParentVelocityModifier.h
index 391d54dd62bde1305237263c08a9535dca670c17..8a7ae38a21c558573e3b9881654aad294ff23a3c 100644
--- a/include/obj/BSParentVelocityModifier.h
+++ b/include/obj/BSParentVelocityModifier.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_PARENT_VELOCITY_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSXFlags.h b/include/obj/BSXFlags.h
index 965fc552c7d05a3cca808da4de5e5e88ed67d3fe..4027ffcd271af6114c396bf7aeea03557ddb51b1 100644
--- a/include/obj/BSXFlags.h
+++ b/include/obj/BSXFlags.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	B_S_X_FLAGS_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxButton.h b/include/obj/FxButton.h
index 5570059466f383a6e30c63a2338bdcc19f0ee303..e7b1c3a96d69da4cc9d08f386f484e795eaf3f83 100644
--- a/include/obj/FxButton.h
+++ b/include/obj/FxButton.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_BUTTON_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxRadioButton.h b/include/obj/FxRadioButton.h
index 336db71ff8634fa18de4ebe03e5daad0ce01d452..a1b0deb88921f571e70ee605d1ba180e846caa74 100644
--- a/include/obj/FxRadioButton.h
+++ b/include/obj/FxRadioButton.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_RADIO_BUTTON_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxWidget.h b/include/obj/FxWidget.h
index e1e9efd4883d2bb875e09c6971ce68d107967488..a1e864ff6871731f7bf1361844773b8324f358ce 100644
--- a/include/obj/FxWidget.h
+++ b/include/obj/FxWidget.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_WIDGET_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAVObject.h b/include/obj/NiAVObject.h
index 66b64141081e32c598a44f6e8a06694adea1533f..bd5c896f33f0da041d40985c3f74eca3e769cd65 100644
--- a/include/obj/NiAVObject.h
+++ b/include/obj/NiAVObject.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN 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?
@@ -125,10 +125,10 @@ protected:
 	NiNode * parent;
 	NI_A_V_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAlphaController.h b/include/obj/NiAlphaController.h
index f64387cb73a45f63ff3064ca4d98663d300c2a44..5e17e9cb7b0169e1f286d928b349326c14cf32cc 100644
--- a/include/obj/NiAlphaController.h
+++ b/include/obj/NiAlphaController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ALPHA_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAlphaProperty.h b/include/obj/NiAlphaProperty.h
index f7200f898c110b64e58aff4beb3db07c7693d693..43ee9777ac7258e87b4bb188f65491ba39318319 100644
--- a/include/obj/NiAlphaProperty.h
+++ b/include/obj/NiAlphaProperty.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	enum BlendMode {
@@ -83,10 +83,10 @@ public:
 protected:
 	NI_ALPHA_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAmbientLight.h b/include/obj/NiAmbientLight.h
index e337e648b9430e2da8f14572caca20220942977f..4ede505251df62f8e72f0cdbf370a8e421cf15e7 100644
--- a/include/obj/NiAmbientLight.h
+++ b/include/obj/NiAmbientLight.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AMBIENT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAutoNormalParticles.h b/include/obj/NiAutoNormalParticles.h
index 7e5c7a250e92cb252864dcc85b094f25fbb2b8da..e51334eeb7d3918707217efdfd7840c45ee3c194 100644
--- a/include/obj/NiAutoNormalParticles.h
+++ b/include/obj/NiAutoNormalParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AUTO_NORMAL_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAutoNormalParticlesData.h b/include/obj/NiAutoNormalParticlesData.h
index 3e2a75a8862e60dcafaeeb7ea35153e4034696cf..4aa917073b5add1fe35ca675e72dd52ceeb01edf 100644
--- a/include/obj/NiAutoNormalParticlesData.h
+++ b/include/obj/NiAutoNormalParticlesData.h
@@ -28,19 +28,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AUTO_NORMAL_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSAnimationNode.h b/include/obj/NiBSAnimationNode.h
index 39ffb4d8e8f8df04c6e4c72b436850de42a0b159..122ed7a7440f446735cddafd8f45cd5ea134e50e 100644
--- a/include/obj/NiBSAnimationNode.h
+++ b/include/obj/NiBSAnimationNode.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_ANIMATION_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSBoneLODController.h b/include/obj/NiBSBoneLODController.h
index b8c09ddbf6593782d7d874676a531970373ee8ae..e906e34069dab852d1c48dc0cd23c8b3db74bd1c 100644
--- a/include/obj/NiBSBoneLODController.h
+++ b/include/obj/NiBSBoneLODController.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSPArrayController.h b/include/obj/NiBSPArrayController.h
index c6d1fc18f7d099c60a5b1e999f56d1b05dd07493..a16437eda587d79a17000f4e3dea48c1b3920db0 100644
--- a/include/obj/NiBSPArrayController.h
+++ b/include/obj/NiBSPArrayController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_P_ARRAY_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSParticleNode.h b/include/obj/NiBSParticleNode.h
index ec08c973fab12d7977527edaae053dd2e25f918b..2223fb3a14589a7711fbfe44a97d2a915f33e8f4 100644
--- a/include/obj/NiBSParticleNode.h
+++ b/include/obj/NiBSParticleNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_PARTICLE_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineBasisData.h b/include/obj/NiBSplineBasisData.h
index 04f46b1bf82985651123712b5ce701c513855026..c5b09baabe3ba7f25c6773ee0ebdf84d54d2b561 100644
--- a/include/obj/NiBSplineBasisData.h
+++ b/include/obj/NiBSplineBasisData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_B_SPLINE_BASIS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompFloatInterpolator.h b/include/obj/NiBSplineCompFloatInterpolator.h
index 1ed8d5c8ce19c511bd56ad9896f9f12db6a00626..9e7cf5e5a744857598077888c766a0a721ebdfd0 100644
--- a/include/obj/NiBSplineCompFloatInterpolator.h
+++ b/include/obj/NiBSplineCompFloatInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompPoint3Interpolator.h b/include/obj/NiBSplineCompPoint3Interpolator.h
index b002d8634ffefbbe54c7112a7e4e3740b6eee449..58a63ecc1e41fe46b615768d7bc30f1a0fb97e4a 100644
--- a/include/obj/NiBSplineCompPoint3Interpolator.h
+++ b/include/obj/NiBSplineCompPoint3Interpolator.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompTransformInterpolator.h b/include/obj/NiBSplineCompTransformInterpolator.h
index 7c158ccd07150fd66cded0d0c88d925d2e62cd15..6349fd836849b8f3fb42550d24702e07b97c3166 100644
--- a/include/obj/NiBSplineCompTransformInterpolator.h
+++ b/include/obj/NiBSplineCompTransformInterpolator.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -132,10 +132,10 @@ public:
 protected:
 	NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineData.h b/include/obj/NiBSplineData.h
index 1a80ac6c39d8fe0899646c494c3810be70a718ad..53bf01fda98397326d0e106d97a39f2caff42a56 100644
--- a/include/obj/NiBSplineData.h
+++ b/include/obj/NiBSplineData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    /*!
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_B_SPLINE_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineInterpolator.h b/include/obj/NiBSplineInterpolator.h
index 4ccc17a1457c89182a488f281baa77186b218a8b..ad574bfa7e19b146dc3fd5067c47483c73767cb8 100644
--- a/include/obj/NiBSplineInterpolator.h
+++ b/include/obj/NiBSplineInterpolator.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -68,10 +68,10 @@ protected:
 protected:
 	NI_B_SPLINE_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBillboardNode.h b/include/obj/NiBillboardNode.h
index bbe23ef9e6a088a15bf89d438acdf485130af340..3a0bdf44ab6383bf90c7c7af6981792fd211a8f0 100644
--- a/include/obj/NiBillboardNode.h
+++ b/include/obj/NiBillboardNode.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -44,10 +44,10 @@ public:
 protected:
 	NI_BILLBOARD_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBinaryExtraData.h b/include/obj/NiBinaryExtraData.h
index e73694dee3fd33cfbf403beb4493d286a2b03095..e02e86399661a5c6de9ec2821d2d41e7780ad263 100644
--- a/include/obj/NiBinaryExtraData.h
+++ b/include/obj/NiBinaryExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<byte> GetData() const;
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_BINARY_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendBoolInterpolator.h b/include/obj/NiBlendBoolInterpolator.h
index e6a8d806dc52e08af528be116a0140a28b3fc3f6..a8dc386775fbecab58087e1275842470740c0f7c 100644
--- a/include/obj/NiBlendBoolInterpolator.h
+++ b/include/obj/NiBlendBoolInterpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_BOOL_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendFloatInterpolator.h b/include/obj/NiBlendFloatInterpolator.h
index f87b813d230fb58aeb40a936ab21d0f27a8411e2..f87ef461f5293973210763e253548280f2b88070 100644
--- a/include/obj/NiBlendFloatInterpolator.h
+++ b/include/obj/NiBlendFloatInterpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendInterpolator.h b/include/obj/NiBlendInterpolator.h
index fefc686edca1b5211bb412504ec7a950d7eb957c..ef509b04419fe693d09fe74cdb757a2ed116554c 100644
--- a/include/obj/NiBlendInterpolator.h
+++ b/include/obj/NiBlendInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BLEND_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendPoint3Interpolator.h b/include/obj/NiBlendPoint3Interpolator.h
index e2a682216c2bfaa19406e6a18563db812d233a77..a1aabef63f70478a3127105f42c75759ca613e5e 100644
--- a/include/obj/NiBlendPoint3Interpolator.h
+++ b/include/obj/NiBlendPoint3Interpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendTransformInterpolator.h b/include/obj/NiBlendTransformInterpolator.h
index e97636ae9c56d3f6e6001cec2d41f7c5a7b1b920..c0bfe09b2d6609f6d83320137a2ce7d06039cb3b 100644
--- a/include/obj/NiBlendTransformInterpolator.h
+++ b/include/obj/NiBlendTransformInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BLEND_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoneLODController.h b/include/obj/NiBoneLODController.h
index 44d6921e17aa689871744a12314f79578a20992d..65cb057383c02c913f878d0fb56912bdbe3f9991 100644
--- a/include/obj/NiBoneLODController.h
+++ b/include/obj/NiBoneLODController.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolData.h b/include/obj/NiBoolData.h
index f5dec03097820356651a1e6c63011dfe97b4d911..0d1e6456981f5e4658fcf89a3176f6489c64e543 100644
--- a/include/obj/NiBoolData.h
+++ b/include/obj/NiBoolData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of boolean interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_BOOL_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolInterpolator.h b/include/obj/NiBoolInterpolator.h
index d34062d326b4f5f30b56f0a27de159310d5b4a83..d0251a5e9fa683be5c29c9d4d96c96837c0c8ff9 100644
--- a/include/obj/NiBoolInterpolator.h
+++ b/include/obj/NiBoolInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_BOOL_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolTimelineInterpolator.h b/include/obj/NiBoolTimelineInterpolator.h
index 99255ccf29cd462f5f39283bdeea5f55a2fb179e..86c372b75eb3f4f5f04f0b70feefcec19c12bd94 100644
--- a/include/obj/NiBoolTimelineInterpolator.h
+++ b/include/obj/NiBoolTimelineInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_BOOL_TIMELINE_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBooleanExtraData.h b/include/obj/NiBooleanExtraData.h
index f2d4e5bda11a27a171e5dea307524720dbfaa18a..8a5b31ae8955ce3684b76ad5c0230d90c574daa0 100644
--- a/include/obj/NiBooleanExtraData.h
+++ b/include/obj/NiBooleanExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API bool GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_BOOLEAN_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCamera.h b/include/obj/NiCamera.h
index da24170d98e6c383351b08422c6d655db93d8ab9..f94c7f294f4ba3f79968452c0035843c182b80cb 100644
--- a/include/obj/NiCamera.h
+++ b/include/obj/NiCamera.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -114,10 +114,10 @@ public:
 protected:
 	NI_CAMERA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClod.h b/include/obj/NiClod.h
index 8743e0b0fcae9eff877aab2d03cc36899d55ef95..16682663e48591c37d6f63d4313cccaf29760d35 100644
--- a/include/obj/NiClod.h
+++ b/include/obj/NiClod.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClodData.h b/include/obj/NiClodData.h
index a10bc1a459e5d6126f24b4fce45d60204d121a3f..a055295bf617e121c367a39a2698ce6d03fde2e5 100644
--- a/include/obj/NiClodData.h
+++ b/include/obj/NiClodData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClodSkinInstance.h b/include/obj/NiClodSkinInstance.h
index 6fddf4641848c8c6ad7343ee81a04efa99b71724..95a8d752505865a8093e2cb119e73ce9896699e3 100644
--- a/include/obj/NiClodSkinInstance.h
+++ b/include/obj/NiClodSkinInstance.h
@@ -28,19 +28,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_SKIN_INSTANCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCollisionData.h b/include/obj/NiCollisionData.h
index df6c8f089f3caa3a7cd8baae2628e38eb9a749d3..c41686aef69dff066d3d806b01819a5feefb7e3f 100644
--- a/include/obj/NiCollisionData.h
+++ b/include/obj/NiCollisionData.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_COLLISION_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCollisionObject.h b/include/obj/NiCollisionObject.h
index a53587222d1ec6439ad5965bac4a42720347141f..07fefab49af68c86708396978ae566e1eabbddda 100644
--- a/include/obj/NiCollisionObject.h
+++ b/include/obj/NiCollisionObject.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiColorData.h b/include/obj/NiColorData.h
index 8c6f98ffb3fb04107aa275dcccc38b0f7ada4b38..5f3af77301b098a28bcda6b83b0f1ed45c9da049 100644
--- a/include/obj/NiColorData.h
+++ b/include/obj/NiColorData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of color interpolation being used.
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_COLOR_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiColorExtraData.h b/include/obj/NiColorExtraData.h
index 40c7842872dab0b79436843b5d2c3cffbaa33e28..6929ac9073cf49a2ab0ab6b55add90c0dcc952ca 100644
--- a/include/obj/NiColorExtraData.h
+++ b/include/obj/NiColorExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Color4 GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_COLOR_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiControllerManager.h b/include/obj/NiControllerManager.h
index e19f1deae1a1c0b70493347250ccd0bf345b5ed1..a9755dd695cc5c5688ca3e70267350c6b449538b 100644
--- a/include/obj/NiControllerManager.h
+++ b/include/obj/NiControllerManager.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -63,10 +63,10 @@ public:
 protected:
 	NI_CONTROLLER_MANAGER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiControllerSequence.h b/include/obj/NiControllerSequence.h
index 8dc960219d4f1a42ef584a34ef56b44be1cddaaa..ac62a06870de1ee5af5d599d72b3f54aa469d6ff 100644
--- a/include/obj/NiControllerSequence.h
+++ b/include/obj/NiControllerSequence.h
@@ -36,10 +36,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -173,10 +173,10 @@ protected:
 
 	NI_CONTROLLER_SEQUENCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDefaultAVObjectPalette.h b/include/obj/NiDefaultAVObjectPalette.h
index 599a8d8a08406f03d221dfdabb00e7208d73ae53..ee73b71361a5c989f81ef40d00ffa423100bd0d3 100644
--- a/include/obj/NiDefaultAVObjectPalette.h
+++ b/include/obj/NiDefaultAVObjectPalette.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_DEFAULT_A_V_OBJECT_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDirectionalLight.h b/include/obj/NiDirectionalLight.h
index 04c73d3958c6589d101408f71a467977bb0e4852..4a2bc6de8b4dba8f96233e0140c584d4aabd287c 100644
--- a/include/obj/NiDirectionalLight.h
+++ b/include/obj/NiDirectionalLight.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_DIRECTIONAL_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDitherProperty.h b/include/obj/NiDitherProperty.h
index 072d229ebed5ca72c1a02b20a32bb09ba15f2bc2..d680c66532357cd9e4fb5b9f81ea27b9f63bbddd 100644
--- a/include/obj/NiDitherProperty.h
+++ b/include/obj/NiDitherProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_DITHER_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDynamicEffect.h b/include/obj/NiDynamicEffect.h
index 19d1864c0d9d239cf3b211a36187fb2f9cca8120..d790cbb3f500c9b343402d0adf60eb9dafa2f3fe 100644
--- a/include/obj/NiDynamicEffect.h
+++ b/include/obj/NiDynamicEffect.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -62,10 +62,10 @@ public:
 protected:
 	NI_DYNAMIC_EFFECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiExtraData.h b/include/obj/NiExtraData.h
index d89badc702949c7b72edc8b5f19f1ab0c338ea9d..47253b2c9922227b98a313a7eaf48c0c81d7f053 100644
--- a/include/obj/NiExtraData.h
+++ b/include/obj/NiExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Returns a reference to the next extra data used in early version NIF
@@ -71,10 +71,10 @@ public:
 protected:
 	NI_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFlipController.h b/include/obj/NiFlipController.h
index 335d0b67c9b1da115745d9e3edd583b37c35ea42..933f69dcd71da492d2e0079973d5b05368c7f8e6 100644
--- a/include/obj/NiFlipController.h
+++ b/include/obj/NiFlipController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_FLIP_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatData.h b/include/obj/NiFloatData.h
index c952c53a3ba9f2c99134264694f0cd395edaeabc..35a9fb7cd9c8faa940065755c9b3fa634591b193 100644
--- a/include/obj/NiFloatData.h
+++ b/include/obj/NiFloatData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of float interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_FLOAT_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatExtraData.h b/include/obj/NiFloatExtraData.h
index 938f8f89c524e4756784e4f741056fdf5d4a711c..3b53c8a218deecbb0ed8ba7f07933bc47378a753 100644
--- a/include/obj/NiFloatExtraData.h
+++ b/include/obj/NiFloatExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API float GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_FLOAT_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatExtraDataController.h b/include/obj/NiFloatExtraDataController.h
index f85277b90d274738ab4941f1dcea5812febb5716..96b59b30906096b741753fabf6b8ba5807847b94 100644
--- a/include/obj/NiFloatExtraDataController.h
+++ b/include/obj/NiFloatExtraDataController.h
@@ -32,20 +32,20 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  The function of all data is currently unknown.
 protected:
 	NI_FLOAT_EXTRA_DATA_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatInterpolator.h b/include/obj/NiFloatInterpolator.h
index dc9842d984363cd016690e7642a56176473dde13..a6a3ba20c304fe64f3da0b8cd11c7986c6923dbb 100644
--- a/include/obj/NiFloatInterpolator.h
+++ b/include/obj/NiFloatInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatsExtraData.h b/include/obj/NiFloatsExtraData.h
index 36e8c8e440699aa38267809b35370123b08eed7d..8ddb4db77e2ddf91305ee22fd63ff5d4f4293319 100644
--- a/include/obj/NiFloatsExtraData.h
+++ b/include/obj/NiFloatsExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<float> GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_FLOATS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFogProperty.h b/include/obj/NiFogProperty.h
index 4a480094eaa1ad424d4596edcdd18e4954b42470..1fe751c9ba0227bff239b747bb727b25a5dff99f 100644
--- a/include/obj/NiFogProperty.h
+++ b/include/obj/NiFogProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_FOG_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeomMorpherController.h b/include/obj/NiGeomMorpherController.h
index c4989c1e164f84cf6ba71612d6769cef50b26901..4a752abb0381449d1a06d38405159f7f4430218c 100644
--- a/include/obj/NiGeomMorpherController.h
+++ b/include/obj/NiGeomMorpherController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO: lots of unknown data in this object
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_GEOM_MORPHER_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeometry.h b/include/obj/NiGeometry.h
index 4bbf843fdb99062d26e2f1c5e9283d6b89b6adc7..6f5688a548ffcee7dd96eb642942b05bd146b8e0 100644
--- a/include/obj/NiGeometry.h
+++ b/include/obj/NiGeometry.h
@@ -38,10 +38,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -104,10 +104,10 @@ protected:
 	list< Ref<NiNode> > ListAncestors( const Ref<NiNode> & leaf ) const;
 	NI_GEOMETRY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeometryData.h b/include/obj/NiGeometryData.h
index 120e9902286ed16361da249050b574d5c0e6b417..89aa7775ca97d98ed5e5cf06f301b15403e5fb80 100644
--- a/include/obj/NiGeometryData.h
+++ b/include/obj/NiGeometryData.h
@@ -36,10 +36,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//--Counts--//
@@ -137,10 +137,10 @@ public:
 protected:
 	NI_GEOMETRY_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGravity.h b/include/obj/NiGravity.h
index 998c9bafb209ed0b813636f50b6a30c213d047d4..dc7e2887a3b86410e8339e5d00d9595aec0f0a43 100644
--- a/include/obj/NiGravity.h
+++ b/include/obj/NiGravity.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_GRAVITY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiImage.h b/include/obj/NiImage.h
index 0abdc2e07ff6ed94f239e9ee4a29dbc95dc7ac8d..fff2826abfdebf7505e28a36c58d3534f6e01e31 100644
--- a/include/obj/NiImage.h
+++ b/include/obj/NiImage.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_IMAGE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiIntegerExtraData.h b/include/obj/NiIntegerExtraData.h
index 6eb96be296fe115a8d46fc695a00cc4b58c7e754..bdaf6668324ffaf3c323d671d8abe437ea0eb9e2 100644
--- a/include/obj/NiIntegerExtraData.h
+++ b/include/obj/NiIntegerExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned int GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_INTEGER_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiIntegersExtraData.h b/include/obj/NiIntegersExtraData.h
index 916e2bfba45c7254b60e15a5111f6b51ef585fbe..bfb24461cfe5efccd939568550e6de32ee93b235 100644
--- a/include/obj/NiIntegersExtraData.h
+++ b/include/obj/NiIntegersExtraData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_INTEGERS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiInterpolator.h b/include/obj/NiInterpolator.h
index 44b632b595719febfa90b0b1357b5c1f277dfbcd..18324b9b65c997bb2c80bf108f9c2e51213ec5fe 100644
--- a/include/obj/NiInterpolator.h
+++ b/include/obj/NiInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiKeyframeController.h b/include/obj/NiKeyframeController.h
index e9588547a9294ad158df9464b36500654950b003..6835017fd9b9ba132bf0772a70a26eaf98a0d7be 100644
--- a/include/obj/NiKeyframeController.h
+++ b/include/obj/NiKeyframeController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Ref<NiKeyframeData> GetData() const;
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_KEYFRAME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiKeyframeData.h b/include/obj/NiKeyframeData.h
index f18fc492e7655a5e9b7f324bf2e1812ef930a8e2..24ad1eeb0bdca29bc8e7c04e53eff297516382c8 100644
--- a/include/obj/NiKeyframeData.h
+++ b/include/obj/NiKeyframeData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//--Rotate--//
@@ -188,10 +188,10 @@ protected:
 	void UpdateRotationKeyCount();
 	NI_KEYFRAME_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLODData.h b/include/obj/NiLODData.h
index 0abed3f2cbb459dffee905d937311afbf1cb9694..3bb3381cece5e01340c046d4f35f3142806407e3 100644
--- a/include/obj/NiLODData.h
+++ b/include/obj/NiLODData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLODNode.h b/include/obj/NiLODNode.h
index 58951cdc55c1fb3540fea2837b42a1412ff2105e..1b9469ec863234727815a3f5ed798841d79e69b8 100644
--- a/include/obj/NiLODNode.h
+++ b/include/obj/NiLODNode.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -74,10 +74,10 @@ public:
 protected:
 	NI_L_O_D_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLight.h b/include/obj/NiLight.h
index 76114b2cb9f3323c76a0ed1ee517199f115df1e0..5df57bb2ab82cd83188481df6f0dd6a0215b6ef8 100644
--- a/include/obj/NiLight.h
+++ b/include/obj/NiLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLightColorController.h b/include/obj/NiLightColorController.h
index 295419a25fea75c3fa42bc2f45704074540dcb9d..04c66612aa9ea886906bfbffd61fc010c8c3f477 100644
--- a/include/obj/NiLightColorController.h
+++ b/include/obj/NiLightColorController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_LIGHT_COLOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLightDimmerController.h b/include/obj/NiLightDimmerController.h
index bb2b2eac4a679597f61c190517f51c527a73d663..35e0b7a1e7fd9f04f561433521cd8b65a41db91c 100644
--- a/include/obj/NiLightDimmerController.h
+++ b/include/obj/NiLightDimmerController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_LIGHT_DIMMER_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLookAtController.h b/include/obj/NiLookAtController.h
index 0db231cc9a050c0414206f9cfad474602f180f1f..c494be8790af75efcb434e734b74bf7a41d3c690 100644
--- a/include/obj/NiLookAtController.h
+++ b/include/obj/NiLookAtController.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_LOOK_AT_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLookAtInterpolator.h b/include/obj/NiLookAtInterpolator.h
index be404d65322d8dcf5b6db84418df1bca679f335b..5be94f157212cf74d815852f0a9ef91f679f5e10 100644
--- a/include/obj/NiLookAtInterpolator.h
+++ b/include/obj/NiLookAtInterpolator.h
@@ -34,10 +34,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -67,10 +67,10 @@ public:
 protected:
 	NI_LOOK_AT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMaterialColorController.h b/include/obj/NiMaterialColorController.h
index 96af97a9a5530d40fb307e78c602960b38ab8094..795eccd06e67b732111ddc39066b06674e2d4bcb 100644
--- a/include/obj/NiMaterialColorController.h
+++ b/include/obj/NiMaterialColorController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MATERIAL_COLOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMaterialProperty.h b/include/obj/NiMaterialProperty.h
index e00a0fa3dc686cc461e689deba5db3e8de954e5f..867e2c29c1f7de53f8cc686898e6d25098933102 100644
--- a/include/obj/NiMaterialProperty.h
+++ b/include/obj/NiMaterialProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -58,10 +58,10 @@ public:
 protected:
 	NI_MATERIAL_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMeshPSysData.h b/include/obj/NiMeshPSysData.h
index 7c366a8d2354a7ad0736ecde68237aea53f75b0d..99da15a9fdce5c7044b3db41af21edff98452cbe 100644
--- a/include/obj/NiMeshPSysData.h
+++ b/include/obj/NiMeshPSysData.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MESH_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMeshParticleSystem.h b/include/obj/NiMeshParticleSystem.h
index 43db165f1a0ab655ca2cd2df80cd565304f365b3..45620e43487908c62a7a8b00feb2025b35db6d48 100644
--- a/include/obj/NiMeshParticleSystem.h
+++ b/include/obj/NiMeshParticleSystem.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MESH_PARTICLE_SYSTEM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMorphData.h b/include/obj/NiMorphData.h
index 0ed1c4cb9e3f32ce83c10b70ea4c10622b81ba27..8704a8a3d4900aecf8d80d229548e4a6bd8dedcb 100644
--- a/include/obj/NiMorphData.h
+++ b/include/obj/NiMorphData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the number of verticies used in the morph targets.  This must be the same as the number of verticies in the base mesh that the morph controller for which this block stores data is attatched.  This is not done automatically by Niflib.
@@ -102,10 +102,10 @@ public:
 protected:
 	NI_MORPH_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMultiTargetTransformController.h b/include/obj/NiMultiTargetTransformController.h
index eaf2f41d5a9086771dcb368930b30543a086a469..0d0fdd8653686d1d9374c1032da59c44a3e38bc7 100644
--- a/include/obj/NiMultiTargetTransformController.h
+++ b/include/obj/NiMultiTargetTransformController.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_MULTI_TARGET_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiNode.h b/include/obj/NiNode.h
index e5fc84df9e92e072a350f6d61a7ea2ee85f809e2..0367461e7dffcbee6d271ed2b41db7cba61716fc 100644
--- a/include/obj/NiNode.h
+++ b/include/obj/NiNode.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void AddChild( Ref<NiAVObject> obj );
@@ -106,10 +106,10 @@ protected:
 	list<NiSkinInstance*> skins;
 	NI_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiObject.h b/include/obj/NiObject.h
index 4a9a72005e0d04b81e58ce32d9dffc9cfc7ee930..98a8272bca2927de0027de032837c4d3602ed429 100644
--- a/include/obj/NiObject.h
+++ b/include/obj/NiObject.h
@@ -63,9 +63,9 @@ public:
 	NIFLIB_API bool IsDerivedType( const NiObject * objct ) const;
 
 	//Streaming Functions
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {}
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {}
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {}
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {}
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {}
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {}
 
 	//Reference Counting
 	NIFLIB_API void AddRef() const; //Should not be called directly
@@ -140,10 +140,10 @@ private:
 	list<NiObject*> _cross_refs;
 	static unsigned int objectsInMemory;
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiObjectNET.h b/include/obj/NiObjectNET.h
index 8b7d180ad7f95e52d31585005d1653dadb651c91..e48c1fd33c93d7f93bb9e177e96bfe496711deb0 100644
--- a/include/obj/NiObjectNET.h
+++ b/include/obj/NiObjectNET.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetName();
@@ -62,10 +62,10 @@ public:
 private:
 	NI_OBJECT_N_E_T_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysAgeDeathModifier.h b/include/obj/NiPSysAgeDeathModifier.h
index 95082eda636173eafec1b8cccab5924f2c1a1b4e..90a27613d6494715b4082c9fce7c176800114d1f 100644
--- a/include/obj/NiPSysAgeDeathModifier.h
+++ b/include/obj/NiPSysAgeDeathModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_AGE_DEATH_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBombModifier.h b/include/obj/NiPSysBombModifier.h
index eb328cd3c8cdad3483025ad6bc23171e17e48b58..17008e4be07635a79d7ea988edc8d82bbf4512e7 100644
--- a/include/obj/NiPSysBombModifier.h
+++ b/include/obj/NiPSysBombModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOMB_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBoundUpdateModifier.h b/include/obj/NiPSysBoundUpdateModifier.h
index da5313535639fbd029154684a5a279bd310b9793..56723f341e522d8d48aa0a86ead0aa7119692014 100644
--- a/include/obj/NiPSysBoundUpdateModifier.h
+++ b/include/obj/NiPSysBoundUpdateModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOUND_UPDATE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBoxEmitter.h b/include/obj/NiPSysBoxEmitter.h
index 011d12c00251ed315ec5404cfeb261a7b53dbb1d..322baf140d5226b2519235b3d4b55b25e5c3bb9e 100644
--- a/include/obj/NiPSysBoxEmitter.h
+++ b/include/obj/NiPSysBoxEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOX_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysColliderManager.h b/include/obj/NiPSysColliderManager.h
index 33d3ab2ab074a27c4b1e7ad94939f1785935b124..c2053595b8faaa32138e9e0ae7e9e8b4906a467c 100644
--- a/include/obj/NiPSysColliderManager.h
+++ b/include/obj/NiPSysColliderManager.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_COLLIDER_MANAGER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysColorModifier.h b/include/obj/NiPSysColorModifier.h
index bd1299f6edfe87e2ed34e5a4fd94fc0b4250f1c0..8d1a7e0b483772af38b811bd586ecd9d4a094660 100644
--- a/include/obj/NiPSysColorModifier.h
+++ b/include/obj/NiPSysColorModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_COLOR_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysCylinderEmitter.h b/include/obj/NiPSysCylinderEmitter.h
index d0f8b030c5d325c79c1366558af0e44a0ab48961..d58aeedc78917f24ef87db67049ce6ba3df52157 100644
--- a/include/obj/NiPSysCylinderEmitter.h
+++ b/include/obj/NiPSysCylinderEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_CYLINDER_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysData.h b/include/obj/NiPSysData.h
index 0c9812829169bf66f80ae564184c7695da86d1bd..96489fe04582adc0301425edef8ed6a7d604261a 100644
--- a/include/obj/NiPSysData.h
+++ b/include/obj/NiPSysData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysDragModifier.h b/include/obj/NiPSysDragModifier.h
index 2c3782967b452e62f2a9ccd272a18528c9dbba50..ae6553c018be400151c0cb35b530173ea5595a8f 100644
--- a/include/obj/NiPSysDragModifier.h
+++ b/include/obj/NiPSysDragModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_DRAG_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitter.h b/include/obj/NiPSysEmitter.h
index a3d75f78261d412f0d1ea5181cbb48be68367f37..5b945e9d4803e6fe9d443eb2ca40756eb4b4e982 100644
--- a/include/obj/NiPSysEmitter.h
+++ b/include/obj/NiPSysEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterCtlr.h b/include/obj/NiPSysEmitterCtlr.h
index 5823df6047b893da3847e224d269ce8e670bc7ac..c5c9fb0cf877a72c7714627963fb8e3afa30f097 100644
--- a/include/obj/NiPSysEmitterCtlr.h
+++ b/include/obj/NiPSysEmitterCtlr.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_P_SYS_EMITTER_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterCtlrData.h b/include/obj/NiPSysEmitterCtlrData.h
index 2f0d59f1f80d200f3aa91127ddc776f63d899a34..f925bf8b6a4898e2efecc4467f69a8b067bae8f0 100644
--- a/include/obj/NiPSysEmitterCtlrData.h
+++ b/include/obj/NiPSysEmitterCtlrData.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -51,10 +51,10 @@ public:
 protected:
 	NI_P_SYS_EMITTER_CTLR_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterDeclinationCtlr.h b/include/obj/NiPSysEmitterDeclinationCtlr.h
index 1399206253e53ff93311e45cfd042bdc6f69f4a6..c5fa2169725fdfc57d45e48a6aa671db4693ccbe 100644
--- a/include/obj/NiPSysEmitterDeclinationCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_DECLINATION_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterDeclinationVarCtlr.h b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
index 721785ba264608a6c1ce8bd994a7e85e4297bdf6..89e5947ab48e63a7ddac4fb64fc2c7e23f089263 100644
--- a/include/obj/NiPSysEmitterDeclinationVarCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_DECLINATION_VAR_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterInitialRadiusCtlr.h b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
index e57ec268d47d751471392cdb46f1b62bd813cf94..11d6ced2426629648c65039e25a18836fd12cbab 100644
--- a/include/obj/NiPSysEmitterInitialRadiusCtlr.h
+++ b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_INITIAL_RADIUS_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterLifeSpanCtlr.h b/include/obj/NiPSysEmitterLifeSpanCtlr.h
index 5245f50b1ab0f9c7da10779a327720bdafd3d1db..0f92ef92502b0bad25fb03268f6d1bc983dd2c15 100644
--- a/include/obj/NiPSysEmitterLifeSpanCtlr.h
+++ b/include/obj/NiPSysEmitterLifeSpanCtlr.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterSpeedCtlr.h b/include/obj/NiPSysEmitterSpeedCtlr.h
index a3044ced1321a1919e8fe326d78c4a3e5938f4b6..a45127f7c682836d3baf9a613fe65aa018bdf63d 100644
--- a/include/obj/NiPSysEmitterSpeedCtlr.h
+++ b/include/obj/NiPSysEmitterSpeedCtlr.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_SPEED_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGravityModifier.h b/include/obj/NiPSysGravityModifier.h
index 79b45f26f92348f7ddcf03f6a4f6e2fc091ddc27..091f51ef82d7cf30eb1f21f1da1fbce3ccd26162 100644
--- a/include/obj/NiPSysGravityModifier.h
+++ b/include/obj/NiPSysGravityModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GRAVITY_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGravityStrengthCtlr.h b/include/obj/NiPSysGravityStrengthCtlr.h
index 32ef22dd70e4a3eb2f4ce13c65d093b76682ae9c..0f3aa7e5c9c51d3537469fc73bb803f4e872319d 100644
--- a/include/obj/NiPSysGravityStrengthCtlr.h
+++ b/include/obj/NiPSysGravityStrengthCtlr.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GRAVITY_STRENGTH_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGrowFadeModifier.h b/include/obj/NiPSysGrowFadeModifier.h
index d554bc8f4317e8e6232a6b553b846601457cb97c..a4c930d8cf04beec6c3869afaec6995d7733730c 100644
--- a/include/obj/NiPSysGrowFadeModifier.h
+++ b/include/obj/NiPSysGrowFadeModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GROW_FADE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysMeshEmitter.h b/include/obj/NiPSysMeshEmitter.h
index da0e1bf77061b3eb5c21a9230d8a574513798410..a98aec5369f17e139f518e4cfc016f904767783b 100644
--- a/include/obj/NiPSysMeshEmitter.h
+++ b/include/obj/NiPSysMeshEmitter.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MESH_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysMeshUpdateModifier.h b/include/obj/NiPSysMeshUpdateModifier.h
index 345331670df0819954b2a8037bc51314690f0c60..6545240e5acb66e18857a6a8758b9dbe7f89e584 100644
--- a/include/obj/NiPSysMeshUpdateModifier.h
+++ b/include/obj/NiPSysMeshUpdateModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MESH_UPDATE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysModifier.h b/include/obj/NiPSysModifier.h
index 7c9db3abd97aa0a0096c2299026bf6cc0f978234..2acafa5d4ca0ad78e799a661b1272e0cb65a9240 100644
--- a/include/obj/NiPSysModifier.h
+++ b/include/obj/NiPSysModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysModifierActiveCtlr.h b/include/obj/NiPSysModifierActiveCtlr.h
index da7f7874f6c778d575a37c956438ccddd69cfbb4..a0749ad7d0fe5288807c26f5e7488120c6b9b65f 100644
--- a/include/obj/NiPSysModifierActiveCtlr.h
+++ b/include/obj/NiPSysModifierActiveCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MODIFIER_ACTIVE_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysPlanarCollider.h b/include/obj/NiPSysPlanarCollider.h
index 89643ed493d568d3f9ec650dce9d1523bd3363d3..a67254480680c66fff3eb55dd3a90048d32f01e6 100644
--- a/include/obj/NiPSysPlanarCollider.h
+++ b/include/obj/NiPSysPlanarCollider.h
@@ -34,19 +34,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_PLANAR_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysPositionModifier.h b/include/obj/NiPSysPositionModifier.h
index 249cb44530774d062842b50fe41fe7b4120937d6..9c02f193da8c380d6c063102fda5e168e14e60c6 100644
--- a/include/obj/NiPSysPositionModifier.h
+++ b/include/obj/NiPSysPositionModifier.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_POSITION_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysResetOnLoopCtlr.h b/include/obj/NiPSysResetOnLoopCtlr.h
index 636fe9bd638a9b92b721145273f85b5817e595f9..c331bfd0aea253cc86e1af1fd8913c421289aa52 100644
--- a/include/obj/NiPSysResetOnLoopCtlr.h
+++ b/include/obj/NiPSysResetOnLoopCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_RESET_ON_LOOP_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysRotationModifier.h b/include/obj/NiPSysRotationModifier.h
index ac58a8233ba0e8b3b87b8fe0efb369761e46e9c9..0c3ba6ca2b1efb746cd9050fc43c33969d9f280c 100644
--- a/include/obj/NiPSysRotationModifier.h
+++ b/include/obj/NiPSysRotationModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_ROTATION_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysSpawnModifier.h b/include/obj/NiPSysSpawnModifier.h
index 0e6aaaded4540694bc25beccdcb65dd91a4464f0..dfd7b70795d439d056844b674e15f610a061a871 100644
--- a/include/obj/NiPSysSpawnModifier.h
+++ b/include/obj/NiPSysSpawnModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_SPAWN_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysSphereEmitter.h b/include/obj/NiPSysSphereEmitter.h
index 5c1341d96c0fc9e60d90fb0ab571816cee0e12c7..43a0fe7706b8fb833817d53eac0862e2d142fb30 100644
--- a/include/obj/NiPSysSphereEmitter.h
+++ b/include/obj/NiPSysSphereEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_SPHERE_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysUpdateCtlr.h b/include/obj/NiPSysUpdateCtlr.h
index e1803af581752983cf3a3df6c1da5da0d603d3aa..7e9995f41b38be185b0db07c805aaaa03524af6c 100644
--- a/include/obj/NiPSysUpdateCtlr.h
+++ b/include/obj/NiPSysUpdateCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_UPDATE_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysVolumeEmitter.h b/include/obj/NiPSysVolumeEmitter.h
index 07899d10f221f98b9cb14ccfc219a68c19104432..d47ea75aa6ad35d28451b2e3edc92383963b9d94 100644
--- a/include/obj/NiPSysVolumeEmitter.h
+++ b/include/obj/NiPSysVolumeEmitter.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_VOLUME_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPalette.h b/include/obj/NiPalette.h
index 29cfbd8b779c91b66fd11c7185112e0cfeb7e86e..c658080716defc36819758b405703946bfc79eb4 100644
--- a/include/obj/NiPalette.h
+++ b/include/obj/NiPalette.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the palette data from this palette block.
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleBomb.h b/include/obj/NiParticleBomb.h
index 642c39398e9216427bbe90c36b47cf57ec8b22e3..a78d396c199504193de59a274f3208f0bbc3859e 100644
--- a/include/obj/NiParticleBomb.h
+++ b/include/obj/NiParticleBomb.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_BOMB_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleColorModifier.h b/include/obj/NiParticleColorModifier.h
index 1eab23100e5e4e723958ed8f987a713168d651bc..4e331acd421558a5bae8ac6fd02886434f90e162 100644
--- a/include/obj/NiParticleColorModifier.h
+++ b/include/obj/NiParticleColorModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_COLOR_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleGrowFade.h b/include/obj/NiParticleGrowFade.h
index 9fd0ed41b5d77ffeb485c8112b0d75ba8c90b038..4468e835a038cc3c236ddadbb894ef6e7c7240d5 100644
--- a/include/obj/NiParticleGrowFade.h
+++ b/include/obj/NiParticleGrowFade.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_GROW_FADE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshModifier.h b/include/obj/NiParticleMeshModifier.h
index 0901873abefe0f207f9404806608f38ebdebf938..0f8991b8272895d529c31b549327ba91b8ded4d4 100644
--- a/include/obj/NiParticleMeshModifier.h
+++ b/include/obj/NiParticleMeshModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESH_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshes.h b/include/obj/NiParticleMeshes.h
index bc67dd7ada7bb9ac8e229c091f118796de8ed229..d85a94cc6fe5cbda186b271882bb3849ed558056 100644
--- a/include/obj/NiParticleMeshes.h
+++ b/include/obj/NiParticleMeshes.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESHES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshesData.h b/include/obj/NiParticleMeshesData.h
index a72da38b31932a2c72598cb8c5ec37e1f3e3809c..a4b2c32e669aade06362fbf265d2f0fc158ba593 100644
--- a/include/obj/NiParticleMeshesData.h
+++ b/include/obj/NiParticleMeshesData.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESHES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleRotation.h b/include/obj/NiParticleRotation.h
index 377be562e006158b61ec7a0115791446407765a6..842c049583da8dc74f3881a06a9a7270422288ff 100644
--- a/include/obj/NiParticleRotation.h
+++ b/include/obj/NiParticleRotation.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_ROTATION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleSystem.h b/include/obj/NiParticleSystem.h
index 00a366826c9ebc16d3e2562cf68ba1f7a97a690a..375c2498a0fec1a4924fdb1286a97c56c77fc524 100644
--- a/include/obj/NiParticleSystem.h
+++ b/include/obj/NiParticleSystem.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_SYSTEM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleSystemController.h b/include/obj/NiParticleSystemController.h
index 676f87f1d774fd365218c5aa43f81d5237ced2f5..5563bf777a12a5dcd32e832d5e402e4b67af29ab 100644
--- a/include/obj/NiParticleSystemController.h
+++ b/include/obj/NiParticleSystemController.h
@@ -35,20 +35,20 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This controller is not a priority and it has a lot of unknown data.
 protected:
 	NI_PARTICLE_SYSTEM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticles.h b/include/obj/NiParticles.h
index a1b3957b460b770ca3ca329854220c8fe061d91f..72c0d0f7e5940e656e8b04750e8308de62c8c7d0 100644
--- a/include/obj/NiParticles.h
+++ b/include/obj/NiParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticlesData.h b/include/obj/NiParticlesData.h
index 6beecd78eeb8ea783eb875543088b0a35a0bffac..fceadde10c883d9ac0c1d9ff9e96328d25a75b09 100644
--- a/include/obj/NiParticlesData.h
+++ b/include/obj/NiParticlesData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPathController.h b/include/obj/NiPathController.h
index 5ded1879f7424979d152216710c1a6e727da3889..f4602a80f31662b9af3396869fc34053042c43b4 100644
--- a/include/obj/NiPathController.h
+++ b/include/obj/NiPathController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This class has a lot of unknown data
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_PATH_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPathInterpolator.h b/include/obj/NiPathInterpolator.h
index b02c37bc19a303d6004ea125c258289e0318342e..2e48e4c9a4a435f382f70c1a216d3d5858b1f0af 100644
--- a/include/obj/NiPathInterpolator.h
+++ b/include/obj/NiPathInterpolator.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_PATH_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPixelData.h b/include/obj/NiPixelData.h
index 9f9b67b3a6a37eab916d639b3deb0011a59f3b5b..d979a8efade49c636c7a3abb428293c9309cc0f6 100644
--- a/include/obj/NiPixelData.h
+++ b/include/obj/NiPixelData.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the height of the texture image stored in this block.
@@ -81,10 +81,10 @@ public:
 protected:
 	NI_PIXEL_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPlanarCollider.h b/include/obj/NiPlanarCollider.h
index 3b8b1461865d6ac12ea81026c207843e4b44f925..a2e0d24495dff77ec2678ab976f26cd8cd133aa6 100644
--- a/include/obj/NiPlanarCollider.h
+++ b/include/obj/NiPlanarCollider.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PLANAR_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPoint3Interpolator.h b/include/obj/NiPoint3Interpolator.h
index 45a78e41b9403e61c60c31635de4c8acb4a8df64..201a4de0af1ae72f941818bc78d0b050757c571a 100644
--- a/include/obj/NiPoint3Interpolator.h
+++ b/include/obj/NiPoint3Interpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPointLight.h b/include/obj/NiPointLight.h
index 5e631746440dca37259302eda8bfb2493c85eb6b..fcf59ba74ff4f14268dd8e4c31ccc0d6a793a4cf 100644
--- a/include/obj/NiPointLight.h
+++ b/include/obj/NiPointLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_POINT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPosData.h b/include/obj/NiPosData.h
index db7eabf7ce2a049168b56b47b911e05cfffba942..eaf4acffe6acdff5ab9094c49b0a8ed191da429b 100644
--- a/include/obj/NiPosData.h
+++ b/include/obj/NiPosData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of position interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_POS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiProperty.h b/include/obj/NiProperty.h
index 1a2bc88d42fa575f8e7a58db598cf7826d558cfb..feed68035bf9ac2ea22c9e4870db28656df6ef6d 100644
--- a/include/obj/NiProperty.h
+++ b/include/obj/NiProperty.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRangeLODData.h b/include/obj/NiRangeLODData.h
index 92c51523fed807bbec369ab43975421312a2f515..c6d69fa50d81028855833847944993abfecb17da 100644
--- a/include/obj/NiRangeLODData.h
+++ b/include/obj/NiRangeLODData.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_RANGE_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRotatingParticles.h b/include/obj/NiRotatingParticles.h
index aa016c8ec169b96624884b561c2eec2e86b7c878..ab8a32404f5e12d8f1a122ecec8fdcd0b7e0a3e8 100644
--- a/include/obj/NiRotatingParticles.h
+++ b/include/obj/NiRotatingParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ROTATING_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRotatingParticlesData.h b/include/obj/NiRotatingParticlesData.h
index 5944c407e0fae01107721a06132996ae6c5050d4..e88ab9602e7266f69a72264944194b555b085228 100644
--- a/include/obj/NiRotatingParticlesData.h
+++ b/include/obj/NiRotatingParticlesData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ROTATING_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiScreenLODData.h b/include/obj/NiScreenLODData.h
index 43fffcb3e06cbc631f6438bd3b49756b060ef28c..67874bcf463c1da1edad5f3fbd0cc655d56b0776 100644
--- a/include/obj/NiScreenLODData.h
+++ b/include/obj/NiScreenLODData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -86,10 +86,10 @@ public:
 protected:
 	NI_SCREEN_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSequenceStreamHelper.h b/include/obj/NiSequenceStreamHelper.h
index eabbf6a118032674468de7bdcca4b75fad542905..f41a39e16b5f7e8a4fe4a36380662a216b1b2e77 100644
--- a/include/obj/NiSequenceStreamHelper.h
+++ b/include/obj/NiSequenceStreamHelper.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_SEQUENCE_STREAM_HELPER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiShadeProperty.h b/include/obj/NiShadeProperty.h
index f73a21e4dbc4fb39fea481cd1dfded2dbc9d6265..c097ac25299d630335872704144b2a64d496681d 100644
--- a/include/obj/NiShadeProperty.h
+++ b/include/obj/NiShadeProperty.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_SHADE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSingleInterpolatorController.h b/include/obj/NiSingleInterpolatorController.h
index d3c733444e24e2bbbb5fb6d0d8d19a9b020e371e..ada6f8f94210a436105e42fec1259fbc1900da79 100644
--- a/include/obj/NiSingleInterpolatorController.h
+++ b/include/obj/NiSingleInterpolatorController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_SINGLE_INTERPOLATOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinData.h b/include/obj/NiSkinData.h
index c730b346492e186f28f4cd05df76262acba1cf5d..d4978f0ca39cd485db88f2b6fe6cbd0075424487 100644
--- a/include/obj/NiSkinData.h
+++ b/include/obj/NiSkinData.h
@@ -41,10 +41,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void ResetOffsets( const Ref<NiGeometry> & owner );
@@ -63,10 +63,10 @@ public:
 protected:
 	NI_SKIN_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinInstance.h b/include/obj/NiSkinInstance.h
index 114f6bab75911988cec6b3abc3d920b31d8be960..764ca5ec6e62596c2e16cb94c10643abc7079f58 100644
--- a/include/obj/NiSkinInstance.h
+++ b/include/obj/NiSkinInstance.h
@@ -43,10 +43,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned int GetBoneCount() const;
@@ -68,10 +68,10 @@ public:
 protected:
 	NI_SKIN_INSTANCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinPartition.h b/include/obj/NiSkinPartition.h
index a7ec07699011f3b92f7d2c1ddefe68ed3c75b865..9a18e8b44d0a875383ec8e0cd0e307b6dc290294 100644
--- a/include/obj/NiSkinPartition.h
+++ b/include/obj/NiSkinPartition.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API int GetNumPartitions() const;
@@ -113,10 +113,10 @@ protected:
 protected:
 	NI_SKIN_PARTITION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSourceTexture.h b/include/obj/NiSourceTexture.h
index 1ea1223080d43e5d852a5ed80e1dc4beb01e68dc..5c4549bcae0f5f55f37f0004b668219a9f3a6fee 100644
--- a/include/obj/NiSourceTexture.h
+++ b/include/obj/NiSourceTexture.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API bool IsTextureExternal ();
@@ -70,10 +70,10 @@ public:
 protected:
 	NI_SOURCE_TEXTURE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSpecularProperty.h b/include/obj/NiSpecularProperty.h
index 520b155277b611fd1e9f1d4bfe78e8b4a0cc85a8..39d1dcf63856e6d7c32291d6d4e74c6144d6b123 100644
--- a/include/obj/NiSpecularProperty.h
+++ b/include/obj/NiSpecularProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_SPECULAR_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSphericalCollider.h b/include/obj/NiSphericalCollider.h
index 4888e7b42f1f0d3166c3a02d69d699e2b5eb6ded..763317c1f01179123e4eeebaf8280f64a970ec66 100644
--- a/include/obj/NiSphericalCollider.h
+++ b/include/obj/NiSphericalCollider.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_SPHERICAL_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSpotLight.h b/include/obj/NiSpotLight.h
index 556415834c637462b9ecd5884b3294c024759142..c9d2ab05093570d4052a9b89b50eb10a229e57c0 100644
--- a/include/obj/NiSpotLight.h
+++ b/include/obj/NiSpotLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_SPOT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStencilProperty.h b/include/obj/NiStencilProperty.h
index b72843f0ca106f4e32f8b43823061572b73a3017..abee4c4d84883b4b8b04bcd09514d69661fd41a7 100644
--- a/include/obj/NiStencilProperty.h
+++ b/include/obj/NiStencilProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -90,10 +90,10 @@ public:
 protected:
 	NI_STENCIL_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringExtraData.h b/include/obj/NiStringExtraData.h
index e978ec1da962a65cc54b16e72907ef97afdf955f..a1f62ecfeaa7d38f2afcf0e668721fd46ec6cbfc 100644
--- a/include/obj/NiStringExtraData.h
+++ b/include/obj/NiStringExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetData() const;
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_STRING_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringPalette.h b/include/obj/NiStringPalette.h
index f2546924abaf0701235d2b3a4acd33ca97198260..329e25d6bf9213771034e800256a42e99f34e7de 100644
--- a/include/obj/NiStringPalette.h
+++ b/include/obj/NiStringPalette.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetPaletteString() const;
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_STRING_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringsExtraData.h b/include/obj/NiStringsExtraData.h
index 76fcb15b833899f65ce10651a764113237893d18..e1a3abbe9f8753500f89a72cfbf4f1a409fbedf1 100644
--- a/include/obj/NiStringsExtraData.h
+++ b/include/obj/NiStringsExtraData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<string> GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_STRINGS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextKeyExtraData.h b/include/obj/NiTextKeyExtraData.h
index fa1dd0e5110573c867ef2485d44757f71e864eaf..ba61095f25625ffac9cbd90acdf64a60e7c63b70 100644
--- a/include/obj/NiTextKeyExtraData.h
+++ b/include/obj/NiTextKeyExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the text note key data.
@@ -50,10 +50,10 @@ public:
 protected:
 	NI_TEXT_KEY_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureEffect.h b/include/obj/NiTextureEffect.h
index baddb7ee1a27a05c4789aea6985c7d4f1637f742..596ed37e3100bb929ab7a0573edabc88ad14bd2c 100644
--- a/include/obj/NiTextureEffect.h
+++ b/include/obj/NiTextureEffect.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -109,10 +109,10 @@ public:
 protected:
 	NI_TEXTURE_EFFECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureModeProperty.h b/include/obj/NiTextureModeProperty.h
index 4d0fa46cf53a704fb0aaba5c1e3bd30f91734381..655622e1e0901a8b60ba2a4f7900adc813715c15 100644
--- a/include/obj/NiTextureModeProperty.h
+++ b/include/obj/NiTextureModeProperty.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_MODE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureProperty.h b/include/obj/NiTextureProperty.h
index 7b62f2869966fbe943e4d22baef0aab249f69708..033110481fba5645bc3ffa03bd7911bb2f295bde 100644
--- a/include/obj/NiTextureProperty.h
+++ b/include/obj/NiTextureProperty.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureTransformController.h b/include/obj/NiTextureTransformController.h
index cdc2561fd0c5acb9d08c5300caedec9351047b83..0bf12570934244177f4e551aacec40d7dbcdc50c 100644
--- a/include/obj/NiTextureTransformController.h
+++ b/include/obj/NiTextureTransformController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTexturingProperty.h b/include/obj/NiTexturingProperty.h
index 0a0594011fabacc82e5d0a194cadc1e9248e9e2c..787c8f53bf45e175e855baed2a368fe294a30250 100644
--- a/include/obj/NiTexturingProperty.h
+++ b/include/obj/NiTexturingProperty.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the number of texture slots defined by this texturing propery.  Texture slots may or may not actually contain textures, but each slot has a different meaning so the way a texture is used is dependant upon which slot it is in.
@@ -147,10 +147,10 @@ public:
 protected:
 	NI_TEXTURING_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTimeController.h b/include/obj/NiTimeController.h
index 11091478d423cc1684e86c2cc96868a3eb6865f1..b34a646b4efedd5dbffbdf05f4140ce55504df32 100644
--- a/include/obj/NiTimeController.h
+++ b/include/obj/NiTimeController.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! 
@@ -80,10 +80,10 @@ public:
 protected:
 	NI_TIME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformController.h b/include/obj/NiTransformController.h
index f86a5a5087ba9e1ab3510e0026265d9fad3d9da8..5a0a1c74cdd3ec8c1affd9a8f297f9c7fdf5aaab 100644
--- a/include/obj/NiTransformController.h
+++ b/include/obj/NiTransformController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformData.h b/include/obj/NiTransformData.h
index 31e7546d2f59bb0a9649c28d81b2385153df4292..94f2dcb25501191dbb24d4e0ae341bd97739f181 100644
--- a/include/obj/NiTransformData.h
+++ b/include/obj/NiTransformData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRANSFORM_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformInterpolator.h b/include/obj/NiTransformInterpolator.h
index 9d4b2f065db29576d562e6ce5a6437d7dbdfc9cb..4c6d852f8dbd89eea128b2a68aef34d787139232 100644
--- a/include/obj/NiTransformInterpolator.h
+++ b/include/obj/NiTransformInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -65,10 +65,10 @@ public:
 protected:
 	NI_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriBasedGeom.h b/include/obj/NiTriBasedGeom.h
index 85761776e4380da330b5015b3c8ad18252b4dad9..98176509e18ecf229fb78a27ed46fa352bbeb52e 100644
--- a/include/obj/NiTriBasedGeom.h
+++ b/include/obj/NiTriBasedGeom.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void GenHardwareSkinInfo( int max_bones_per_partition = 4, int max_bones_per_vertex = 4 );
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_TRI_BASED_GEOM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriBasedGeomData.h b/include/obj/NiTriBasedGeomData.h
index b599b811b3c2c81a74d1fe8934676a9f67a61edd..b681ae6c79cac828dfb9dcae4f59b18466b48108 100644
--- a/include/obj/NiTriBasedGeomData.h
+++ b/include/obj/NiTriBasedGeomData.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 
@@ -55,10 +55,10 @@ public:
 protected:
 	NI_TRI_BASED_GEOM_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriShape.h b/include/obj/NiTriShape.h
index 565ec1b92fcebcbec9e85689ddcb891d329d784d..fb5ed0f93f9dc50aac6cbef57cba5ba32972d6f5 100644
--- a/include/obj/NiTriShape.h
+++ b/include/obj/NiTriShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRI_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriShapeData.h b/include/obj/NiTriShapeData.h
index 3fce4bf13a544f07fb3ebf2f8734580bfd2258f1..ce02568d2af4fac25657c16826ae91920c2446a1 100644
--- a/include/obj/NiTriShapeData.h
+++ b/include/obj/NiTriShapeData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 public:
 
@@ -78,10 +78,10 @@ public:
 protected:
 	NI_TRI_SHAPE_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriStrips.h b/include/obj/NiTriStrips.h
index 817db6cdf5cbd2e640b7e86ef6934f3bd00252bf..e3d71f47b69e1006bab50bfa75de89ea92613158 100644
--- a/include/obj/NiTriStrips.h
+++ b/include/obj/NiTriStrips.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRI_STRIPS_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriStripsData.h b/include/obj/NiTriStripsData.h
index e59f78c46fdc3c488b087d10da3807a3388bbea1..e5e4a07deb97206446324d3a2cf04251902c5014 100644
--- a/include/obj/NiTriStripsData.h
+++ b/include/obj/NiTriStripsData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API NiTriStripsData(const vector<Triangle> &tris, bool nvtristrips = true);
@@ -86,10 +86,10 @@ private:
 protected:
 	NI_TRI_STRIPS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiUVController.h b/include/obj/NiUVController.h
index ef363a080f131c7fd7fd89bcbb9c21ecac19c9c2..b540a142c45ec94678fd08ba9b915e5999e56bd0 100644
--- a/include/obj/NiUVController.h
+++ b/include/obj/NiUVController.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This class has an unknown member
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_U_V_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiUVData.h b/include/obj/NiUVData.h
index 0528d63016177e2349ab385c32d702135629f868..128b52e92702fdbdd20eb8d0497327bef76936db 100644
--- a/include/obj/NiUVData.h
+++ b/include/obj/NiUVData.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_U_V_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVectorExtraData.h b/include/obj/NiVectorExtraData.h
index 78284f415bba6b94393493f1b5fd7556a7d1d4a5..1e26b416892fa2ed33f42b13ef88b5fc89102cdf 100644
--- a/include/obj/NiVectorExtraData.h
+++ b/include/obj/NiVectorExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Vector3 GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_VECTOR_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVertWeightsExtraData.h b/include/obj/NiVertWeightsExtraData.h
index 148df32ff6a1c8607929eb77e2896c68f1e68279..49006dbf8fb8f045adcbac8051819c72371b179a 100644
--- a/include/obj/NiVertWeightsExtraData.h
+++ b/include/obj/NiVertWeightsExtraData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<float> GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_VERT_WEIGHTS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVertexColorProperty.h b/include/obj/NiVertexColorProperty.h
index 97bca861977ce302dd3e1b46ed8e3fed0b45a2e1..e8efb86a2c998dfb810fa3cf0cd70c7c033241f6 100644
--- a/include/obj/NiVertexColorProperty.h
+++ b/include/obj/NiVertexColorProperty.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_VERTEX_COLOR_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVisController.h b/include/obj/NiVisController.h
index e6e2997805a58a1a1b519f5c50255d0fc266ff4d..c308fc97613997f1aff72b4fa32005900427b0b4 100644
--- a/include/obj/NiVisController.h
+++ b/include/obj/NiVisController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_VIS_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVisData.h b/include/obj/NiVisData.h
index 73fb18fc9d6166f49caebc9e1767fa3aeb06227a..d29dcf1496505678e3e62e546c2f1e10b5307138 100644
--- a/include/obj/NiVisData.h
+++ b/include/obj/NiVisData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_VIS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiWireframeProperty.h b/include/obj/NiWireframeProperty.h
index 262bbf0651f237913fa252617a5314b1ad2dcde0..dcd706203062023e76a3a821ca7f6e01427fe262 100644
--- a/include/obj/NiWireframeProperty.h
+++ b/include/obj/NiWireframeProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_WIREFRAME_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiZBufferProperty.h b/include/obj/NiZBufferProperty.h
index 4306319904c6eae9edd5e3b589f2f67f1edc5a84..386197332697aca22f65a8cf7ee831c3c216e541 100644
--- a/include/obj/NiZBufferProperty.h
+++ b/include/obj/NiZBufferProperty.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -43,10 +43,10 @@ public:
 protected:
 	NI_Z_BUFFER_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/RootCollisionNode.h b/include/obj/RootCollisionNode.h
index e04143a8d5ce6e7e27df396e3094cf1fe62e4b24..2b1755d65e860b33a69a8bed2a869fb538f41973 100644
--- a/include/obj/RootCollisionNode.h
+++ b/include/obj/RootCollisionNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ROOT_COLLISION_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBlendCollisionObject.h b/include/obj/bhkBlendCollisionObject.h
index 6f5b305bba2ddb32050b67d9dcc4c89fff2fb5a1..fb04d64f7d4f96646260dd9cbe09211479f4bb7a 100644
--- a/include/obj/bhkBlendCollisionObject.h
+++ b/include/obj/bhkBlendCollisionObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_BLEND_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBlendController.h b/include/obj/bhkBlendController.h
index 8ac43901a3caceae7a254dff70f979389a39035d..ade96a5509e693263bdcb7d22e4ddf7cc8c02a91 100644
--- a/include/obj/bhkBlendController.h
+++ b/include/obj/bhkBlendController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_BLEND_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBoxShape.h b/include/obj/bhkBoxShape.h
index ad96b7ec0e0bf068f07c6d6949a7a409928206e8..13c081ae5aa3fc9d069b3ab74b4deae17fb2b23a 100644
--- a/include/obj/bhkBoxShape.h
+++ b/include/obj/bhkBoxShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	BHK_BOX_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkCapsuleShape.h b/include/obj/bhkCapsuleShape.h
index a46e5200168f9d46c514e1693a1886f96c178948..50f1fc57743276906001d703595ebd3890a3195c 100644
--- a/include/obj/bhkCapsuleShape.h
+++ b/include/obj/bhkCapsuleShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -66,10 +66,10 @@ public:
 protected:
 	BHK_CAPSULE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkCollisionObject.h b/include/obj/bhkCollisionObject.h
index e27fe24ab0bdd263a8bcc88740c3f0ac2cc5cbcd..db4d1b53ccbf4f12434de020b803112c013ae93c 100644
--- a/include/obj/bhkCollisionObject.h
+++ b/include/obj/bhkCollisionObject.h
@@ -25,20 +25,20 @@ public:
 private:
 	static const Type TYPE;
 public:
-	virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_API virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_API virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_API virtual list<NiObjectRef> GetRefs() const;
 	NIFLIB_API virtual const Type & GetType() const;
 
 protected:
 	BHK_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexShape.h b/include/obj/bhkConvexShape.h
index bf0d686dd87859c0fc96840ca7104a400cdee94a..0ee275ab1b537156fc7d276d750ef14cc58ca9f3 100644
--- a/include/obj/bhkConvexShape.h
+++ b/include/obj/bhkConvexShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexTransformShape.h b/include/obj/bhkConvexTransformShape.h
index 1c15634f749774ccf8e7541c27890ee8f09a88c6..46152171b7e020a09b6aa934966c457af6778787 100644
--- a/include/obj/bhkConvexTransformShape.h
+++ b/include/obj/bhkConvexTransformShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_TRANSFORM_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexVerticesShape.h b/include/obj/bhkConvexVerticesShape.h
index f7064080d626b9c56e81af4f651f7927feca9a56..ae5b198ba2f45c98189501422c2312c62f75a780 100644
--- a/include/obj/bhkConvexVerticesShape.h
+++ b/include/obj/bhkConvexVerticesShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_VERTICES_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkEntity.h b/include/obj/bhkEntity.h
index 267aaca01562613aec9cc89ec855b3ab33b82e58..ab970b93fe40ac4ed6adb9f55505c6b0a815b525 100644
--- a/include/obj/bhkEntity.h
+++ b/include/obj/bhkEntity.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -111,10 +111,10 @@ public:
 protected:
 	BHK_ENTITY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkHingeConstraint.h b/include/obj/bhkHingeConstraint.h
index dc28028cf3ba5333b738b6b8367b46dd99ef48f9..7e8f9ae502ecbc2d8267bc2466fe7f2f8c748245 100644
--- a/include/obj/bhkHingeConstraint.h
+++ b/include/obj/bhkHingeConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_HINGE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkLimitedHingeConstraint.h b/include/obj/bhkLimitedHingeConstraint.h
index 144a308541e1f9f7db70c5c738647f606e71ffa3..cd8caf8be8b6b093bef096bb609f65b3bb1dcf31 100644
--- a/include/obj/bhkLimitedHingeConstraint.h
+++ b/include/obj/bhkLimitedHingeConstraint.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_LIMITED_HINGE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkListShape.h b/include/obj/bhkListShape.h
index 212df36f6c9fbbffa6a05454b6b0a6e60bc71936..2e4603757c59871ce39ae3d19222c0b990b3aae4 100644
--- a/include/obj/bhkListShape.h
+++ b/include/obj/bhkListShape.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_LIST_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMalleableConstraint.h b/include/obj/bhkMalleableConstraint.h
index 181bcd55a96337f31a76ea9eccc881da6406715d..4d98f6630bc2cb7dc060f1f44b237df93f3a5bf5 100644
--- a/include/obj/bhkMalleableConstraint.h
+++ b/include/obj/bhkMalleableConstraint.h
@@ -34,19 +34,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_MALLEABLE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMoppBvTreeShape.h b/include/obj/bhkMoppBvTreeShape.h
index eff4f8df77d0454aa2c192e8ca979b4475307c38..66694f89333ad5231a32642e7ea99f3a6a823510 100644
--- a/include/obj/bhkMoppBvTreeShape.h
+++ b/include/obj/bhkMoppBvTreeShape.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_MOPP_BV_TREE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMultiSphereShape.h b/include/obj/bhkMultiSphereShape.h
index 22aec99a398209248c4d849cf28cb3ebed48f0bd..4d8d870f048522e8f90581582397d8b157853732 100644
--- a/include/obj/bhkMultiSphereShape.h
+++ b/include/obj/bhkMultiSphereShape.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -44,10 +44,10 @@ public:
 protected:
 	BHK_MULTI_SPHERE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkNiTriStripsShape.h b/include/obj/bhkNiTriStripsShape.h
index 6dbd07a491dd82e410e0cf9b47b7fe92713de402..aed18b636b701d2b1e322a1bf3cbc4273a4c06a8 100644
--- a/include/obj/bhkNiTriStripsShape.h
+++ b/include/obj/bhkNiTriStripsShape.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -51,10 +51,10 @@ public:
 protected:
 	BHK_NI_TRI_STRIPS_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkPackedNiTriStripsShape.h b/include/obj/bhkPackedNiTriStripsShape.h
index 19129e0cf06e512cdd73405eb027952620a73715..77d77a87a270398e4496e60eaaf2e0e6f3ff7e4e 100644
--- a/include/obj/bhkPackedNiTriStripsShape.h
+++ b/include/obj/bhkPackedNiTriStripsShape.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_PACKED_NI_TRI_STRIPS_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkPrismaticConstraint.h b/include/obj/bhkPrismaticConstraint.h
index 3d806f0763e9751bc1eab4c2745b4fa938875bab..bbfff378def0e3f1088148ccee0a79ca25d35f2c 100644
--- a/include/obj/bhkPrismaticConstraint.h
+++ b/include/obj/bhkPrismaticConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_PRISMATIC_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRagdollConstraint.h b/include/obj/bhkRagdollConstraint.h
index 0c2999841ea02699ee847b4527a013d95d137333..eb574d18ee9cc9fc45e3b72a8518fa6af553e3b6 100644
--- a/include/obj/bhkRagdollConstraint.h
+++ b/include/obj/bhkRagdollConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_RAGDOLL_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRefObject.h b/include/obj/bhkRefObject.h
index fe98e9b28e5f4435c739d10f6da70a51ada079cf..79b09667e98ff30443f111f3b2360abfb3fe39a4 100644
--- a/include/obj/bhkRefObject.h
+++ b/include/obj/bhkRefObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_REF_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRigidBody.h b/include/obj/bhkRigidBody.h
index 9a66ac409a433986a3183702791cfd7722ae0d76..d995a9f95b57ddaf289602dac3e7d381069ca148 100644
--- a/include/obj/bhkRigidBody.h
+++ b/include/obj/bhkRigidBody.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -162,10 +162,10 @@ public:
 protected:
 	BHK_RIGID_BODY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRigidBodyT.h b/include/obj/bhkRigidBodyT.h
index 10254fcc0b01bc155179797035aba0cab77cae05..a634c6a4efc15b2b1b0673e493e182a9ccbe6dcf 100644
--- a/include/obj/bhkRigidBodyT.h
+++ b/include/obj/bhkRigidBodyT.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_RIGID_BODY_T_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSPCollisionObject.h b/include/obj/bhkSPCollisionObject.h
index dae17cff7c5c92b47bd16ea69873f0ad338743f4..46e8e34e751ccdba8ce77d91adc0db6e9101c571 100644
--- a/include/obj/bhkSPCollisionObject.h
+++ b/include/obj/bhkSPCollisionObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_S_P_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSerializable.h b/include/obj/bhkSerializable.h
index 7cd89a568617d9a7d90b3de5fc16001621e22bb7..ac35ec4eb536eb7cb99229c8394f356886d20efa 100644
--- a/include/obj/bhkSerializable.h
+++ b/include/obj/bhkSerializable.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SERIALIZABLE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkShape.h b/include/obj/bhkShape.h
index 953d61dddd781ad3be02972f58495a57cd1d4a22..969e8029dce66a51d05f9cd9be18840082bbd2b5 100644
--- a/include/obj/bhkShape.h
+++ b/include/obj/bhkShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSimpleShapePhantom.h b/include/obj/bhkSimpleShapePhantom.h
index 8f72877e98d10eddaeafd1ea858b8774d9cd89bc..bb2fa0916da86724a08be29f56898d7cf920abf4 100644
--- a/include/obj/bhkSimpleShapePhantom.h
+++ b/include/obj/bhkSimpleShapePhantom.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SIMPLE_SHAPE_PHANTOM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSphereRepShape.h b/include/obj/bhkSphereRepShape.h
index 55f42a9c747373d76140e91ba5cd3575c7aa92bb..8bf34ae144f0d3a82fcf9333b693d0800c599022 100644
--- a/include/obj/bhkSphereRepShape.h
+++ b/include/obj/bhkSphereRepShape.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -43,10 +43,10 @@ public:
 protected:
 	BHK_SPHERE_REP_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSphereShape.h b/include/obj/bhkSphereShape.h
index 80522a60149cd615efd220bae7e6cea9343cf774..971d126d065c3bdca772d2bf4d99bdda3b469334 100644
--- a/include/obj/bhkSphereShape.h
+++ b/include/obj/bhkSphereShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	BHK_SPHERE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkStiffSpringConstraint.h b/include/obj/bhkStiffSpringConstraint.h
index 7255646ed4caec73111f377429db8b8136b6ccc6..8328966e6ddde320b5d043017c7e4a2472a6467a 100644
--- a/include/obj/bhkStiffSpringConstraint.h
+++ b/include/obj/bhkStiffSpringConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_STIFF_SPRING_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkTransformShape.h b/include/obj/bhkTransformShape.h
index dab4af9f2c0295c9cd151f2e67372a24d0283c36..9eef846715be32589aef69833a7b0a37ad61f539 100644
--- a/include/obj/bhkTransformShape.h
+++ b/include/obj/bhkTransformShape.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_TRANSFORM_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkWorldObject.h b/include/obj/bhkWorldObject.h
index cfd71f96fcc35a18e9c5ea8a6685871ed1382615..ceb4e7b4ffd37addd2f0f0116800061ff494a711 100644
--- a/include/obj/bhkWorldObject.h
+++ b/include/obj/bhkWorldObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_WORLD_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/hkPackedNiTriStripsData.h b/include/obj/hkPackedNiTriStripsData.h
index 376021dfd3482c30df838baa6c5da99403e510d7..c22185cfe272cd0be223a2e3956520a8a9c80c20 100644
--- a/include/obj/hkPackedNiTriStripsData.h
+++ b/include/obj/hkPackedNiTriStripsData.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	HK_PACKED_NI_TRI_STRIPS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/src/NIF_IO.cpp b/src/NIF_IO.cpp
index 7142c325a0be2c68b90f41ea57608a39b82ed3da..4776bee6ba1dd5b3b1b95788b1ff5606688f24d6 100644
--- a/src/NIF_IO.cpp
+++ b/src/NIF_IO.cpp
@@ -5,6 +5,75 @@ All rights reserved.  Please see niflib.h for licence. */
 #include "../include/niflib.h"
 namespace Niflib {
 
+//--Endian Support Functions--//
+EndianType DetectEndianType();
+int SwapEndian( int in );
+short SwapEndian( short in );
+float SwapEndian( float in );
+
+//Constant that stores the detected endian storage type of the current system
+const EndianType system_endian = DetectEndianType();
+
+//--Endian Function Bodies--//
+
+EndianType DetectEndianType() {
+	//Simple endian test
+	unsigned char test[2] = { 1, 0 };
+	short r = *(short *)test;
+
+	if ( r == 1 ) {
+		return LITTLE_ENDIAN;
+	} else {
+		return BIG_ENDIAN;
+	}		
+}
+
+int SwapEndian( int in ) {
+	int out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[3];
+	temp_out[1] = temp_in[2];
+	temp_out[2] = temp_in[1];
+	temp_out[3] = temp_in[0];
+
+	return out;
+}
+
+short SwapEndian( short in ) {
+	short out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[1];
+	temp_out[1] = temp_in[0];
+
+	return out;
+}
+
+float SwapEndian( float in ) {
+	float out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[3];
+	temp_out[1] = temp_in[2];
+	temp_out[2] = temp_in[1];
+	temp_out[3] = temp_in[0];
+
+	return out;
+}
+
 //--Read utility functions--//
 
 int ReadInt( istream& in ){
@@ -130,41 +199,41 @@ void WriteBool( bool val, ostream& out, unsigned int version ) {
 //--Basic Types--//
 
 //int
-void NifStream( int & val, istream& in, unsigned int version ) { val = ReadInt( in ); };
-void NifStream( int const & val, ostream& out, unsigned int version ) { WriteInt( val, out ); }
+void NifStream( int & val, istream& in, const NifInfo & info ) { val = ReadInt( in ); };
+void NifStream( int const & val, ostream& out, const NifInfo & info ) { WriteInt( val, out ); }
 
 //unsigned int
-void NifStream( unsigned int & val, istream& in, unsigned int version ) { val = ReadUInt( in ); };
-void NifStream( unsigned int const & val, ostream& out, unsigned int version ) { WriteUInt( val, out ); }
+void NifStream( unsigned int & val, istream& in, const NifInfo & info ) { val = ReadUInt( in ); };
+void NifStream( unsigned int const & val, ostream& out, const NifInfo & info ) { WriteUInt( val, out ); }
 
 //unsigned short
-void NifStream( unsigned short & val, istream& in, unsigned int version ) { val = ReadUShort( in ); };
-void NifStream( unsigned short const & val, ostream& out, unsigned int version ) { WriteUShort( val, out ); }
+void NifStream( unsigned short & val, istream& in, const NifInfo & info ) { val = ReadUShort( in ); };
+void NifStream( unsigned short const & val, ostream& out, const NifInfo & info ) { WriteUShort( val, out ); }
 
 //short
-void NifStream( short & val, istream& in, unsigned int version ) { val = ReadShort( in ); };
-void NifStream( short const & val, ostream& out, unsigned int version ) { WriteShort( val, out ); }
+void NifStream( short & val, istream& in, const NifInfo & info ) { val = ReadShort( in ); };
+void NifStream( short const & val, ostream& out, const NifInfo & info ) { WriteShort( val, out ); }
 
 //byte
-void NifStream( byte & val, istream& in, unsigned int version ) { val = ReadByte( in ); };
-void NifStream( byte const & val, ostream& out, unsigned int version ) { WriteByte( val, out ); }
+void NifStream( byte & val, istream& in, const NifInfo & info ) { val = ReadByte( in ); };
+void NifStream( byte const & val, ostream& out, const NifInfo & info ) { WriteByte( val, out ); }
 
 //bool
-void NifStream( bool & val, istream& in, unsigned int version ) { val = ReadBool( in, version ); };
-void NifStream( bool const & val, ostream& out, unsigned int version ) { WriteBool( val, out, version ); }
+void NifStream( bool & val, istream& in, const NifInfo & info ) { val = ReadBool( in, info.version ); };
+void NifStream( bool const & val, ostream& out, const NifInfo & info ) { WriteBool( val, out, info.version ); }
 
 //float
-void NifStream( float & val, istream& in, unsigned int version ) { val = ReadFloat( in ); };
-void NifStream( float const & val, ostream& out, unsigned int version ) { WriteFloat( val, out ); }
+void NifStream( float & val, istream& in, const NifInfo & info ) { val = ReadFloat( in ); };
+void NifStream( float const & val, ostream& out, const NifInfo & info ) { WriteFloat( val, out ); }
 
 //string
-void NifStream( string & val, istream& in, unsigned int version ) { val = ReadString( in ); };
-void NifStream( string const & val, ostream& out, unsigned int version ) { WriteString( val, out ); }
+void NifStream( string & val, istream& in, const NifInfo & info ) { val = ReadString( in ); };
+void NifStream( string const & val, ostream& out, const NifInfo & info ) { WriteString( val, out ); }
 
 //--Structs--//
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
+void NifStream( HeaderString & val, istream& in, NifInfo & info ) {
 	char tmp[256];
 	in.getline( tmp, 256 );
 	val.header = tmp;
@@ -177,14 +246,14 @@ void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
 		ver_start = 30;
 	} else {
 		//Not a NIF file
-		version = VER_INVALID;
+		info.version = VER_INVALID;
 	}
 
 	//Parse version string and return result.
-	version = ParseVersionString( val.header.substr( ver_start ) );
+	info.version = ParseVersionString( val.header.substr( ver_start ) );
 
 	//Temporarily read the next 3 strings if this is a < 4 file
-	if ( version < VER_3_3_0_13 ) {
+	if ( info.version < VER_3_3_0_13 ) {
 		in.getline( tmp, 256 );
 		in.getline( tmp, 256 );
 		in.getline( tmp, 256 );
@@ -195,14 +264,14 @@ void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
 	//}
 };
 
-void NifStream( HeaderString const & val, ostream& out, unsigned int version ) {
+void NifStream( HeaderString const & val, ostream& out, const NifInfo & info ) {
 	stringstream header_string;
-	if ( version <= VER_10_0_1_0 ) {
+	if ( info.version <= VER_10_0_1_0 ) {
 		header_string << "NetImmerse File Format, Version ";
 	} else {
 		header_string << "Gamebryo File Format, Version ";
 	}
-	char * byte_ver = (char*)&version;
+	char * byte_ver = (char*)&(info.version);
 	int int_ver[4] = { byte_ver[3], byte_ver[2], byte_ver[1], byte_ver[0] };
 
 
@@ -216,13 +285,13 @@ ostream & operator<<( ostream & out, HeaderString const & val ) {
 }
 
 //LineString
-void NifStream( LineString & val, istream& in, unsigned int version ) {
+void NifStream( LineString & val, istream& in, const NifInfo & info ) {
 	char tmp[256];
 	in.getline( tmp, 256 );
 	val.line = tmp;
 };
 
-void NifStream( LineString const & val, ostream& out, unsigned int version ) {
+void NifStream( LineString const & val, ostream& out, const NifInfo & info ) {
 	out << val.line << "\n";
 };
 
@@ -231,7 +300,7 @@ ostream & operator<<( ostream & out, LineString const & val ) {
 }
 
 //ShortString
-void NifStream( ShortString & val, istream& in, unsigned int version ) {
+void NifStream( ShortString & val, istream& in, const NifInfo & info ) {
 	byte len = ReadByte( in );
 	char * buffer = new char[len];
 	in.read( buffer, len );
@@ -239,7 +308,7 @@ void NifStream( ShortString & val, istream& in, unsigned int version ) {
 	delete [] buffer;
 };
 
-void NifStream( ShortString const & val, ostream& out, unsigned int version ) {
+void NifStream( ShortString const & val, ostream& out, const NifInfo & info ) {
 	WriteByte( byte(val.str.size() + 1), out );
 	out.write( val.str.c_str(), std::streamsize(val.str.size()) );
 	WriteByte( 0, out );
@@ -250,55 +319,55 @@ ostream & operator<<( ostream & out, ShortString const & val ) {
 }
 
 //TexCoord
-void NifStream( TexCoord & val, istream& in, unsigned int version ) {
+void NifStream( TexCoord & val, istream& in, const NifInfo & info ) {
 	val.u = ReadFloat( in );
 	val.v = ReadFloat( in );
 };
 
-void NifStream( TexCoord const & val, ostream& out, unsigned int version ) {
+void NifStream( TexCoord const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.u, out );
 	WriteFloat( val.v, out );
 };
 
 //Triangle
-void NifStream( Triangle & val, istream& in, unsigned int version ) {
+void NifStream( Triangle & val, istream& in, const NifInfo & info ) {
 	val.v1 = ReadUShort( in );
 	val.v2 = ReadUShort( in );
 	val.v3 = ReadUShort( in );
 };
 
-void NifStream( Triangle const & val, ostream& out, unsigned int version ) {
+void NifStream( Triangle const & val, ostream& out, const NifInfo & info ) {
 	WriteUShort( val.v1, out );
 	WriteUShort( val.v2, out );
 	WriteUShort( val.v3, out );
 };
 
 //Vector3
-void NifStream( Vector3 & val, istream& in, unsigned int version ) {
+void NifStream( Vector3 & val, istream& in, const NifInfo & info ) {
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Vector3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Vector3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
 	WriteFloat( val.z, out );
 };
 
 //Float2
-void NifStream( Float2 & val, istream& in, unsigned int version ) {
+void NifStream( Float2 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 };
 
-void NifStream( Float2 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float2 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 };
 
 //Matrix22
-void NifStream( Matrix22 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix22 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 2; ++c) {
 		for (int r = 0; r < 2; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -306,7 +375,7 @@ void NifStream( Matrix22 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix22 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix22 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 2; ++c) {
 		for (int r = 0; r < 2; ++r) {
 			WriteFloat( val[r][c], out );
@@ -315,20 +384,20 @@ void NifStream( Matrix22 const & val, ostream& out, unsigned int version ) {
 }
 
 //Float3
-void NifStream( Float3 & val, istream& in, unsigned int version ) {
+void NifStream( Float3 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 	val.data[2] = ReadFloat( in );
 };
 
-void NifStream( Float3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 	WriteFloat( val.data[2], out );
 };
 
 //Matrix33
-void NifStream( Matrix33 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix33 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 3; ++c) {
 		for (int r = 0; r < 3; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -336,7 +405,7 @@ void NifStream( Matrix33 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix33 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix33 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 3; ++c) {
 		for (int r = 0; r < 3; ++r) {
 			WriteFloat( val[r][c], out );
@@ -345,14 +414,14 @@ void NifStream( Matrix33 const & val, ostream& out, unsigned int version ) {
 }
 
 //Float4
-void NifStream( Float4 & val, istream& in, unsigned int version ) {
+void NifStream( Float4 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 	val.data[2] = ReadFloat( in );
 	val.data[3] = ReadFloat( in );
 };
 
-void NifStream( Float4 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float4 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 	WriteFloat( val.data[2], out );
@@ -360,7 +429,7 @@ void NifStream( Float4 const & val, ostream& out, unsigned int version ) {
 };
 
 //Matrix44
-void NifStream( Matrix44 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix44 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 4; ++c) {
 		for (int r = 0; r < 4; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -368,7 +437,7 @@ void NifStream( Matrix44 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix44 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix44 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 4; ++c) {
 		for (int r = 0; r < 4; ++r) {
 			WriteFloat( val[r][c], out );
@@ -377,27 +446,27 @@ void NifStream( Matrix44 const & val, ostream& out, unsigned int version ) {
 }
 
 //Color3
-void NifStream( Color3 & val, istream& in, unsigned int version ) {
+void NifStream( Color3 & val, istream& in, const NifInfo & info ) {
 	val.r = ReadFloat( in );
 	val.g = ReadFloat( in );
 	val.b = ReadFloat( in );
 };
 
-void NifStream( Color3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Color3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.r, out );
 	WriteFloat( val.g, out );
 	WriteFloat( val.b, out );
 };
 
 //Color4
-void NifStream( Color4 & val, istream& in, unsigned int version ) {
+void NifStream( Color4 & val, istream& in, const NifInfo & info ) {
 	val.r = ReadFloat( in );
 	val.g = ReadFloat( in );
 	val.b = ReadFloat( in );
 	val.a = ReadFloat( in );
 };
 
-void NifStream( Color4 const & val, ostream& out, unsigned int version ) {
+void NifStream( Color4 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.r, out );
 	WriteFloat( val.g, out );
 	WriteFloat( val.b, out );
@@ -405,14 +474,14 @@ void NifStream( Color4 const & val, ostream& out, unsigned int version ) {
 };
 
 //Quaternion
-void NifStream( Quaternion & val, istream& in, unsigned int version ) {
+void NifStream( Quaternion & val, istream& in, const NifInfo & info ) {
 	val.w = ReadFloat( in );
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Quaternion const & val, ostream& out, unsigned int version ) {
+void NifStream( Quaternion const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.w, out );
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
@@ -448,7 +517,7 @@ ostream & operator<<( ostream & out, byte const & val ) {
 	return out << (unsigned int)(val);
 }
 
-void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<Quaternion> & key, istream& file, const NifInfo & info, KeyType type ) {
 	key.time = ReadFloat( file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -468,7 +537,7 @@ void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyT
 }
 
 
-void NifStream( Key<Quaternion> const & key, ostream& file, unsigned int version,  KeyType type ) {
+void NifStream( Key<Quaternion> const & key, ostream& file, const NifInfo & info,  KeyType type ) {
 	WriteFloat( key.time, file );
 
 	//If key type is not 1, 2, or 3, throw an exception
diff --git a/src/gen/Footer.cpp b/src/gen/Footer.cpp
index f8de6f473935643f5e60ca93fa20e9b0f4851081..8dc69c6c2b9f5fa36d062f1b95bee9e71d82ad40 100644
--- a/src/gen/Footer.cpp
+++ b/src/gen/Footer.cpp
@@ -27,27 +27,27 @@ Footer & Footer::operator=( const Footer & src ) {
 //Destructor
 Footer::~Footer() {};
 
-void Footer::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void Footer::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	if ( version >= 0x0303000D ) {
-		NifStream( numRoots, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numRoots, in, info );
 		roots.resize(numRoots);
 		for (unsigned int i2 = 0; i2 < roots.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void Footer::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
+void Footer::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
 	numRoots = (unsigned int)(roots.size());
-	if ( version >= 0x0303000D ) {
-		NifStream( numRoots, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numRoots, out, info );
 		for (unsigned int i2 = 0; i2 < roots.size(); i2++) {
 			if ( roots[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(roots[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(roots[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
diff --git a/src/gen/Header.cpp b/src/gen/Header.cpp
index 68f3afeafd3fdd7b8a131d9931f5e63a425ee61b..b8242c73799a73e1c8759aed0c7e3e7b534c7a42 100644
--- a/src/gen/Header.cpp
+++ b/src/gen/Header.cpp
@@ -37,99 +37,120 @@ Header & Header::operator=( const Header & src ) {
 
 //Destructor
 Header::~Header() {};
-void Header::Read( istream& in ) {
-	NifStream( headerString, in, version );
-	if ( version <= 0x03010000 ) {
+NifInfo Header::Read( istream& in ) {
+	//Declare NifInfo structure
+	NifInfo info;
+
+	NifStream( headerString, in, info );
+	if ( info.version <= 0x03010000 ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( copyright[i2], in, version );
+			NifStream( copyright[i2], in, info );
 		};
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( version, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( version, in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( endianType, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( endianType, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( userVersion, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( userVersion, in, info );
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( numBlocks, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numBlocks, in, info );
 	};
-	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
-		NifStream( userVersion, in, version );
+	if ( ( info.version >= 0x0A000102 ) && ( info.version <= 0x0A000102 ) ) {
+		NifStream( userVersion, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( userVersion2, in, version );
+			NifStream( userVersion2, in, info );
 		};
 	};
-	if ( version >= 0x0A000102 ) {
+	if ( info.version >= 0x0A000102 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( creator, in, version );
-			NifStream( exportInfo1, in, version );
-			NifStream( exportInfo2, in, version );
+			NifStream( creator, in, info );
+			NifStream( exportInfo1, in, info );
+			NifStream( exportInfo2, in, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numBlockTypes, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numBlockTypes, in, info );
 		blockTypes.resize(numBlockTypes);
 		for (unsigned int i2 = 0; i2 < blockTypes.size(); i2++) {
-			NifStream( blockTypes[i2], in, version );
+			NifStream( blockTypes[i2], in, info );
 		};
 		blockTypeIndex.resize(numBlocks);
 		for (unsigned int i2 = 0; i2 < blockTypeIndex.size(); i2++) {
-			NifStream( blockTypeIndex[i2], in, version );
+			NifStream( blockTypeIndex[i2], in, info );
 		};
-		NifStream( unknownInt2, in, version );
+		NifStream( unknownInt2, in, info );
 	};
+
+	//Copy info.version to local version var.
+	version = info.version;
+
+	//Fill out and return NifInfo structure.
+	info.userVersion = userVersion;
+	if ( endianType == 0) {
+		info->endian = BIG_ENDIAN;
+	} else {
+		info->endian = LITTLE_ENDIAN;
+	}
+	info.endian = EndianType(endianType);
+	info.creator = creator.str;
+	info.exportInfo1 = exportInfo1;
+	info.exportInfo2 = exportInfo2;
+
+	return info;
+
 }
 
-void Header::Write( ostream& out ) const {
+void Header::Write( ostream& out, const NifInfo & info ) const {
 	numBlockTypes = (unsigned short)(blockTypes.size());
 	numBlocks = (unsigned int)(blockTypeIndex.size());
-	NifStream( headerString, out, version );
-	if ( version <= 0x03010000 ) {
+	NifStream( headerString, out, info );
+	if ( info.version <= 0x03010000 ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( copyright[i2], out, version );
+			NifStream( copyright[i2], out, info );
 		};
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( version, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( version, out, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( endianType, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( endianType, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( userVersion, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( userVersion, out, info );
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( numBlocks, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numBlocks, out, info );
 	};
-	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
-		NifStream( userVersion, out, version );
+	if ( ( info.version >= 0x0A000102 ) && ( info.version <= 0x0A000102 ) ) {
+		NifStream( userVersion, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( userVersion2, out, version );
+			NifStream( userVersion2, out, info );
 		};
 	};
-	if ( version >= 0x0A000102 ) {
+	if ( info.version >= 0x0A000102 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( creator, out, version );
-			NifStream( exportInfo1, out, version );
-			NifStream( exportInfo2, out, version );
+			NifStream( creator, out, info );
+			NifStream( exportInfo1, out, info );
+			NifStream( exportInfo2, out, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numBlockTypes, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numBlockTypes, out, info );
 		for (unsigned int i2 = 0; i2 < blockTypes.size(); i2++) {
-			NifStream( blockTypes[i2], out, version );
+			NifStream( blockTypes[i2], out, info );
 		};
 		for (unsigned int i2 = 0; i2 < blockTypeIndex.size(); i2++) {
-			NifStream( blockTypeIndex[i2], out, version );
+			NifStream( blockTypeIndex[i2], out, info );
 		};
-		NifStream( unknownInt2, out, version );
+		NifStream( unknownInt2, out, info );
 	};
 }
 
diff --git a/src/gen/enums.cpp b/src/gen/enums.cpp
index 64a4b2009c39750bac16d16afbe8d509fce6f48b..573141a11500133ab5db719740f14d14b5650071 100644
--- a/src/gen/enums.cpp
+++ b/src/gen/enums.cpp
@@ -19,14 +19,14 @@ namespace Niflib {
 
 //--ForceType--//
 
-void NifStream( ForceType & val, istream& in, unsigned int version ) {
+void NifStream( ForceType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = ForceType(temp);
 }
 
-void NifStream( ForceType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( ForceType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, ForceType const & val ) {
@@ -41,14 +41,14 @@ ostream & operator<<( ostream & out, ForceType const & val ) {
 
 //--HavokMaterial--//
 
-void NifStream( HavokMaterial & val, istream& in, unsigned int version ) {
+void NifStream( HavokMaterial & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = HavokMaterial(temp);
 }
 
-void NifStream( HavokMaterial const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( HavokMaterial const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, HavokMaterial const & val ) {
@@ -91,14 +91,14 @@ ostream & operator<<( ostream & out, HavokMaterial const & val ) {
 
 //--CompareMode--//
 
-void NifStream( CompareMode & val, istream& in, unsigned int version ) {
+void NifStream( CompareMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = CompareMode(temp);
 }
 
-void NifStream( CompareMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( CompareMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, CompareMode const & val ) {
@@ -117,14 +117,14 @@ ostream & operator<<( ostream & out, CompareMode const & val ) {
 
 //--TexFilterMode--//
 
-void NifStream( TexFilterMode & val, istream& in, unsigned int version ) {
+void NifStream( TexFilterMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexFilterMode(temp);
 }
 
-void NifStream( TexFilterMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexFilterMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexFilterMode const & val ) {
@@ -142,14 +142,14 @@ ostream & operator<<( ostream & out, TexFilterMode const & val ) {
 
 //--LightMode--//
 
-void NifStream( LightMode & val, istream& in, unsigned int version ) {
+void NifStream( LightMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = LightMode(temp);
 }
 
-void NifStream( LightMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( LightMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, LightMode const & val ) {
@@ -163,14 +163,14 @@ ostream & operator<<( ostream & out, LightMode const & val ) {
 
 //--MipMapFormat--//
 
-void NifStream( MipMapFormat & val, istream& in, unsigned int version ) {
+void NifStream( MipMapFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MipMapFormat(temp);
 }
 
-void NifStream( MipMapFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( MipMapFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MipMapFormat const & val ) {
@@ -185,14 +185,14 @@ ostream & operator<<( ostream & out, MipMapFormat const & val ) {
 
 //--StencilAction--//
 
-void NifStream( StencilAction & val, istream& in, unsigned int version ) {
+void NifStream( StencilAction & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = StencilAction(temp);
 }
 
-void NifStream( StencilAction const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( StencilAction const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, StencilAction const & val ) {
@@ -210,14 +210,14 @@ ostream & operator<<( ostream & out, StencilAction const & val ) {
 
 //--OblivionLayer--//
 
-void NifStream( OblivionLayer & val, istream& in, unsigned int version ) {
+void NifStream( OblivionLayer & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = OblivionLayer(temp);
 }
 
-void NifStream( OblivionLayer const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( OblivionLayer const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, OblivionLayer const & val ) {
@@ -287,14 +287,14 @@ ostream & operator<<( ostream & out, OblivionLayer const & val ) {
 
 //--FaceDrawMode--//
 
-void NifStream( FaceDrawMode & val, istream& in, unsigned int version ) {
+void NifStream( FaceDrawMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = FaceDrawMode(temp);
 }
 
-void NifStream( FaceDrawMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( FaceDrawMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, FaceDrawMode const & val ) {
@@ -310,14 +310,14 @@ ostream & operator<<( ostream & out, FaceDrawMode const & val ) {
 
 //--AlphaFormat--//
 
-void NifStream( AlphaFormat & val, istream& in, unsigned int version ) {
+void NifStream( AlphaFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = AlphaFormat(temp);
 }
 
-void NifStream( AlphaFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( AlphaFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, AlphaFormat const & val ) {
@@ -333,14 +333,14 @@ ostream & operator<<( ostream & out, AlphaFormat const & val ) {
 
 //--KeyType--//
 
-void NifStream( KeyType & val, istream& in, unsigned int version ) {
+void NifStream( KeyType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = KeyType(temp);
 }
 
-void NifStream( KeyType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( KeyType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, KeyType const & val ) {
@@ -357,14 +357,14 @@ ostream & operator<<( ostream & out, KeyType const & val ) {
 
 //--VertMode--//
 
-void NifStream( VertMode & val, istream& in, unsigned int version ) {
+void NifStream( VertMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = VertMode(temp);
 }
 
-void NifStream( VertMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( VertMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, VertMode const & val ) {
@@ -379,14 +379,14 @@ ostream & operator<<( ostream & out, VertMode const & val ) {
 
 //--ApplyMode--//
 
-void NifStream( ApplyMode & val, istream& in, unsigned int version ) {
+void NifStream( ApplyMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = ApplyMode(temp);
 }
 
-void NifStream( ApplyMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( ApplyMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, ApplyMode const & val ) {
@@ -403,14 +403,14 @@ ostream & operator<<( ostream & out, ApplyMode const & val ) {
 
 //--MotionSystem--//
 
-void NifStream( MotionSystem & val, istream& in, unsigned int version ) {
+void NifStream( MotionSystem & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MotionSystem(temp);
 }
 
-void NifStream( MotionSystem const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( MotionSystem const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MotionSystem const & val ) {
@@ -424,14 +424,14 @@ ostream & operator<<( ostream & out, MotionSystem const & val ) {
 
 //--BillboardMode--//
 
-void NifStream( BillboardMode & val, istream& in, unsigned int version ) {
+void NifStream( BillboardMode & val, istream& in, const NifInfo & info ) {
 	unsigned short temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = BillboardMode(temp);
 }
 
-void NifStream( BillboardMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned short)(val), out, version );
+void NifStream( BillboardMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned short)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, BillboardMode const & val ) {
@@ -448,14 +448,14 @@ ostream & operator<<( ostream & out, BillboardMode const & val ) {
 
 //--TexType--//
 
-void NifStream( TexType & val, istream& in, unsigned int version ) {
+void NifStream( TexType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexType(temp);
 }
 
-void NifStream( TexType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexType const & val ) {
@@ -475,14 +475,14 @@ ostream & operator<<( ostream & out, TexType const & val ) {
 
 //--PixelLayout--//
 
-void NifStream( PixelLayout & val, istream& in, unsigned int version ) {
+void NifStream( PixelLayout & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = PixelLayout(temp);
 }
 
-void NifStream( PixelLayout const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( PixelLayout const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, PixelLayout const & val ) {
@@ -500,14 +500,14 @@ ostream & operator<<( ostream & out, PixelLayout const & val ) {
 
 //--TexClampMode--//
 
-void NifStream( TexClampMode & val, istream& in, unsigned int version ) {
+void NifStream( TexClampMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexClampMode(temp);
 }
 
-void NifStream( TexClampMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexClampMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexClampMode const & val ) {
@@ -523,14 +523,14 @@ ostream & operator<<( ostream & out, TexClampMode const & val ) {
 
 //--MotionQuality--//
 
-void NifStream( MotionQuality & val, istream& in, unsigned int version ) {
+void NifStream( MotionQuality & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MotionQuality(temp);
 }
 
-void NifStream( MotionQuality const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( MotionQuality const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MotionQuality const & val ) {
@@ -551,14 +551,14 @@ ostream & operator<<( ostream & out, MotionQuality const & val ) {
 
 //--PixelFormat--//
 
-void NifStream( PixelFormat & val, istream& in, unsigned int version ) {
+void NifStream( PixelFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = PixelFormat(temp);
 }
 
-void NifStream( PixelFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( PixelFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, PixelFormat const & val ) {
@@ -573,14 +573,14 @@ ostream & operator<<( ostream & out, PixelFormat const & val ) {
 
 //--CycleType--//
 
-void NifStream( CycleType & val, istream& in, unsigned int version ) {
+void NifStream( CycleType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = CycleType(temp);
 }
 
-void NifStream( CycleType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( CycleType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, CycleType const & val ) {
@@ -595,14 +595,14 @@ ostream & operator<<( ostream & out, CycleType const & val ) {
 
 //--FieldType--//
 
-void NifStream( FieldType & val, istream& in, unsigned int version ) {
+void NifStream( FieldType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = FieldType(temp);
 }
 
-void NifStream( FieldType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( FieldType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, FieldType const & val ) {
diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp
index 114a5d1c1ec24d0fec3fb2f394f0f94aa6303b05..6fd4d78832a499f5cf9ad7b5bf723b1c38802850 100644
--- a/src/gen/obj_impl.cpp
+++ b/src/gen/obj_impl.cpp
@@ -201,7 +201,7 @@ const char FIX_LINK_INDEX_ERROR[] = "Object index was not found in object map.
 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<unsigned int> & link_stack, unsigned int version ) {
+Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
 	if (link_stack.empty()) {
 		throw runtime_error(FIX_LINK_POP_ERROR);
 	}
@@ -226,10 +226,10 @@ Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<unsigned int> &
 	return object;
 }
 
-void NiObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 }
 
-void NiObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
+void NiObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
 }
 
 std::string NiObject::InternalAsString( bool verbose ) const {
@@ -238,7 +238,7 @@ std::string NiObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
 }
 
 std::list<NiObjectRef> NiObject::InternalGetRefs() const {
@@ -246,12 +246,12 @@ std::list<NiObjectRef> NiObject::InternalGetRefs() const {
 	return refs;
 }
 
-void AKeyedData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void AKeyedData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void AKeyedData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void AKeyedData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string AKeyedData::InternalAsString( bool verbose ) const {
@@ -261,8 +261,8 @@ std::string AKeyedData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AKeyedData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void AKeyedData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AKeyedData::InternalGetRefs() const {
@@ -271,25 +271,25 @@ std::list<NiObjectRef> AKeyedData::InternalGetRefs() const {
 	return refs;
 }
 
-void AParticleModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void AParticleModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void AParticleModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void AParticleModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( nextModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(nextModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(nextModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( controller != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string AParticleModifier::InternalAsString( bool verbose ) const {
@@ -301,10 +301,10 @@ std::string AParticleModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AParticleModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	nextModifier = FixLink<AParticleModifier>( objects, link_stack, version );
-	controller = FixLink<NiParticleSystemController>( objects, link_stack, version );
+void AParticleModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	nextModifier = FixLink<AParticleModifier>( objects, link_stack, info );
+	controller = FixLink<NiParticleSystemController>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AParticleModifier::InternalGetRefs() const {
@@ -315,12 +315,12 @@ std::list<NiObjectRef> AParticleModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRefObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void bhkRefObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void bhkRefObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void bhkRefObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string bhkRefObject::InternalAsString( bool verbose ) const {
@@ -330,8 +330,8 @@ std::string bhkRefObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRefObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void bhkRefObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRefObject::InternalGetRefs() const {
@@ -340,12 +340,12 @@ std::list<NiObjectRef> bhkRefObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSerializable::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRefObject::Read( in, link_stack, version, user_version );
+void bhkSerializable::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRefObject::Read( in, link_stack, info );
 }
 
-void bhkSerializable::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkRefObject::Write( out, link_map, version, user_version );
+void bhkSerializable::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkRefObject::Write( out, link_map, info );
 }
 
 std::string bhkSerializable::InternalAsString( bool verbose ) const {
@@ -355,8 +355,8 @@ std::string bhkSerializable::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSerializable::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRefObject::FixLinks( objects, link_stack, version, user_version );
+void bhkSerializable::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRefObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSerializable::InternalGetRefs() const {
@@ -365,29 +365,29 @@ std::list<NiObjectRef> bhkSerializable::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkSerializable::Read( in, link_stack, version, user_version );
-	NifStream( numBodies, in, version );
+	bhkSerializable::Read( in, link_stack, info );
+	NifStream( numBodies, in, info );
 	bodies.resize(numBodies);
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( priority, in, version );
+	NifStream( priority, in, info );
 }
 
-void AbhkConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSerializable::Write( out, link_map, version, user_version );
+void AbhkConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSerializable::Write( out, link_map, info );
 	numBodies = (unsigned int)(bodies.size());
-	NifStream( numBodies, out, version );
+	NifStream( numBodies, out, info );
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
 		if ( bodies[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bodies[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bodies[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( priority, out, version );
+	NifStream( priority, out, info );
 }
 
 std::string AbhkConstraint::InternalAsString( bool verbose ) const {
@@ -412,10 +412,10 @@ std::string AbhkConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
+void AbhkConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
-		bodies[i1] = FixLink<bhkShape>( objects, link_stack, version );
+		bodies[i1] = FixLink<bhkShape>( objects, link_stack, info );
 	};
 }
 
@@ -427,36 +427,36 @@ std::list<NiObjectRef> AbhkConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( pivotA, in, version );
-	NifStream( planeA, in, version );
-	NifStream( twistA, in, version );
-	NifStream( pivotB, in, version );
-	NifStream( planeB, in, version );
-	NifStream( twistB, in, version );
-	NifStream( coneMinAngle, in, version );
-	NifStream( planeMinAngle, in, version );
-	NifStream( planeMaxAngle, in, version );
-	NifStream( twistMinAngle, in, version );
-	NifStream( twistMaxAngle, in, version );
-	NifStream( maxFriction, in, version );
-}
-
-void AbhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( pivotA, out, version );
-	NifStream( planeA, out, version );
-	NifStream( twistA, out, version );
-	NifStream( pivotB, out, version );
-	NifStream( planeB, out, version );
-	NifStream( twistB, out, version );
-	NifStream( coneMinAngle, out, version );
-	NifStream( planeMinAngle, out, version );
-	NifStream( planeMaxAngle, out, version );
-	NifStream( twistMinAngle, out, version );
-	NifStream( twistMaxAngle, out, version );
-	NifStream( maxFriction, out, version );
+void AbhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( pivotA, in, info );
+	NifStream( planeA, in, info );
+	NifStream( twistA, in, info );
+	NifStream( pivotB, in, info );
+	NifStream( planeB, in, info );
+	NifStream( twistB, in, info );
+	NifStream( coneMinAngle, in, info );
+	NifStream( planeMinAngle, in, info );
+	NifStream( planeMaxAngle, in, info );
+	NifStream( twistMinAngle, in, info );
+	NifStream( twistMaxAngle, in, info );
+	NifStream( maxFriction, in, info );
+}
+
+void AbhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( pivotA, out, info );
+	NifStream( planeA, out, info );
+	NifStream( twistA, out, info );
+	NifStream( pivotB, out, info );
+	NifStream( planeB, out, info );
+	NifStream( twistB, out, info );
+	NifStream( coneMinAngle, out, info );
+	NifStream( planeMinAngle, out, info );
+	NifStream( planeMaxAngle, out, info );
+	NifStream( twistMinAngle, out, info );
+	NifStream( twistMaxAngle, out, info );
+	NifStream( maxFriction, out, info );
 }
 
 std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
@@ -478,8 +478,8 @@ std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void AbhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AbhkRagdollConstraint::InternalGetRefs() const {
@@ -488,12 +488,12 @@ std::list<NiObjectRef> AbhkRagdollConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::Read( in, link_stack, version, user_version );
+void bhkShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::Read( in, link_stack, info );
 }
 
-void bhkShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSerializable::Write( out, link_map, version, user_version );
+void bhkShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSerializable::Write( out, link_map, info );
 }
 
 std::string bhkShape::InternalAsString( bool verbose ) const {
@@ -503,8 +503,8 @@ std::string bhkShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
+void bhkShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkShape::InternalGetRefs() const {
@@ -513,12 +513,12 @@ std::list<NiObjectRef> bhkShape::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkShapeCollection::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
+void AbhkShapeCollection::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
 }
 
-void AbhkShapeCollection::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void AbhkShapeCollection::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 }
 
 std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
@@ -528,8 +528,8 @@ std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkShapeCollection::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void AbhkShapeCollection::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AbhkShapeCollection::InternalGetRefs() const {
@@ -538,14 +538,14 @@ std::list<NiObjectRef> AbhkShapeCollection::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSphereRepShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
-	NifStream( material, in, version );
+void bhkSphereRepShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
+	NifStream( material, in, info );
 }
 
-void bhkSphereRepShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
-	NifStream( material, out, version );
+void bhkSphereRepShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
+	NifStream( material, out, info );
 }
 
 std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
@@ -556,8 +556,8 @@ std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereRepShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void bhkSphereRepShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSphereRepShape::InternalGetRefs() const {
@@ -566,12 +566,12 @@ std::list<NiObjectRef> bhkSphereRepShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
+void bhkConvexShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
 }
 
-void bhkConvexShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkConvexShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 }
 
 std::string bhkConvexShape::InternalAsString( bool verbose ) const {
@@ -581,8 +581,8 @@ std::string bhkConvexShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexShape::InternalGetRefs() const {
@@ -591,12 +591,12 @@ std::list<NiObjectRef> bhkConvexShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkWorldObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
+void bhkWorldObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
 }
 
-void bhkWorldObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void bhkWorldObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 }
 
 std::string bhkWorldObject::InternalAsString( bool verbose ) const {
@@ -606,8 +606,8 @@ std::string bhkWorldObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkWorldObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void bhkWorldObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkWorldObject::InternalGetRefs() const {
@@ -616,25 +616,25 @@ std::list<NiObjectRef> bhkWorldObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkEntity::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkEntity::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkWorldObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	bhkWorldObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( layer, in, version );
-	NifStream( colFilter, in, version );
-	NifStream( unknownShort, in, version );
+	NifStream( layer, in, info );
+	NifStream( colFilter, in, info );
+	NifStream( unknownShort, in, info );
 }
 
-void bhkEntity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkWorldObject::Write( out, link_map, version, user_version );
+void bhkEntity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkWorldObject::Write( out, link_map, info );
 	if ( shape != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( layer, out, version );
-	NifStream( colFilter, out, version );
-	NifStream( unknownShort, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( layer, out, info );
+	NifStream( colFilter, out, info );
+	NifStream( unknownShort, out, info );
 }
 
 std::string bhkEntity::InternalAsString( bool verbose ) const {
@@ -648,9 +648,9 @@ std::string bhkEntity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkEntity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkWorldObject::FixLinks( objects, link_stack, version, user_version );
-	shape = FixLink<bhkShape>( objects, link_stack, version );
+void bhkEntity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkWorldObject::FixLinks( objects, link_stack, info );
+	shape = FixLink<bhkShape>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkEntity::InternalGetRefs() const {
@@ -661,27 +661,27 @@ std::list<NiObjectRef> bhkEntity::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownShort, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownShort, out, info );
 	if ( body != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(body) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(body) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiCollisionObject::InternalAsString( bool verbose ) const {
@@ -694,10 +694,10 @@ std::string NiCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	parent = FixLink<NiAVObject>( objects, link_stack, version );
-	body = FixLink<NiObject>( objects, link_stack, version );
+void NiCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	parent = FixLink<NiAVObject>( objects, link_stack, info );
+	body = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCollisionObject::InternalGetRefs() const {
@@ -708,28 +708,28 @@ std::list<NiObjectRef> NiCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void NiExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( name, in, version );
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( name, in, info );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( name, out, version );
+void NiExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( name, out, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		if ( nextExtraData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(nextExtraData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(nextExtraData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -742,10 +742,10 @@ std::string NiExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		nextExtraData = FixLink<NiExtraData>( objects, link_stack, version );
+void NiExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		nextExtraData = FixLink<NiExtraData>( objects, link_stack, info );
 	};
 }
 
@@ -757,12 +757,12 @@ std::list<NiObjectRef> NiExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void NiInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string NiInterpolator::InternalAsString( bool verbose ) const {
@@ -772,8 +772,8 @@ std::string NiInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiInterpolator::InternalGetRefs() const {
@@ -782,16 +782,16 @@ std::list<NiObjectRef> NiInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( unknownInt, in, version );
+void NiBlendInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( unknownInt, in, info );
 }
 
-void NiBlendInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
-	NifStream( unknownInt, out, version );
+void NiBlendInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
+	NifStream( unknownInt, out, info );
 }
 
 std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
@@ -803,8 +803,8 @@ std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendInterpolator::InternalGetRefs() const {
@@ -813,29 +813,29 @@ std::list<NiObjectRef> NiBlendInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( startTime, in, version );
-	NifStream( stopTime, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( startTime, in, info );
+	NifStream( stopTime, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBSplineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( startTime, out, version );
-	NifStream( stopTime, out, version );
+void NiBSplineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( startTime, out, info );
+	NifStream( stopTime, out, info );
 	if ( splineData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(splineData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(splineData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( basisData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(basisData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(basisData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
@@ -849,10 +849,10 @@ std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	splineData = FixLink<NiBSplineData>( objects, link_stack, version );
-	basisData = FixLink<NiBSplineBasisData>( objects, link_stack, version );
+void NiBSplineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	splineData = FixLink<NiBSplineData>( objects, link_stack, info );
+	basisData = FixLink<NiBSplineBasisData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
@@ -865,49 +865,49 @@ std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiObjectNET::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObjectNET::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numExtraDataList, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numExtraDataList, in, info );
 		extraDataList.resize(numExtraDataList);
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiObjectNET::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiObjectNET::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numExtraDataList = (unsigned int)(extraDataList.size());
-	NifStream( name, out, version );
-	if ( version <= 0x04020200 ) {
+	NifStream( name, out, info );
+	if ( info.version <= 0x04020200 ) {
 		if ( extraData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(extraData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(extraData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numExtraDataList, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numExtraDataList, out, info );
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
 			if ( extraDataList[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(extraDataList[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(extraDataList[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 	if ( controller != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiObjectNET::InternalAsString( bool verbose ) const {
@@ -934,17 +934,17 @@ std::string NiObjectNET::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObjectNET::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		extraData = FixLink<NiExtraData>( objects, link_stack, version );
+void NiObjectNET::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		extraData = FixLink<NiExtraData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
-			extraDataList[i2] = FixLink<NiExtraData>( objects, link_stack, version );
+			extraDataList[i2] = FixLink<NiExtraData>( objects, link_stack, info );
 		};
 	};
-	controller = FixLink<NiTimeController>( objects, link_stack, version );
+	controller = FixLink<NiTimeController>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiObjectNET::InternalGetRefs() const {
@@ -961,78 +961,78 @@ std::list<NiObjectRef> NiObjectNET::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAVObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAVObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObjectNET::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( velocity, in, version );
-	};
-	NifStream( numProperties, in, version );
+	NiObjectNET::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( velocity, in, info );
+	};
+	NifStream( numProperties, in, info );
 	properties.resize(numProperties);
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( hasBoundingBox, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( hasBoundingBox, in, info );
 		if ( (hasBoundingBox != 0) ) {
-			NifStream( boundingBox.unknownInt, in, version );
-			NifStream( boundingBox.translation, in, version );
-			NifStream( boundingBox.rotation, in, version );
-			NifStream( boundingBox.radius, in, version );
+			NifStream( boundingBox.unknownInt, in, info );
+			NifStream( boundingBox.translation, in, info );
+			NifStream( boundingBox.rotation, in, info );
+			NifStream( boundingBox.radius, in, info );
 		};
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( block_num, in, version );
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiAVObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiAVObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 	numProperties = (unsigned int)(properties.size());
-	NifStream( flags, out, version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( velocity, out, version );
-	};
-	NifStream( numProperties, out, version );
+	NifStream( flags, out, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( velocity, out, info );
+	};
+	NifStream( numProperties, out, info );
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
 		if ( properties[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(properties[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(properties[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( hasBoundingBox, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( hasBoundingBox, out, info );
 		if ( (hasBoundingBox != 0) ) {
-			NifStream( boundingBox.unknownInt, out, version );
-			NifStream( boundingBox.translation, out, version );
-			NifStream( boundingBox.rotation, out, version );
-			NifStream( boundingBox.radius, out, version );
+			NifStream( boundingBox.unknownInt, out, info );
+			NifStream( boundingBox.translation, out, info );
+			NifStream( boundingBox.rotation, out, info );
+			NifStream( boundingBox.radius, out, info );
 		};
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
 		if ( collisionData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(collisionData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(collisionData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		if ( collisionObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(collisionObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(collisionObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1071,16 +1071,16 @@ std::string NiAVObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAVObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiAVObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
-		properties[i1] = FixLink<NiProperty>( objects, link_stack, version );
+		properties[i1] = FixLink<NiProperty>( objects, link_stack, info );
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
-		collisionData = FixLink<NiCollisionData>( objects, link_stack, version );
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
+		collisionData = FixLink<NiCollisionData>( objects, link_stack, info );
 	};
-	if ( version >= 0x14000004 ) {
-		collisionObject = FixLink<NiCollisionObject>( objects, link_stack, version );
+	if ( info.version >= 0x14000004 ) {
+		collisionObject = FixLink<NiCollisionObject>( objects, link_stack, info );
 	};
 }
 
@@ -1098,48 +1098,48 @@ std::list<NiObjectRef> NiAVObject::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDynamicEffect::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDynamicEffect::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( switchState, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( switchState, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numAffectedNodes, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numAffectedNodes, in, info );
 		affectedNodeListPointers.resize(numAffectedNodes);
 		for (unsigned int i2 = 0; i2 < affectedNodeListPointers.size(); i2++) {
-			NifStream( affectedNodeListPointers[i2], in, version );
+			NifStream( affectedNodeListPointers[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( numAffectedNodes, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numAffectedNodes, in, info );
 		affectedNodes.resize(numAffectedNodes);
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiDynamicEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiDynamicEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	numAffectedNodes = (unsigned int)(affectedNodeListPointers.size());
-	if ( version >= 0x0A020000 ) {
-		NifStream( switchState, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( switchState, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numAffectedNodes, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numAffectedNodes, out, info );
 		for (unsigned int i2 = 0; i2 < affectedNodeListPointers.size(); i2++) {
-			NifStream( affectedNodeListPointers[i2], out, version );
+			NifStream( affectedNodeListPointers[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( numAffectedNodes, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numAffectedNodes, out, info );
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
 			if ( affectedNodes[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(affectedNodes[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(affectedNodes[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1178,11 +1178,11 @@ std::string NiDynamicEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDynamicEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiDynamicEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
-			affectedNodes[i2] = FixLink<NiAVObject>( objects, link_stack, version );
+			affectedNodes[i2] = FixLink<NiAVObject>( objects, link_stack, info );
 		};
 	};
 }
@@ -1197,20 +1197,20 @@ std::list<NiObjectRef> NiDynamicEffect::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::Read( in, link_stack, version, user_version );
-	NifStream( dimmer, in, version );
-	NifStream( ambientColor, in, version );
-	NifStream( diffuseColor, in, version );
-	NifStream( specularColor, in, version );
+void NiLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::Read( in, link_stack, info );
+	NifStream( dimmer, in, info );
+	NifStream( ambientColor, in, info );
+	NifStream( diffuseColor, in, info );
+	NifStream( specularColor, in, info );
 }
 
-void NiLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiDynamicEffect::Write( out, link_map, version, user_version );
-	NifStream( dimmer, out, version );
-	NifStream( ambientColor, out, version );
-	NifStream( diffuseColor, out, version );
-	NifStream( specularColor, out, version );
+void NiLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiDynamicEffect::Write( out, link_map, info );
+	NifStream( dimmer, out, info );
+	NifStream( ambientColor, out, info );
+	NifStream( diffuseColor, out, info );
+	NifStream( specularColor, out, info );
 }
 
 std::string NiLight::InternalAsString( bool verbose ) const {
@@ -1224,8 +1224,8 @@ std::string NiLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
+void NiLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLight::InternalGetRefs() const {
@@ -1234,12 +1234,12 @@ std::list<NiObjectRef> NiLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::Read( in, link_stack, version, user_version );
+void NiProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::Read( in, link_stack, info );
 }
 
-void NiProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 }
 
 std::string NiProperty::InternalAsString( bool verbose ) const {
@@ -1249,8 +1249,8 @@ std::string NiProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiProperty::InternalGetRefs() const {
@@ -1259,25 +1259,25 @@ std::list<NiObjectRef> NiProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	NifStream( order, in, version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	NifStream( order, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( active, in, version );
+	NifStream( active, in, info );
 }
 
-void NiPSysModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( name, out, version );
-	NifStream( order, out, version );
+void NiPSysModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( name, out, info );
+	NifStream( order, out, info );
 	if ( target != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( active, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( active, out, info );
 }
 
 std::string NiPSysModifier::InternalAsString( bool verbose ) const {
@@ -1291,9 +1291,9 @@ std::string NiPSysModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	target = FixLink<NiParticleSystem>( objects, link_stack, version );
+void NiPSysModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	target = FixLink<NiParticleSystem>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysModifier::InternalGetRefs() const {
@@ -1302,38 +1302,38 @@ std::list<NiObjectRef> NiPSysModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( speed, in, version );
-	NifStream( speedVariation, in, version );
-	NifStream( declination, in, version );
-	NifStream( declinationVariation, in, version );
-	NifStream( planarAngle, in, version );
-	NifStream( planarAngleVariation, in, version );
-	NifStream( initialColor, in, version );
-	NifStream( initialRadius, in, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( radiusVariation, in, version );
+void NiPSysEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( speed, in, info );
+	NifStream( speedVariation, in, info );
+	NifStream( declination, in, info );
+	NifStream( declinationVariation, in, info );
+	NifStream( planarAngle, in, info );
+	NifStream( planarAngleVariation, in, info );
+	NifStream( initialColor, in, info );
+	NifStream( initialRadius, in, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( radiusVariation, in, info );
 	};
-	NifStream( lifeSpan, in, version );
-	NifStream( lifeSpanVariation, in, version );
+	NifStream( lifeSpan, in, info );
+	NifStream( lifeSpanVariation, in, info );
 }
 
-void NiPSysEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( speed, out, version );
-	NifStream( speedVariation, out, version );
-	NifStream( declination, out, version );
-	NifStream( declinationVariation, out, version );
-	NifStream( planarAngle, out, version );
-	NifStream( planarAngleVariation, out, version );
-	NifStream( initialColor, out, version );
-	NifStream( initialRadius, out, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( radiusVariation, out, version );
+void NiPSysEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( speed, out, info );
+	NifStream( speedVariation, out, info );
+	NifStream( declination, out, info );
+	NifStream( declinationVariation, out, info );
+	NifStream( planarAngle, out, info );
+	NifStream( planarAngleVariation, out, info );
+	NifStream( initialColor, out, info );
+	NifStream( initialRadius, out, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( radiusVariation, out, info );
 	};
-	NifStream( lifeSpan, out, version );
-	NifStream( lifeSpanVariation, out, version );
+	NifStream( lifeSpan, out, info );
+	NifStream( lifeSpanVariation, out, info );
 }
 
 std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
@@ -1354,8 +1354,8 @@ std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitter::InternalGetRefs() const {
@@ -1364,22 +1364,22 @@ std::list<NiObjectRef> NiPSysEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysVolumeEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysVolumeEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysEmitter::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiPSysEmitter::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysVolumeEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysEmitter::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiPSysVolumeEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysEmitter::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
 		if ( emitterObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(emitterObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(emitterObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1391,10 +1391,10 @@ std::string NiPSysVolumeEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		emitterObject = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysEmitter::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		emitterObject = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -1404,35 +1404,35 @@ std::list<NiObjectRef> NiPSysVolumeEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTimeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTimeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( flags, in, version );
-	NifStream( frequency, in, version );
-	NifStream( phase, in, version );
-	NifStream( startTime, in, version );
-	NifStream( stopTime, in, version );
-	NifStream( block_num, in, version );
+	NifStream( flags, in, info );
+	NifStream( frequency, in, info );
+	NifStream( phase, in, info );
+	NifStream( startTime, in, info );
+	NifStream( stopTime, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTimeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiTimeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( nextController != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(nextController) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(nextController) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( flags, out, version );
-	NifStream( frequency, out, version );
-	NifStream( phase, out, version );
-	NifStream( startTime, out, version );
-	NifStream( stopTime, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( flags, out, info );
+	NifStream( frequency, out, info );
+	NifStream( phase, out, info );
+	NifStream( startTime, out, info );
+	NifStream( stopTime, out, info );
 	if ( target != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTimeController::InternalAsString( bool verbose ) const {
@@ -1449,10 +1449,10 @@ std::string NiTimeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTimeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	nextController = FixLink<NiTimeController>( objects, link_stack, version );
-	target = FixLink<NiObjectNET>( objects, link_stack, version );
+void NiTimeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	nextController = FixLink<NiTimeController>( objects, link_stack, info );
+	target = FixLink<NiObjectNET>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTimeController::InternalGetRefs() const {
@@ -1463,37 +1463,37 @@ std::list<NiObjectRef> NiTimeController::InternalGetRefs() const {
 	return refs;
 }
 
-void ABoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void ABoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt1, in, version );
-	NifStream( numNodeGroups, in, version );
-	NifStream( numNodeGroups2, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( numNodeGroups, in, info );
+	NifStream( numNodeGroups2, in, info );
 	nodeGroups.resize(numNodeGroups);
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
-		NifStream( nodeGroups[i1].numNodes, in, version );
+		NifStream( nodeGroups[i1].numNodes, in, info );
 		nodeGroups[i1].nodes.resize(nodeGroups[i1].numNodes);
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void ABoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void ABoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numNodeGroups = (unsigned int)(nodeGroups.size());
-	NifStream( unknownInt1, out, version );
-	NifStream( numNodeGroups, out, version );
-	NifStream( numNodeGroups2, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( numNodeGroups, out, info );
+	NifStream( numNodeGroups2, out, info );
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
 		nodeGroups[i1].numNodes = (unsigned int)(nodeGroups[i1].nodes.size());
-		NifStream( nodeGroups[i1].numNodes, out, version );
+		NifStream( nodeGroups[i1].numNodes, out, info );
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
 			if ( nodeGroups[i1].nodes[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(nodeGroups[i1].nodes[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(nodeGroups[i1].nodes[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1530,11 +1530,11 @@ std::string ABoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void ABoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void ABoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, version );
+			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, info );
 		};
 	};
 }
@@ -1549,22 +1549,22 @@ std::list<NiObjectRef> ABoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSingleInterpolatorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSingleInterpolatorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiSingleInterpolatorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A020000 ) {
+void NiSingleInterpolatorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A020000 ) {
 		if ( interpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1576,10 +1576,10 @@ std::string NiSingleInterpolatorController::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiSingleInterpolatorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
+void NiSingleInterpolatorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		interpolator = FixLink<NiInterpolator>( objects, link_stack, info );
 	};
 }
 
@@ -1591,14 +1591,14 @@ std::list<NiObjectRef> NiSingleInterpolatorController::InternalGetRefs() const {
 	return refs;
 }
 
-void APSysCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( modifierName, in, version );
+void APSysCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( modifierName, in, info );
 }
 
-void APSysCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	NifStream( modifierName, out, version );
+void APSysCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	NifStream( modifierName, out, info );
 }
 
 std::string APSysCtlr::InternalAsString( bool verbose ) const {
@@ -1609,8 +1609,8 @@ std::string APSysCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void APSysCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> APSysCtlr::InternalGetRefs() const {
@@ -1619,45 +1619,45 @@ std::list<NiObjectRef> APSysCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeometry::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeometry::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	if ( version >= 0x0303000D ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( hasShader, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( hasShader, in, info );
 		if ( (hasShader != 0) ) {
-			NifStream( shaderName, in, version );
-			NifStream( block_num, in, version );
+			NifStream( shaderName, in, info );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiGeometry::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiGeometry::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	if ( version >= 0x0303000D ) {
+		NifStream( 0xffffffff, out, info );
+	if ( info.version >= 0x0303000D ) {
 		if ( skinInstance != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinInstance) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinInstance) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( hasShader, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( hasShader, out, info );
 		if ( (hasShader != 0) ) {
-			NifStream( shaderName, out, version );
+			NifStream( shaderName, out, info );
 			if ( unknownLink != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1676,15 +1676,15 @@ std::string NiGeometry::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeometry::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiGeometryData>( objects, link_stack, version );
-	if ( version >= 0x0303000D ) {
-		skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
+void NiGeometry::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	data = FixLink<NiGeometryData>( objects, link_stack, info );
+	if ( info.version >= 0x0303000D ) {
+		skinInstance = FixLink<NiSkinInstance>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		if ( (hasShader != 0) ) {
-			unknownLink = FixLink<NiObject>( objects, link_stack, version );
+			unknownLink = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
 }
@@ -1701,12 +1701,12 @@ std::list<NiObjectRef> NiGeometry::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriBasedGeom::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::Read( in, link_stack, version, user_version );
+void NiTriBasedGeom::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::Read( in, link_stack, info );
 }
 
-void NiTriBasedGeom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometry::Write( out, link_map, version, user_version );
+void NiTriBasedGeom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometry::Write( out, link_map, info );
 }
 
 std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
@@ -1716,8 +1716,8 @@ std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::FixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriBasedGeom::InternalGetRefs() const {
@@ -1726,158 +1726,158 @@ std::list<NiObjectRef> NiTriBasedGeom::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeometryData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeometryData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( name, in, version );
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, in, info );
 	};
-	NifStream( numVertices, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort1, in, version );
+	NifStream( numVertices, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort1, in, info );
 	};
-	NifStream( hasVertices, in, version );
+	NifStream( hasVertices, in, info );
 	if ( (hasVertices != 0) ) {
 		vertices.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < vertices.size(); i2++) {
-			NifStream( vertices[i2], in, version );
+			NifStream( vertices[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numUvSets2, in, version );
-		NifStream( unknownByte, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets2, in, info );
+		NifStream( unknownByte, in, info );
 	};
-	NifStream( hasNormals, in, version );
+	NifStream( hasNormals, in, info );
 	if ( (hasNormals != 0) ) {
 		normals.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < normals.size(); i2++) {
-			NifStream( normals[i2], in, version );
+			NifStream( normals[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) {
 			unknownVectors1.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownVectors1.size(); i3++) {
-				NifStream( unknownVectors1[i3], in, version );
+				NifStream( unknownVectors1[i3], in, info );
 			};
 			unknownVectors2.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownVectors2.size(); i3++) {
-				NifStream( unknownVectors2[i3], in, version );
+				NifStream( unknownVectors2[i3], in, info );
 			};
 		};
 	};
-	NifStream( center, in, version );
-	NifStream( radius, in, version );
-	NifStream( hasVertexColors, in, version );
+	NifStream( center, in, info );
+	NifStream( radius, in, info );
+	NifStream( hasVertexColors, in, info );
 	if ( (hasVertexColors != 0) ) {
 		vertexColors.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < vertexColors.size(); i2++) {
-			NifStream( vertexColors[i2], in, version );
+			NifStream( vertexColors[i2], in, info );
 		};
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( numUvSets, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( hasUv, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasUv, in, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		uvSets.resize(numUvSets);
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			uvSets[i2].resize(numVertices);
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], in, version );
+				NifStream( uvSets[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		uvSets.resize((numUvSets2 & 63));
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			uvSets[i2].resize(numVertices);
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], in, version );
+				NifStream( uvSets[i2][i3], in, info );
 			};
 		};
-		NifStream( unknownShort2, in, version );
+		NifStream( unknownShort2, in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiGeometryData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiGeometryData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numUvSets = (unsigned short)(uvSets.size());
 	numUvSets2 = (byte)(uvSets.size());
 	numVertices = (unsigned short)(vertices.size());
-	if ( version >= 0x0A020000 ) {
-		NifStream( name, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, out, info );
 	};
-	NifStream( numVertices, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort1, out, version );
+	NifStream( numVertices, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort1, out, info );
 	};
-	NifStream( hasVertices, out, version );
+	NifStream( hasVertices, out, info );
 	if ( (hasVertices != 0) ) {
 		for (unsigned int i2 = 0; i2 < vertices.size(); i2++) {
-			NifStream( vertices[i2], out, version );
+			NifStream( vertices[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numUvSets2, out, version );
-		NifStream( unknownByte, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets2, out, info );
+		NifStream( unknownByte, out, info );
 	};
-	NifStream( hasNormals, out, version );
+	NifStream( hasNormals, out, info );
 	if ( (hasNormals != 0) ) {
 		for (unsigned int i2 = 0; i2 < normals.size(); i2++) {
-			NifStream( normals[i2], out, version );
+			NifStream( normals[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) {
 			for (unsigned int i3 = 0; i3 < unknownVectors1.size(); i3++) {
-				NifStream( unknownVectors1[i3], out, version );
+				NifStream( unknownVectors1[i3], out, info );
 			};
 			for (unsigned int i3 = 0; i3 < unknownVectors2.size(); i3++) {
-				NifStream( unknownVectors2[i3], out, version );
+				NifStream( unknownVectors2[i3], out, info );
 			};
 		};
 	};
-	NifStream( center, out, version );
-	NifStream( radius, out, version );
-	NifStream( hasVertexColors, out, version );
+	NifStream( center, out, info );
+	NifStream( radius, out, info );
+	NifStream( hasVertexColors, out, info );
 	if ( (hasVertexColors != 0) ) {
 		for (unsigned int i2 = 0; i2 < vertexColors.size(); i2++) {
-			NifStream( vertexColors[i2], out, version );
+			NifStream( vertexColors[i2], out, info );
 		};
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( numUvSets, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( hasUv, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasUv, out, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], out, version );
+				NifStream( uvSets[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], out, version );
+				NifStream( uvSets[i2][i3], out, info );
 			};
 		};
-		NifStream( unknownShort2, out, version );
+		NifStream( unknownShort2, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1987,10 +1987,10 @@ std::string NiGeometryData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeometryData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		unknownLink = FixLink<NiObject>( objects, link_stack, version );
+void NiGeometryData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		unknownLink = FixLink<NiObject>( objects, link_stack, info );
 	};
 }
 
@@ -2002,14 +2002,14 @@ std::list<NiObjectRef> NiGeometryData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriBasedGeomData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	NifStream( numTriangles, in, version );
+void NiTriBasedGeomData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	NifStream( numTriangles, in, info );
 }
 
-void NiTriBasedGeomData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	NifStream( numTriangles, out, version );
+void NiTriBasedGeomData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	NifStream( numTriangles, out, info );
 }
 
 std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
@@ -2020,8 +2020,8 @@ std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeomData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeomData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriBasedGeomData::InternalGetRefs() const {
@@ -2030,54 +2030,54 @@ std::list<NiObjectRef> NiTriBasedGeomData::InternalGetRefs() const {
 	return refs;
 }
 
-void APSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	NifStream( hasUnknownFloats1, in, version );
+void APSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	NifStream( hasUnknownFloats1, in, info );
 	if ( (hasUnknownFloats1 != 0) ) {
 		unknownFloats1.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats1.size(); i2++) {
-			NifStream( unknownFloats1[i2], in, version );
+			NifStream( unknownFloats1[i2], in, info );
 		};
 	};
-	NifStream( unknownShort3, in, version );
-	NifStream( hasUnknownFloats2, in, version );
+	NifStream( unknownShort3, in, info );
+	NifStream( hasUnknownFloats2, in, info );
 	if ( (hasUnknownFloats2 != 0) ) {
 		unknownFloats2.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], in, version );
+			NifStream( unknownFloats2[i2], in, info );
 		};
 	};
-	NifStream( hasUnknownFloats3, in, version );
+	NifStream( hasUnknownFloats3, in, info );
 	if ( (hasUnknownFloats3 != 0) ) {
 		unknownFloats3.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats3.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], in, version );
+				NifStream( unknownFloats3[i2][i3], in, info );
 			};
 		};
 	};
 }
 
-void APSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	NifStream( hasUnknownFloats1, out, version );
+void APSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	NifStream( hasUnknownFloats1, out, info );
 	if ( (hasUnknownFloats1 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats1.size(); i2++) {
-			NifStream( unknownFloats1[i2], out, version );
+			NifStream( unknownFloats1[i2], out, info );
 		};
 	};
-	NifStream( unknownShort3, out, version );
-	NifStream( hasUnknownFloats2, out, version );
+	NifStream( unknownShort3, out, info );
+	NifStream( hasUnknownFloats2, out, info );
 	if ( (hasUnknownFloats2 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], out, version );
+			NifStream( unknownFloats2[i2], out, info );
 		};
 	};
-	NifStream( hasUnknownFloats3, out, version );
+	NifStream( hasUnknownFloats3, out, info );
 	if ( (hasUnknownFloats3 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats3.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], out, version );
+				NifStream( unknownFloats3[i2][i3], out, info );
 			};
 		};
 	};
@@ -2138,8 +2138,8 @@ std::string APSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void APSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> APSysData::InternalGetRefs() const {
@@ -2148,16 +2148,16 @@ std::list<NiObjectRef> APSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBlendCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
+void bhkBlendCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
 }
 
-void bhkBlendCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
+void bhkBlendCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
 }
 
 std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
@@ -2169,8 +2169,8 @@ std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkBlendCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBlendCollisionObject::InternalGetRefs() const {
@@ -2179,14 +2179,14 @@ std::list<NiObjectRef> bhkBlendCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBlendController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
+void bhkBlendController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
 }
 
-void bhkBlendController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	NifStream( unknownInt, out, version );
+void bhkBlendController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	NifStream( unknownInt, out, info );
 }
 
 std::string bhkBlendController::InternalAsString( bool verbose ) const {
@@ -2197,8 +2197,8 @@ std::string bhkBlendController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void bhkBlendController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBlendController::InternalGetRefs() const {
@@ -2207,26 +2207,26 @@ std::list<NiObjectRef> bhkBlendController::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBoxShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( unknownShort3, in, version );
-	NifStream( unknownShort4, in, version );
-	NifStream( dimensions, in, version );
-	NifStream( min_Size, in, version );
+void bhkBoxShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownShort3, in, info );
+	NifStream( unknownShort4, in, info );
+	NifStream( dimensions, in, info );
+	NifStream( min_Size, in, info );
 }
 
-void bhkBoxShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownShort2, out, version );
-	NifStream( unknownShort3, out, version );
-	NifStream( unknownShort4, out, version );
-	NifStream( dimensions, out, version );
-	NifStream( min_Size, out, version );
+void bhkBoxShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownShort3, out, info );
+	NifStream( unknownShort4, out, info );
+	NifStream( dimensions, out, info );
+	NifStream( min_Size, out, info );
 }
 
 std::string bhkBoxShape::InternalAsString( bool verbose ) const {
@@ -2243,8 +2243,8 @@ std::string bhkBoxShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBoxShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkBoxShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBoxShape::InternalGetRefs() const {
@@ -2253,30 +2253,30 @@ std::list<NiObjectRef> bhkBoxShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkCapsuleShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( unknownShort3, in, version );
-	NifStream( unknownShort4, in, version );
-	NifStream( firstPoint, in, version );
-	NifStream( radius1, in, version );
-	NifStream( secondPoint, in, version );
-	NifStream( radius2, in, version );
+void bhkCapsuleShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( radius, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownShort3, in, info );
+	NifStream( unknownShort4, in, info );
+	NifStream( firstPoint, in, info );
+	NifStream( radius1, in, info );
+	NifStream( secondPoint, in, info );
+	NifStream( radius2, in, info );
 }
 
-void bhkCapsuleShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownShort2, out, version );
-	NifStream( unknownShort3, out, version );
-	NifStream( unknownShort4, out, version );
-	NifStream( firstPoint, out, version );
-	NifStream( radius1, out, version );
-	NifStream( secondPoint, out, version );
-	NifStream( radius2, out, version );
+void bhkCapsuleShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( radius, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownShort3, out, info );
+	NifStream( unknownShort4, out, info );
+	NifStream( firstPoint, out, info );
+	NifStream( radius1, out, info );
+	NifStream( secondPoint, out, info );
+	NifStream( radius2, out, info );
 }
 
 std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
@@ -2295,8 +2295,8 @@ std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCapsuleShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkCapsuleShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkCapsuleShape::InternalGetRefs() const {
@@ -2305,12 +2305,12 @@ std::list<NiObjectRef> bhkCapsuleShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
+void bhkCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
 }
 
-void bhkCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
+void bhkCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
 }
 
 std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
@@ -2320,8 +2320,8 @@ std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkCollisionObject::InternalGetRefs() const {
@@ -2330,37 +2330,37 @@ std::list<NiObjectRef> bhkCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexVerticesShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
+void bhkConvexVerticesShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknownFloats1[i1], in, version );
+		NifStream( unknownFloats1[i1], in, info );
 	};
-	NifStream( numVertices, in, version );
+	NifStream( numVertices, in, info );
 	vertices.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], in, version );
+		NifStream( vertices[i1], in, info );
 	};
-	NifStream( numNormals, in, version );
+	NifStream( numNormals, in, info );
 	normals.resize(numNormals);
 	for (unsigned int i1 = 0; i1 < normals.size(); i1++) {
-		NifStream( normals[i1], in, version );
+		NifStream( normals[i1], in, info );
 	};
 }
 
-void bhkConvexVerticesShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkConvexVerticesShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numNormals = (unsigned int)(normals.size());
 	numVertices = (unsigned int)(vertices.size());
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknownFloats1[i1], out, version );
+		NifStream( unknownFloats1[i1], out, info );
 	};
-	NifStream( numVertices, out, version );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], out, version );
+		NifStream( vertices[i1], out, info );
 	};
-	NifStream( numNormals, out, version );
+	NifStream( numNormals, out, info );
 	for (unsigned int i1 = 0; i1 < normals.size(); i1++) {
-		NifStream( normals[i1], out, version );
+		NifStream( normals[i1], out, info );
 	};
 }
 
@@ -2411,8 +2411,8 @@ std::string bhkConvexVerticesShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexVerticesShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexVerticesShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexVerticesShape::InternalGetRefs() const {
@@ -2421,20 +2421,20 @@ std::list<NiObjectRef> bhkConvexVerticesShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
+void bhkHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( unknownFloats[i1][i2], in, version );
+			NifStream( unknownFloats[i1][i2], in, info );
 		};
 	};
 }
 
-void bhkHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
+void bhkHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( unknownFloats[i1][i2], out, version );
+			NifStream( unknownFloats[i1][i2], out, info );
 		};
 	};
 }
@@ -2460,8 +2460,8 @@ std::string bhkHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkHingeConstraint::InternalGetRefs() const {
@@ -2470,32 +2470,32 @@ std::list<NiObjectRef> bhkHingeConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkLimitedHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( limitedHinge.pivotA, in, version );
-	NifStream( limitedHinge.axleA, in, version );
-	NifStream( limitedHinge.perp2axleina1, in, version );
-	NifStream( limitedHinge.perp2axleina2, in, version );
-	NifStream( limitedHinge.pivotB, in, version );
-	NifStream( limitedHinge.axleB, in, version );
-	NifStream( limitedHinge.perp2axleinb2, in, version );
-	NifStream( limitedHinge.minAngle, in, version );
-	NifStream( limitedHinge.maxAngle, in, version );
-	NifStream( limitedHinge.maxFriction, in, version );
+void bhkLimitedHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( limitedHinge.pivotA, in, info );
+	NifStream( limitedHinge.axleA, in, info );
+	NifStream( limitedHinge.perp2axleina1, in, info );
+	NifStream( limitedHinge.perp2axleina2, in, info );
+	NifStream( limitedHinge.pivotB, in, info );
+	NifStream( limitedHinge.axleB, in, info );
+	NifStream( limitedHinge.perp2axleinb2, in, info );
+	NifStream( limitedHinge.minAngle, in, info );
+	NifStream( limitedHinge.maxAngle, in, info );
+	NifStream( limitedHinge.maxFriction, in, info );
 }
 
-void bhkLimitedHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( limitedHinge.pivotA, out, version );
-	NifStream( limitedHinge.axleA, out, version );
-	NifStream( limitedHinge.perp2axleina1, out, version );
-	NifStream( limitedHinge.perp2axleina2, out, version );
-	NifStream( limitedHinge.pivotB, out, version );
-	NifStream( limitedHinge.axleB, out, version );
-	NifStream( limitedHinge.perp2axleinb2, out, version );
-	NifStream( limitedHinge.minAngle, out, version );
-	NifStream( limitedHinge.maxAngle, out, version );
-	NifStream( limitedHinge.maxFriction, out, version );
+void bhkLimitedHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( limitedHinge.pivotA, out, info );
+	NifStream( limitedHinge.axleA, out, info );
+	NifStream( limitedHinge.perp2axleina1, out, info );
+	NifStream( limitedHinge.perp2axleina2, out, info );
+	NifStream( limitedHinge.pivotB, out, info );
+	NifStream( limitedHinge.axleB, out, info );
+	NifStream( limitedHinge.perp2axleinb2, out, info );
+	NifStream( limitedHinge.minAngle, out, info );
+	NifStream( limitedHinge.maxAngle, out, info );
+	NifStream( limitedHinge.maxFriction, out, info );
 }
 
 std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
@@ -2515,8 +2515,8 @@ std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkLimitedHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkLimitedHingeConstraint::InternalGetRefs() const {
@@ -2525,44 +2525,44 @@ std::list<NiObjectRef> bhkLimitedHingeConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkListShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkListShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numSubShapes, in, version );
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numSubShapes, in, info );
 	subShapes.resize(numSubShapes);
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( material, in, version );
+	NifStream( material, in, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
-	NifStream( numUnknownInts, in, version );
+	NifStream( numUnknownInts, in, info );
 	unknownInts.resize(numUnknownInts);
 	for (unsigned int i1 = 0; i1 < unknownInts.size(); i1++) {
-		NifStream( unknownInts[i1], in, version );
+		NifStream( unknownInts[i1], in, info );
 	};
 }
 
-void bhkListShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void bhkListShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numUnknownInts = (unsigned int)(unknownInts.size());
 	numSubShapes = (unsigned int)(subShapes.size());
-	NifStream( numSubShapes, out, version );
+	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
 		if ( subShapes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( material, out, version );
+	NifStream( material, out, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
-	NifStream( numUnknownInts, out, version );
+	NifStream( numUnknownInts, out, info );
 	for (unsigned int i1 = 0; i1 < unknownInts.size(); i1++) {
-		NifStream( unknownInts[i1], out, version );
+		NifStream( unknownInts[i1], out, info );
 	};
 }
 
@@ -2614,10 +2614,10 @@ std::string bhkListShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkListShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
+void bhkListShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, version );
+		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, info );
 	};
 }
 
@@ -2631,87 +2631,87 @@ std::list<NiObjectRef> bhkListShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMalleableConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMalleableConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( type, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( block_num, in, version );
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( type, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt3, in, version );
+	NifStream( unknownInt3, in, info );
 	if ( (type == 7) ) {
-		NifStream( ragdoll.pivotA, in, version );
-		NifStream( ragdoll.planeA, in, version );
-		NifStream( ragdoll.twistA, in, version );
-		NifStream( ragdoll.pivotB, in, version );
-		NifStream( ragdoll.planeB, in, version );
-		NifStream( ragdoll.twistB, in, version );
-		NifStream( ragdoll.coneMinAngle, in, version );
-		NifStream( ragdoll.planeMinAngle, in, version );
-		NifStream( ragdoll.planeMaxAngle, in, version );
-		NifStream( ragdoll.twistMinAngle, in, version );
-		NifStream( ragdoll.twistMaxAngle, in, version );
-		NifStream( ragdoll.maxFriction, in, version );
+		NifStream( ragdoll.pivotA, in, info );
+		NifStream( ragdoll.planeA, in, info );
+		NifStream( ragdoll.twistA, in, info );
+		NifStream( ragdoll.pivotB, in, info );
+		NifStream( ragdoll.planeB, in, info );
+		NifStream( ragdoll.twistB, in, info );
+		NifStream( ragdoll.coneMinAngle, in, info );
+		NifStream( ragdoll.planeMinAngle, in, info );
+		NifStream( ragdoll.planeMaxAngle, in, info );
+		NifStream( ragdoll.twistMinAngle, in, info );
+		NifStream( ragdoll.twistMaxAngle, in, info );
+		NifStream( ragdoll.maxFriction, in, info );
 	};
 	if ( (type == 2) ) {
-		NifStream( limitedHinge.pivotA, in, version );
-		NifStream( limitedHinge.axleA, in, version );
-		NifStream( limitedHinge.perp2axleina1, in, version );
-		NifStream( limitedHinge.perp2axleina2, in, version );
-		NifStream( limitedHinge.pivotB, in, version );
-		NifStream( limitedHinge.axleB, in, version );
-		NifStream( limitedHinge.perp2axleinb2, in, version );
-		NifStream( limitedHinge.minAngle, in, version );
-		NifStream( limitedHinge.maxAngle, in, version );
-		NifStream( limitedHinge.maxFriction, in, version );
-	};
-	NifStream( tau, in, version );
-	NifStream( damping, in, version );
-}
-
-void bhkMalleableConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( type, out, version );
-	NifStream( unknownInt2, out, version );
+		NifStream( limitedHinge.pivotA, in, info );
+		NifStream( limitedHinge.axleA, in, info );
+		NifStream( limitedHinge.perp2axleina1, in, info );
+		NifStream( limitedHinge.perp2axleina2, in, info );
+		NifStream( limitedHinge.pivotB, in, info );
+		NifStream( limitedHinge.axleB, in, info );
+		NifStream( limitedHinge.perp2axleinb2, in, info );
+		NifStream( limitedHinge.minAngle, in, info );
+		NifStream( limitedHinge.maxAngle, in, info );
+		NifStream( limitedHinge.maxFriction, in, info );
+	};
+	NifStream( tau, in, info );
+	NifStream( damping, in, info );
+}
+
+void bhkMalleableConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( type, out, info );
+	NifStream( unknownInt2, out, info );
 	if ( unknownLink1 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt3, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt3, out, info );
 	if ( (type == 7) ) {
-		NifStream( ragdoll.pivotA, out, version );
-		NifStream( ragdoll.planeA, out, version );
-		NifStream( ragdoll.twistA, out, version );
-		NifStream( ragdoll.pivotB, out, version );
-		NifStream( ragdoll.planeB, out, version );
-		NifStream( ragdoll.twistB, out, version );
-		NifStream( ragdoll.coneMinAngle, out, version );
-		NifStream( ragdoll.planeMinAngle, out, version );
-		NifStream( ragdoll.planeMaxAngle, out, version );
-		NifStream( ragdoll.twistMinAngle, out, version );
-		NifStream( ragdoll.twistMaxAngle, out, version );
-		NifStream( ragdoll.maxFriction, out, version );
+		NifStream( ragdoll.pivotA, out, info );
+		NifStream( ragdoll.planeA, out, info );
+		NifStream( ragdoll.twistA, out, info );
+		NifStream( ragdoll.pivotB, out, info );
+		NifStream( ragdoll.planeB, out, info );
+		NifStream( ragdoll.twistB, out, info );
+		NifStream( ragdoll.coneMinAngle, out, info );
+		NifStream( ragdoll.planeMinAngle, out, info );
+		NifStream( ragdoll.planeMaxAngle, out, info );
+		NifStream( ragdoll.twistMinAngle, out, info );
+		NifStream( ragdoll.twistMaxAngle, out, info );
+		NifStream( ragdoll.maxFriction, out, info );
 	};
 	if ( (type == 2) ) {
-		NifStream( limitedHinge.pivotA, out, version );
-		NifStream( limitedHinge.axleA, out, version );
-		NifStream( limitedHinge.perp2axleina1, out, version );
-		NifStream( limitedHinge.perp2axleina2, out, version );
-		NifStream( limitedHinge.pivotB, out, version );
-		NifStream( limitedHinge.axleB, out, version );
-		NifStream( limitedHinge.perp2axleinb2, out, version );
-		NifStream( limitedHinge.minAngle, out, version );
-		NifStream( limitedHinge.maxAngle, out, version );
-		NifStream( limitedHinge.maxFriction, out, version );
+		NifStream( limitedHinge.pivotA, out, info );
+		NifStream( limitedHinge.axleA, out, info );
+		NifStream( limitedHinge.perp2axleina1, out, info );
+		NifStream( limitedHinge.perp2axleina2, out, info );
+		NifStream( limitedHinge.pivotB, out, info );
+		NifStream( limitedHinge.axleB, out, info );
+		NifStream( limitedHinge.perp2axleinb2, out, info );
+		NifStream( limitedHinge.minAngle, out, info );
+		NifStream( limitedHinge.maxAngle, out, info );
+		NifStream( limitedHinge.maxFriction, out, info );
 	};
-	NifStream( tau, out, version );
-	NifStream( damping, out, version );
+	NifStream( tau, out, info );
+	NifStream( damping, out, info );
 }
 
 std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
@@ -2754,10 +2754,10 @@ std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMalleableConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
-	unknownLink1 = FixLink<NiObject>( objects, link_stack, version );
-	unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
+void bhkMalleableConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
+	unknownLink1 = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMalleableConstraint::InternalGetRefs() const {
@@ -2770,42 +2770,42 @@ std::list<NiObjectRef> bhkMalleableConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMoppBvTreeShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMoppBvTreeShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkShape::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	bhkShape::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( material, in, version );
+	NifStream( material, in, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknown8Bytes[i1], in, version );
+		NifStream( unknown8Bytes[i1], in, info );
 	};
-	NifStream( unknownFloat, in, version );
-	NifStream( moppDataSize, in, version );
-	NifStream( objectCorner, in, version );
-	NifStream( scalingFactor, in, version );
+	NifStream( unknownFloat, in, info );
+	NifStream( moppDataSize, in, info );
+	NifStream( objectCorner, in, info );
+	NifStream( scalingFactor, in, info );
 	moppData.resize(moppDataSize);
 	for (unsigned int i1 = 0; i1 < moppData.size(); i1++) {
-		NifStream( moppData[i1], in, version );
+		NifStream( moppData[i1], in, info );
 	};
 }
 
-void bhkMoppBvTreeShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void bhkMoppBvTreeShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 	moppDataSize = (unsigned int)(moppData.size());
 	if ( shape != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( material, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( material, out, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknown8Bytes[i1], out, version );
+		NifStream( unknown8Bytes[i1], out, info );
 	};
-	NifStream( unknownFloat, out, version );
-	NifStream( moppDataSize, out, version );
-	NifStream( objectCorner, out, version );
-	NifStream( scalingFactor, out, version );
+	NifStream( unknownFloat, out, info );
+	NifStream( moppDataSize, out, info );
+	NifStream( objectCorner, out, info );
+	NifStream( scalingFactor, out, info );
 	for (unsigned int i1 = 0; i1 < moppData.size(); i1++) {
-		NifStream( moppData[i1], out, version );
+		NifStream( moppData[i1], out, info );
 	};
 }
 
@@ -2847,9 +2847,9 @@ std::string bhkMoppBvTreeShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMoppBvTreeShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
-	shape = FixLink<bhkShape>( objects, link_stack, version );
+void bhkMoppBvTreeShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
+	shape = FixLink<bhkShape>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMoppBvTreeShape::InternalGetRefs() const {
@@ -2860,29 +2860,29 @@ std::list<NiObjectRef> bhkMoppBvTreeShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMultiSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( numSpheres, in, version );
+void bhkMultiSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( numSpheres, in, info );
 	spheres.resize(numSpheres);
 	for (unsigned int i1 = 0; i1 < spheres.size(); i1++) {
-		NifStream( spheres[i1].center, in, version );
-		NifStream( spheres[i1].radius, in, version );
+		NifStream( spheres[i1].center, in, info );
+		NifStream( spheres[i1].radius, in, info );
 	};
 }
 
-void bhkMultiSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkMultiSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numSpheres = (unsigned int)(spheres.size());
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( numSpheres, out, version );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( numSpheres, out, info );
 	for (unsigned int i1 = 0; i1 < spheres.size(); i1++) {
-		NifStream( spheres[i1].center, out, version );
-		NifStream( spheres[i1].radius, out, version );
+		NifStream( spheres[i1].center, out, info );
+		NifStream( spheres[i1].radius, out, info );
 	};
 }
 
@@ -2907,8 +2907,8 @@ std::string bhkMultiSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMultiSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkMultiSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMultiSphereShape::InternalGetRefs() const {
@@ -2917,56 +2917,56 @@ std::list<NiObjectRef> bhkMultiSphereShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownInt1, in, version );
+	bhkSphereRepShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt1, in, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownInts1[i1], in, version );
+		NifStream( unknownInts1[i1], in, info );
 	};
-	NifStream( unknownInt2, in, version );
-	NifStream( scale, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( numStripsData, in, version );
+	NifStream( unknownInt2, in, info );
+	NifStream( scale, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( numStripsData, in, info );
 	stripsData.resize(numStripsData);
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numDataLayers, in, version );
+	NifStream( numDataLayers, in, info );
 	dataLayers.resize(numDataLayers);
 	for (unsigned int i1 = 0; i1 < dataLayers.size(); i1++) {
-		NifStream( dataLayers[i1].layer, in, version );
-		NifStream( dataLayers[i1].colFilter, in, version );
-		NifStream( dataLayers[i1].unknownShort, in, version );
+		NifStream( dataLayers[i1].layer, in, info );
+		NifStream( dataLayers[i1].colFilter, in, info );
+		NifStream( dataLayers[i1].unknownShort, in, info );
 	};
 }
 
-void bhkNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numDataLayers = (unsigned int)(dataLayers.size());
 	numStripsData = (unsigned int)(stripsData.size());
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownInt1, out, version );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt1, out, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownInts1[i1], out, version );
+		NifStream( unknownInts1[i1], out, info );
 	};
-	NifStream( unknownInt2, out, version );
-	NifStream( scale, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( numStripsData, out, version );
+	NifStream( unknownInt2, out, info );
+	NifStream( scale, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( numStripsData, out, info );
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
 		if ( stripsData[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(stripsData[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(stripsData[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numDataLayers, out, version );
+	NifStream( numDataLayers, out, info );
 	for (unsigned int i1 = 0; i1 < dataLayers.size(); i1++) {
-		NifStream( dataLayers[i1].layer, out, version );
-		NifStream( dataLayers[i1].colFilter, out, version );
-		NifStream( dataLayers[i1].unknownShort, out, version );
+		NifStream( dataLayers[i1].layer, out, info );
+		NifStream( dataLayers[i1].colFilter, out, info );
+		NifStream( dataLayers[i1].unknownShort, out, info );
 	};
 }
 
@@ -3020,10 +3020,10 @@ std::string bhkNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
-		stripsData[i1] = FixLink<NiTriStripsData>( objects, link_stack, version );
+		stripsData[i1] = FixLink<NiTriStripsData>( objects, link_stack, info );
 	};
 }
 
@@ -3037,51 +3037,51 @@ std::list<NiObjectRef> bhkNiTriStripsShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkPackedNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPackedNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numSubShapes, in, version );
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numSubShapes, in, info );
 	subShapes.resize(numSubShapes);
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( subShapes[i1].layer, in, version );
-		NifStream( subShapes[i1].colFilter, in, version );
-		NifStream( subShapes[i1].unknownShort, in, version );
-		NifStream( subShapes[i1].vertexCount___, in, version );
-		NifStream( subShapes[i1].material, in, version );
+		NifStream( subShapes[i1].layer, in, info );
+		NifStream( subShapes[i1].colFilter, in, info );
+		NifStream( subShapes[i1].unknownShort, in, info );
+		NifStream( subShapes[i1].vertexCount___, in, info );
+		NifStream( subShapes[i1].material, in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 9; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
-	NifStream( scale, in, version );
+	NifStream( scale, in, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], in, version );
+		NifStream( unknownFloats2[i1], in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void bhkPackedNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void bhkPackedNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numSubShapes = (unsigned short)(subShapes.size());
-	NifStream( numSubShapes, out, version );
+	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( subShapes[i1].layer, out, version );
-		NifStream( subShapes[i1].colFilter, out, version );
-		NifStream( subShapes[i1].unknownShort, out, version );
-		NifStream( subShapes[i1].vertexCount___, out, version );
-		NifStream( subShapes[i1].material, out, version );
+		NifStream( subShapes[i1].layer, out, info );
+		NifStream( subShapes[i1].colFilter, out, info );
+		NifStream( subShapes[i1].unknownShort, out, info );
+		NifStream( subShapes[i1].vertexCount___, out, info );
+		NifStream( subShapes[i1].material, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 9; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
-	NifStream( scale, out, version );
+	NifStream( scale, out, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], out, version );
+		NifStream( unknownFloats2[i1], out, info );
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
@@ -3131,9 +3131,9 @@ std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPackedNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<hkPackedNiTriStripsData>( objects, link_stack, version );
+void bhkPackedNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
+	data = FixLink<hkPackedNiTriStripsData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkPackedNiTriStripsShape::InternalGetRefs() const {
@@ -3144,23 +3144,23 @@ std::list<NiObjectRef> bhkPackedNiTriStripsShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkPrismaticConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
+void bhkPrismaticConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknownVectors[i1], in, version );
+		NifStream( unknownVectors[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], in, version );
+		NifStream( unknownFloats2[i1], in, info );
 	};
 }
 
-void bhkPrismaticConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
+void bhkPrismaticConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknownVectors[i1], out, version );
+		NifStream( unknownVectors[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], out, version );
+		NifStream( unknownFloats2[i1], out, info );
 	};
 }
 
@@ -3195,8 +3195,8 @@ std::string bhkPrismaticConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPrismaticConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkPrismaticConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkPrismaticConstraint::InternalGetRefs() const {
@@ -3205,12 +3205,12 @@ std::list<NiObjectRef> bhkPrismaticConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkRagdollConstraint::Read( in, link_stack, version, user_version );
+void bhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkRagdollConstraint::Read( in, link_stack, info );
 }
 
-void bhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkRagdollConstraint::Write( out, link_map, version, user_version );
+void bhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkRagdollConstraint::Write( out, link_map, info );
 }
 
 std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
@@ -3220,8 +3220,8 @@ std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkRagdollConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkRagdollConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRagdollConstraint::InternalGetRefs() const {
@@ -3230,111 +3230,111 @@ std::list<NiObjectRef> bhkRagdollConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRigidBody::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBody::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkEntity::Read( in, link_stack, version, user_version );
+	bhkEntity::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
-		NifStream( unknown5Floats[i1], in, version );
+		NifStream( unknown5Floats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], in, version );
+		NifStream( unknown4Shorts[i1], in, info );
 	};
-	NifStream( layerCopy, in, version );
-	NifStream( colFilterCopy, in, version );
+	NifStream( layerCopy, in, info );
+	NifStream( colFilterCopy, in, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknown7Shorts[i1], in, version );
-	};
-	NifStream( translation, in, version );
-	NifStream( unknownFloat00, in, version );
-	NifStream( rotation.x, in, version );
-	NifStream( rotation.y, in, version );
-	NifStream( rotation.z, in, version );
-	NifStream( rotation.w, in, version );
-	NifStream( linearVelocity, in, version );
-	NifStream( unknownFloat01, in, version );
-	NifStream( angularVelocity, in, version );
-	NifStream( unknownFloat02, in, version );
+		NifStream( unknown7Shorts[i1], in, info );
+	};
+	NifStream( translation, in, info );
+	NifStream( unknownFloat00, in, info );
+	NifStream( rotation.x, in, info );
+	NifStream( rotation.y, in, info );
+	NifStream( rotation.z, in, info );
+	NifStream( rotation.w, in, info );
+	NifStream( linearVelocity, in, info );
+	NifStream( unknownFloat01, in, info );
+	NifStream( angularVelocity, in, info );
+	NifStream( unknownFloat02, in, info );
 	for (unsigned int i1 = 0; i1 < 12; i1++) {
-		NifStream( inertia[i1], in, version );
-	};
-	NifStream( center, in, version );
-	NifStream( unknownFloat03, in, version );
-	NifStream( mass, in, version );
-	NifStream( linearDamping, in, version );
-	NifStream( angularDamping, in, version );
-	NifStream( friction, in, version );
-	NifStream( restitution, in, version );
-	NifStream( maxLinearVelocity, in, version );
-	NifStream( maxAngularVelocity, in, version );
-	NifStream( penetrationDepth, in, version );
-	NifStream( motionSystem, in, version );
-	NifStream( unknownByte1, in, version );
-	NifStream( unknownByte2, in, version );
-	NifStream( qualityType, in, version );
-	NifStream( unknownInt6, in, version );
-	NifStream( unknownInt7, in, version );
-	NifStream( unknownInt8, in, version );
-	NifStream( numConstraints, in, version );
+		NifStream( inertia[i1], in, info );
+	};
+	NifStream( center, in, info );
+	NifStream( unknownFloat03, in, info );
+	NifStream( mass, in, info );
+	NifStream( linearDamping, in, info );
+	NifStream( angularDamping, in, info );
+	NifStream( friction, in, info );
+	NifStream( restitution, in, info );
+	NifStream( maxLinearVelocity, in, info );
+	NifStream( maxAngularVelocity, in, info );
+	NifStream( penetrationDepth, in, info );
+	NifStream( motionSystem, in, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownByte2, in, info );
+	NifStream( qualityType, in, info );
+	NifStream( unknownInt6, in, info );
+	NifStream( unknownInt7, in, info );
+	NifStream( unknownInt8, in, info );
+	NifStream( numConstraints, in, info );
 	constraints.resize(numConstraints);
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( unknownInt6, in, version );
+	NifStream( unknownInt6, in, info );
 }
 
-void bhkRigidBody::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
+void bhkRigidBody::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
 	numConstraints = (unsigned int)(constraints.size());
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
-		NifStream( unknown5Floats[i1], out, version );
+		NifStream( unknown5Floats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], out, version );
+		NifStream( unknown4Shorts[i1], out, info );
 	};
-	NifStream( layerCopy, out, version );
-	NifStream( colFilterCopy, out, version );
+	NifStream( layerCopy, out, info );
+	NifStream( colFilterCopy, out, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknown7Shorts[i1], out, version );
-	};
-	NifStream( translation, out, version );
-	NifStream( unknownFloat00, out, version );
-	NifStream( rotation.x, out, version );
-	NifStream( rotation.y, out, version );
-	NifStream( rotation.z, out, version );
-	NifStream( rotation.w, out, version );
-	NifStream( linearVelocity, out, version );
-	NifStream( unknownFloat01, out, version );
-	NifStream( angularVelocity, out, version );
-	NifStream( unknownFloat02, out, version );
+		NifStream( unknown7Shorts[i1], out, info );
+	};
+	NifStream( translation, out, info );
+	NifStream( unknownFloat00, out, info );
+	NifStream( rotation.x, out, info );
+	NifStream( rotation.y, out, info );
+	NifStream( rotation.z, out, info );
+	NifStream( rotation.w, out, info );
+	NifStream( linearVelocity, out, info );
+	NifStream( unknownFloat01, out, info );
+	NifStream( angularVelocity, out, info );
+	NifStream( unknownFloat02, out, info );
 	for (unsigned int i1 = 0; i1 < 12; i1++) {
-		NifStream( inertia[i1], out, version );
-	};
-	NifStream( center, out, version );
-	NifStream( unknownFloat03, out, version );
-	NifStream( mass, out, version );
-	NifStream( linearDamping, out, version );
-	NifStream( angularDamping, out, version );
-	NifStream( friction, out, version );
-	NifStream( restitution, out, version );
-	NifStream( maxLinearVelocity, out, version );
-	NifStream( maxAngularVelocity, out, version );
-	NifStream( penetrationDepth, out, version );
-	NifStream( motionSystem, out, version );
-	NifStream( unknownByte1, out, version );
-	NifStream( unknownByte2, out, version );
-	NifStream( qualityType, out, version );
-	NifStream( unknownInt6, out, version );
-	NifStream( unknownInt7, out, version );
-	NifStream( unknownInt8, out, version );
-	NifStream( numConstraints, out, version );
+		NifStream( inertia[i1], out, info );
+	};
+	NifStream( center, out, info );
+	NifStream( unknownFloat03, out, info );
+	NifStream( mass, out, info );
+	NifStream( linearDamping, out, info );
+	NifStream( angularDamping, out, info );
+	NifStream( friction, out, info );
+	NifStream( restitution, out, info );
+	NifStream( maxLinearVelocity, out, info );
+	NifStream( maxAngularVelocity, out, info );
+	NifStream( penetrationDepth, out, info );
+	NifStream( motionSystem, out, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownByte2, out, info );
+	NifStream( qualityType, out, info );
+	NifStream( unknownInt6, out, info );
+	NifStream( unknownInt7, out, info );
+	NifStream( unknownInt8, out, info );
+	NifStream( numConstraints, out, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
 		if ( constraints[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(constraints[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(constraints[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( unknownInt6, out, version );
+	NifStream( unknownInt6, out, info );
 }
 
 std::string bhkRigidBody::InternalAsString( bool verbose ) const {
@@ -3435,10 +3435,10 @@ std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBody::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkRigidBody::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
-		constraints[i1] = FixLink<AbhkConstraint>( objects, link_stack, version );
+		constraints[i1] = FixLink<AbhkConstraint>( objects, link_stack, info );
 	};
 }
 
@@ -3452,12 +3452,12 @@ std::list<NiObjectRef> bhkRigidBody::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRigidBodyT::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRigidBody::Read( in, link_stack, version, user_version );
+void bhkRigidBodyT::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRigidBody::Read( in, link_stack, info );
 }
 
-void bhkRigidBodyT::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkRigidBody::Write( out, link_map, version, user_version );
+void bhkRigidBodyT::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkRigidBody::Write( out, link_map, info );
 }
 
 std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
@@ -3467,8 +3467,8 @@ std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBodyT::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRigidBody::FixLinks( objects, link_stack, version, user_version );
+void bhkRigidBodyT::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRigidBody::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRigidBodyT::InternalGetRefs() const {
@@ -3477,30 +3477,30 @@ std::list<NiObjectRef> bhkRigidBodyT::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSimpleShapePhantom::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::Read( in, link_stack, version, user_version );
+void bhkSimpleShapePhantom::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unkownFloats[i1], in, version );
+		NifStream( unkownFloats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
 		for (unsigned int i2 = 0; i2 < 5; i2++) {
-			NifStream( unknownFloats2[i1][i2], in, version );
+			NifStream( unknownFloats2[i1][i2], in, info );
 		};
 	};
-	NifStream( unknownFloat, in, version );
+	NifStream( unknownFloat, in, info );
 }
 
-void bhkSimpleShapePhantom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
+void bhkSimpleShapePhantom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unkownFloats[i1], out, version );
+		NifStream( unkownFloats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
 		for (unsigned int i2 = 0; i2 < 5; i2++) {
-			NifStream( unknownFloats2[i1][i2], out, version );
+			NifStream( unknownFloats2[i1][i2], out, info );
 		};
 	};
-	NifStream( unknownFloat, out, version );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
@@ -3537,8 +3537,8 @@ std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSimpleShapePhantom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkSimpleShapePhantom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSimpleShapePhantom::InternalGetRefs() const {
@@ -3547,12 +3547,12 @@ std::list<NiObjectRef> bhkSimpleShapePhantom::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSPCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
+void bhkSPCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
 }
 
-void bhkSPCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
+void bhkSPCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
 }
 
 std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
@@ -3562,8 +3562,8 @@ std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSPCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkSPCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSPCollisionObject::InternalGetRefs() const {
@@ -3572,14 +3572,14 @@ std::list<NiObjectRef> bhkSPCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
+void bhkSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( radius, in, info );
 }
 
-void bhkSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
+void bhkSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( radius, out, info );
 }
 
 std::string bhkSphereShape::InternalAsString( bool verbose ) const {
@@ -3590,8 +3590,8 @@ std::string bhkSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSphereShape::InternalGetRefs() const {
@@ -3600,18 +3600,18 @@ std::list<NiObjectRef> bhkSphereShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkStiffSpringConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( pivotA, in, version );
-	NifStream( pivotB, in, version );
-	NifStream( length, in, version );
+void bhkStiffSpringConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( pivotA, in, info );
+	NifStream( pivotB, in, info );
+	NifStream( length, in, info );
 }
 
-void bhkStiffSpringConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( pivotA, out, version );
-	NifStream( pivotB, out, version );
-	NifStream( length, out, version );
+void bhkStiffSpringConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( pivotA, out, info );
+	NifStream( pivotB, out, info );
+	NifStream( length, out, info );
 }
 
 std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
@@ -3624,8 +3624,8 @@ std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkStiffSpringConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkStiffSpringConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkStiffSpringConstraint::InternalGetRefs() const {
@@ -3634,20 +3634,20 @@ std::list<NiObjectRef> bhkStiffSpringConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( transform, in, version );
+void bhkTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( transform, in, info );
 }
 
-void bhkTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( transform, out, version );
+void bhkTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( transform, out, info );
 }
 
 std::string bhkTransformShape::InternalAsString( bool verbose ) const {
@@ -3661,8 +3661,8 @@ std::string bhkTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkTransformShape::InternalGetRefs() const {
@@ -3671,12 +3671,12 @@ std::list<NiObjectRef> bhkTransformShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkTransformShape::Read( in, link_stack, version, user_version );
+void bhkConvexTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkTransformShape::Read( in, link_stack, info );
 }
 
-void bhkConvexTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkTransformShape::Write( out, link_map, version, user_version );
+void bhkConvexTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkTransformShape::Write( out, link_map, info );
 }
 
 std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
@@ -3686,8 +3686,8 @@ std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkTransformShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkTransformShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexTransformShape::InternalGetRefs() const {
@@ -3696,16 +3696,16 @@ std::list<NiObjectRef> bhkConvexTransformShape::InternalGetRefs() const {
 	return refs;
 }
 
-void BSBound::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( center, in, version );
-	NifStream( dimensions, in, version );
+void BSBound::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( center, in, info );
+	NifStream( dimensions, in, info );
 }
 
-void BSBound::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( center, out, version );
-	NifStream( dimensions, out, version );
+void BSBound::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( center, out, info );
+	NifStream( dimensions, out, info );
 }
 
 std::string BSBound::InternalAsString( bool verbose ) const {
@@ -3717,8 +3717,8 @@ std::string BSBound::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSBound::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSBound::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSBound::InternalGetRefs() const {
@@ -3727,27 +3727,27 @@ std::list<NiObjectRef> BSBound::InternalGetRefs() const {
 	return refs;
 }
 
-void BSFurnitureMarker::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numPositions, in, version );
+void BSFurnitureMarker::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numPositions, in, info );
 	positions.resize(numPositions);
 	for (unsigned int i1 = 0; i1 < positions.size(); i1++) {
-		NifStream( positions[i1].offset, in, version );
-		NifStream( positions[i1].orientation, in, version );
-		NifStream( positions[i1].positionRef1, in, version );
-		NifStream( positions[i1].positionRef2, in, version );
+		NifStream( positions[i1].offset, in, info );
+		NifStream( positions[i1].orientation, in, info );
+		NifStream( positions[i1].positionRef1, in, info );
+		NifStream( positions[i1].positionRef2, in, info );
 	};
 }
 
-void BSFurnitureMarker::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void BSFurnitureMarker::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numPositions = (unsigned int)(positions.size());
-	NifStream( numPositions, out, version );
+	NifStream( numPositions, out, info );
 	for (unsigned int i1 = 0; i1 < positions.size(); i1++) {
-		NifStream( positions[i1].offset, out, version );
-		NifStream( positions[i1].orientation, out, version );
-		NifStream( positions[i1].positionRef1, out, version );
-		NifStream( positions[i1].positionRef2, out, version );
+		NifStream( positions[i1].offset, out, info );
+		NifStream( positions[i1].orientation, out, info );
+		NifStream( positions[i1].positionRef1, out, info );
+		NifStream( positions[i1].positionRef2, out, info );
 	};
 }
 
@@ -3771,8 +3771,8 @@ std::string BSFurnitureMarker::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSFurnitureMarker::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSFurnitureMarker::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSFurnitureMarker::InternalGetRefs() const {
@@ -3781,14 +3781,14 @@ std::list<NiObjectRef> BSFurnitureMarker::InternalGetRefs() const {
 	return refs;
 }
 
-void BSParentVelocityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat, in, version );
+void BSParentVelocityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat, in, info );
 }
 
-void BSParentVelocityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat, out, version );
+void BSParentVelocityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
@@ -3799,8 +3799,8 @@ std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSParentVelocityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void BSParentVelocityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSParentVelocityModifier::InternalGetRefs() const {
@@ -3809,12 +3809,12 @@ std::list<NiObjectRef> BSParentVelocityModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void BSPSysArrayEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
+void BSPSysArrayEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
 }
 
-void BSPSysArrayEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
+void BSPSysArrayEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
 }
 
 std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
@@ -3824,8 +3824,8 @@ std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSPSysArrayEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void BSPSysArrayEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSPSysArrayEmitter::InternalGetRefs() const {
@@ -3834,14 +3834,14 @@ std::list<NiObjectRef> BSPSysArrayEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void BSXFlags::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void BSXFlags::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void BSXFlags::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void BSXFlags::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string BSXFlags::InternalAsString( bool verbose ) const {
@@ -3852,8 +3852,8 @@ std::string BSXFlags::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSXFlags::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSXFlags::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSXFlags::InternalGetRefs() const {
@@ -3862,35 +3862,35 @@ std::list<NiObjectRef> BSXFlags::InternalGetRefs() const {
 	return refs;
 }
 
-void hkPackedNiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numTriangles, in, version );
+void hkPackedNiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numTriangles, in, info );
 	triangles.resize(numTriangles);
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
-		NifStream( triangles[i1].triangle, in, version );
-		NifStream( triangles[i1].unknownShort, in, version );
-		NifStream( triangles[i1].normal, in, version );
+		NifStream( triangles[i1].triangle, in, info );
+		NifStream( triangles[i1].unknownShort, in, info );
+		NifStream( triangles[i1].normal, in, info );
 	};
-	NifStream( numVertices, in, version );
+	NifStream( numVertices, in, info );
 	vertices.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], in, version );
+		NifStream( vertices[i1], in, info );
 	};
 }
 
-void hkPackedNiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void hkPackedNiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numVertices = (unsigned int)(vertices.size());
 	numTriangles = (unsigned int)(triangles.size());
-	NifStream( numTriangles, out, version );
+	NifStream( numTriangles, out, info );
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
-		NifStream( triangles[i1].triangle, out, version );
-		NifStream( triangles[i1].unknownShort, out, version );
-		NifStream( triangles[i1].normal, out, version );
+		NifStream( triangles[i1].triangle, out, info );
+		NifStream( triangles[i1].unknownShort, out, info );
+		NifStream( triangles[i1].normal, out, info );
 	};
-	NifStream( numVertices, out, version );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], out, version );
+		NifStream( vertices[i1], out, info );
 	};
 }
 
@@ -3927,8 +3927,8 @@ std::string hkPackedNiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void hkPackedNiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
+void hkPackedNiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> hkPackedNiTriStripsData::InternalGetRefs() const {
@@ -3937,22 +3937,22 @@ std::list<NiObjectRef> hkPackedNiTriStripsData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAlphaController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiAlphaController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiAlphaController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -3964,10 +3964,10 @@ std::string NiAlphaController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiAlphaController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -3979,16 +3979,16 @@ std::list<NiObjectRef> NiAlphaController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAlphaProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( threshold, in, version );
+void NiAlphaProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( threshold, in, info );
 }
 
-void NiAlphaProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( threshold, out, version );
+void NiAlphaProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( threshold, out, info );
 }
 
 std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
@@ -4000,8 +4000,8 @@ std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiAlphaProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAlphaProperty::InternalGetRefs() const {
@@ -4010,12 +4010,12 @@ std::list<NiObjectRef> NiAlphaProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAmbientLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
+void NiAmbientLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
 }
 
-void NiAmbientLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
+void NiAmbientLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
 }
 
 std::string NiAmbientLight::InternalAsString( bool verbose ) const {
@@ -4025,8 +4025,8 @@ std::string NiAmbientLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAmbientLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiAmbientLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAmbientLight::InternalGetRefs() const {
@@ -4035,47 +4035,47 @@ std::list<NiObjectRef> NiAmbientLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAutoNormalParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04000002 ) {
-		NifStream( numParticles, in, version );
+void NiAutoNormalParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numParticles, in, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( size, in, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( size, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numActive, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numActive, in, info );
 	};
-	if ( ( version >= 0x0401000C ) && ( version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, in, version );
+	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
+		NifStream( unknownShort, in, info );
 	};
-	NifStream( hasSizes, in, version );
+	NifStream( hasSizes, in, info );
 	if ( (hasSizes != 0) ) {
 		sizes.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], in, version );
+			NifStream( sizes[i2], in, info );
 		};
 	};
 }
 
-void NiAutoNormalParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	if ( version <= 0x04000002 ) {
-		NifStream( numParticles, out, version );
+void NiAutoNormalParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numParticles, out, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( size, out, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( size, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numActive, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numActive, out, info );
 	};
-	if ( ( version >= 0x0401000C ) && ( version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, out, version );
+	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
+		NifStream( unknownShort, out, info );
 	};
-	NifStream( hasSizes, out, version );
+	NifStream( hasSizes, out, info );
 	if ( (hasSizes != 0) ) {
 		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], out, version );
+			NifStream( sizes[i2], out, info );
 		};
 	};
 }
@@ -4106,8 +4106,8 @@ std::string NiAutoNormalParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAutoNormalParticlesData::InternalGetRefs() const {
@@ -4116,21 +4116,21 @@ std::list<NiObjectRef> NiAutoNormalParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBinaryExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( binaryData.dataSize, in, version );
+void NiBinaryExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( binaryData.dataSize, in, info );
 	binaryData.data.resize(binaryData.dataSize);
 	for (unsigned int i1 = 0; i1 < binaryData.data.size(); i1++) {
-		NifStream( binaryData.data[i1], in, version );
+		NifStream( binaryData.data[i1], in, info );
 	};
 }
 
-void NiBinaryExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiBinaryExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	binaryData.dataSize = (unsigned int)(binaryData.data.size());
-	NifStream( binaryData.dataSize, out, version );
+	NifStream( binaryData.dataSize, out, info );
 	for (unsigned int i1 = 0; i1 < binaryData.data.size(); i1++) {
-		NifStream( binaryData.data[i1], out, version );
+		NifStream( binaryData.data[i1], out, info );
 	};
 }
 
@@ -4155,8 +4155,8 @@ std::string NiBinaryExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBinaryExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiBinaryExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBinaryExtraData::InternalGetRefs() const {
@@ -4165,14 +4165,14 @@ std::list<NiObjectRef> NiBinaryExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
+void NiBlendBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
 }
 
-void NiBlendBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBlendBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 }
 
 std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
@@ -4183,8 +4183,8 @@ std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendBoolInterpolator::InternalGetRefs() const {
@@ -4193,14 +4193,14 @@ std::list<NiObjectRef> NiBlendBoolInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( floatValue, in, version );
+void NiBlendFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( floatValue, in, info );
 }
 
-void NiBlendFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( floatValue, out, version );
+void NiBlendFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( floatValue, out, info );
 }
 
 std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
@@ -4211,8 +4211,8 @@ std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendFloatInterpolator::InternalGetRefs() const {
@@ -4221,14 +4221,14 @@ std::list<NiObjectRef> NiBlendFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( pointValue, in, version );
+void NiBlendPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( pointValue, in, info );
 }
 
-void NiBlendPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( pointValue, out, version );
+void NiBlendPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( pointValue, out, info );
 }
 
 std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
@@ -4239,8 +4239,8 @@ std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendPoint3Interpolator::InternalGetRefs() const {
@@ -4249,12 +4249,12 @@ std::list<NiObjectRef> NiBlendPoint3Interpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
+void NiBlendTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
 }
 
-void NiBlendTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
+void NiBlendTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
 }
 
 std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -4264,8 +4264,8 @@ std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiBlendTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendTransformInterpolator::InternalGetRefs() const {
@@ -4274,54 +4274,54 @@ std::list<NiObjectRef> NiBlendTransformInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	ABoneLODController::Read( in, link_stack, version, user_version );
-	NifStream( numShapeGroups, in, version );
+	ABoneLODController::Read( in, link_stack, info );
+	NifStream( numShapeGroups, in, info );
 	shapeGroups1.resize(numShapeGroups);
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
-		NifStream( shapeGroups1[i1].numLinkPairs, in, version );
+		NifStream( shapeGroups1[i1].numLinkPairs, in, info );
 		shapeGroups1[i1].linkPairs.resize(shapeGroups1[i1].numLinkPairs);
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	NifStream( numShapeGroups2, in, version );
+	NifStream( numShapeGroups2, in, info );
 	shapeGroups2.resize(numShapeGroups2);
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	ABoneLODController::Write( out, link_map, version, user_version );
+void NiBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	ABoneLODController::Write( out, link_map, info );
 	numShapeGroups2 = (unsigned int)(shapeGroups2.size());
 	numShapeGroups = (unsigned int)(shapeGroups1.size());
-	NifStream( numShapeGroups, out, version );
+	NifStream( numShapeGroups, out, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
 		shapeGroups1[i1].numLinkPairs = (unsigned int)(shapeGroups1[i1].linkPairs.size());
-		NifStream( shapeGroups1[i1].numLinkPairs, out, version );
+		NifStream( shapeGroups1[i1].numLinkPairs, out, info );
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
 			if ( shapeGroups1[i1].linkPairs[i2].shape != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].shape) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].shape) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 			if ( shapeGroups1[i1].linkPairs[i2].skinInstance != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].skinInstance) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].skinInstance) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	NifStream( numShapeGroups2, out, version );
+	NifStream( numShapeGroups2, out, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
 		if ( shapeGroups2[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(shapeGroups2[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(shapeGroups2[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -4366,16 +4366,16 @@ std::string NiBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
+void NiBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
-			shapeGroups1[i1].linkPairs[i2].shape = FixLink<NiTriShape>( objects, link_stack, version );
-			shapeGroups1[i1].linkPairs[i2].skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
+			shapeGroups1[i1].linkPairs[i2].shape = FixLink<NiTriShape>( objects, link_stack, info );
+			shapeGroups1[i1].linkPairs[i2].skinInstance = FixLink<NiSkinInstance>( objects, link_stack, info );
 		};
 	};
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		shapeGroups2[i1] = FixLink<NiTriShape>( objects, link_stack, version );
+		shapeGroups2[i1] = FixLink<NiTriShape>( objects, link_stack, info );
 	};
 }
 
@@ -4397,27 +4397,27 @@ std::list<NiObjectRef> NiBoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiBoolData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiBoolData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiBoolData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -4445,8 +4445,8 @@ std::string NiBoolData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiBoolData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolData::InternalGetRefs() const {
@@ -4455,14 +4455,14 @@ std::list<NiObjectRef> NiBoolData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBooleanExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( booleanData, in, version );
+void NiBooleanExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( booleanData, in, info );
 }
 
-void NiBooleanExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( booleanData, out, version );
+void NiBooleanExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( booleanData, out, info );
 }
 
 std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
@@ -4473,8 +4473,8 @@ std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBooleanExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiBooleanExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBooleanExtraData::InternalGetRefs() const {
@@ -4483,21 +4483,21 @@ std::list<NiObjectRef> NiBooleanExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
@@ -4509,9 +4509,9 @@ std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiBoolData>( objects, link_stack, version );
+void NiBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiBoolData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolInterpolator::InternalGetRefs() const {
@@ -4522,21 +4522,21 @@ std::list<NiObjectRef> NiBoolInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolTimelineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolTimelineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBoolTimelineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBoolTimelineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
@@ -4548,9 +4548,9 @@ std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolTimelineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiBoolData>( objects, link_stack, version );
+void NiBoolTimelineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiBoolData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolTimelineInterpolator::InternalGetRefs() const {
@@ -4561,12 +4561,12 @@ std::list<NiObjectRef> NiBoolTimelineInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::Read( in, link_stack, version, user_version );
+void NiBSBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::Read( in, link_stack, info );
 }
 
-void NiBSBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	ABoneLODController::Write( out, link_map, version, user_version );
+void NiBSBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	ABoneLODController::Write( out, link_map, info );
 }
 
 std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
@@ -4576,8 +4576,8 @@ std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
+void NiBSBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSBoneLODController::InternalGetRefs() const {
@@ -4586,14 +4586,14 @@ std::list<NiObjectRef> NiBSBoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineBasisData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numControlPt, in, version );
+void NiBSplineBasisData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numControlPt, in, info );
 }
 
-void NiBSplineBasisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( numControlPt, out, version );
+void NiBSplineBasisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( numControlPt, out, info );
 }
 
 std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
@@ -4604,8 +4604,8 @@ std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineBasisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineBasisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineBasisData::InternalGetRefs() const {
@@ -4614,17 +4614,17 @@ std::list<NiObjectRef> NiBSplineBasisData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineCompFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 }
 
-void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 }
 
@@ -4647,8 +4647,8 @@ std::string NiBSplineCompFloatInterpolator::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiBSplineCompFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompFloatInterpolator::InternalGetRefs() const {
@@ -4657,17 +4657,17 @@ std::list<NiObjectRef> NiBSplineCompFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 }
 
-void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 }
 
@@ -4690,8 +4690,8 @@ std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiBSplineCompPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompPoint3Interpolator::InternalGetRefs() const {
@@ -4700,36 +4700,36 @@ std::list<NiObjectRef> NiBSplineCompPoint3Interpolator::InternalGetRefs() const
 	return refs;
 }
 
-void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	NifStream( translateOffset, in, version );
-	NifStream( rotateOffset, in, version );
-	NifStream( scaleOffset, in, version );
-	NifStream( translateBias, in, version );
-	NifStream( translateMultiplier, in, version );
-	NifStream( rotationBias, in, version );
-	NifStream( rotationMultiplier, in, version );
-	NifStream( scaleBias, in, version );
-	NifStream( scaleMultiplier, in, version );
-}
-
-void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	NifStream( translateOffset, out, version );
-	NifStream( rotateOffset, out, version );
-	NifStream( scaleOffset, out, version );
-	NifStream( translateBias, out, version );
-	NifStream( translateMultiplier, out, version );
-	NifStream( rotationBias, out, version );
-	NifStream( rotationMultiplier, out, version );
-	NifStream( scaleBias, out, version );
-	NifStream( scaleMultiplier, out, version );
+void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	NifStream( translateOffset, in, info );
+	NifStream( rotateOffset, in, info );
+	NifStream( scaleOffset, in, info );
+	NifStream( translateBias, in, info );
+	NifStream( translateMultiplier, in, info );
+	NifStream( rotationBias, in, info );
+	NifStream( rotationMultiplier, in, info );
+	NifStream( scaleBias, in, info );
+	NifStream( scaleMultiplier, in, info );
+}
+
+void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	NifStream( translateOffset, out, info );
+	NifStream( rotateOffset, out, info );
+	NifStream( scaleOffset, out, info );
+	NifStream( translateBias, out, info );
+	NifStream( translateMultiplier, out, info );
+	NifStream( rotationBias, out, info );
+	NifStream( rotationMultiplier, out, info );
+	NifStream( scaleBias, out, info );
+	NifStream( scaleMultiplier, out, info );
 }
 
 std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -4751,8 +4751,8 @@ std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose )
 	return out.str();
 }
 
-void NiBSplineCompTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompTransformInterpolator::InternalGetRefs() const {
@@ -4761,23 +4761,23 @@ std::list<NiObjectRef> NiBSplineCompTransformInterpolator::InternalGetRefs() con
 	return refs;
 }
 
-void NiBSplineData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
-	NifStream( count, in, version );
+void NiBSplineData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
+	NifStream( count, in, info );
 	controlPoints.resize(count);
 	for (unsigned int i1 = 0; i1 < controlPoints.size(); i1++) {
-		NifStream( controlPoints[i1], in, version );
+		NifStream( controlPoints[i1], in, info );
 	};
 }
 
-void NiBSplineData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiBSplineData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	count = (unsigned int)(controlPoints.size());
-	NifStream( unknownInt, out, version );
-	NifStream( count, out, version );
+	NifStream( unknownInt, out, info );
+	NifStream( count, out, info );
 	for (unsigned int i1 = 0; i1 < controlPoints.size(); i1++) {
-		NifStream( controlPoints[i1], out, version );
+		NifStream( controlPoints[i1], out, info );
 	};
 }
 
@@ -4803,8 +4803,8 @@ std::string NiBSplineData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineData::InternalGetRefs() const {
@@ -4813,60 +4813,60 @@ std::list<NiObjectRef> NiBSplineData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCamera::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCamera::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, in, version );
-	};
-	NifStream( frustumLeft, in, version );
-	NifStream( frustumRight, in, version );
-	NifStream( frustumTop, in, version );
-	NifStream( frustumBottom, in, version );
-	NifStream( frustumNear, in, version );
-	NifStream( frustumFar, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( useOrthographicProjection, in, version );
-	};
-	NifStream( viewportLeft, in, version );
-	NifStream( viewportRight, in, version );
-	NifStream( viewportTop, in, version );
-	NifStream( viewportBottom, in, version );
-	NifStream( lodAdjust, in, version );
-	NifStream( block_num, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, in, info );
+	};
+	NifStream( frustumLeft, in, info );
+	NifStream( frustumRight, in, info );
+	NifStream( frustumTop, in, info );
+	NifStream( frustumBottom, in, info );
+	NifStream( frustumNear, in, info );
+	NifStream( frustumFar, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( useOrthographicProjection, in, info );
+	};
+	NifStream( viewportLeft, in, info );
+	NifStream( viewportRight, in, info );
+	NifStream( viewportTop, in, info );
+	NifStream( viewportBottom, in, info );
+	NifStream( lodAdjust, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt, in, version );
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownInt2, in, version );
-	};
-}
-
-void NiCamera::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, out, version );
-	};
-	NifStream( frustumLeft, out, version );
-	NifStream( frustumRight, out, version );
-	NifStream( frustumTop, out, version );
-	NifStream( frustumBottom, out, version );
-	NifStream( frustumNear, out, version );
-	NifStream( frustumFar, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( useOrthographicProjection, out, version );
-	};
-	NifStream( viewportLeft, out, version );
-	NifStream( viewportRight, out, version );
-	NifStream( viewportTop, out, version );
-	NifStream( viewportBottom, out, version );
-	NifStream( lodAdjust, out, version );
+	NifStream( unknownInt, in, info );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownInt2, in, info );
+	};
+}
+
+void NiCamera::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, out, info );
+	};
+	NifStream( frustumLeft, out, info );
+	NifStream( frustumRight, out, info );
+	NifStream( frustumTop, out, info );
+	NifStream( frustumBottom, out, info );
+	NifStream( frustumNear, out, info );
+	NifStream( frustumFar, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( useOrthographicProjection, out, info );
+	};
+	NifStream( viewportLeft, out, info );
+	NifStream( viewportRight, out, info );
+	NifStream( viewportTop, out, info );
+	NifStream( viewportBottom, out, info );
+	NifStream( lodAdjust, out, info );
 	if ( unknownLink_ != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt, out, version );
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownInt2, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt, out, info );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownInt2, out, info );
 	};
 }
 
@@ -4893,9 +4893,9 @@ std::string NiCamera::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCamera::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	unknownLink_ = FixLink<NiObject>( objects, link_stack, version );
+void NiCamera::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCamera::InternalGetRefs() const {
@@ -4906,57 +4906,57 @@ std::list<NiObjectRef> NiCamera::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCollisionData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt1, in, version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownInt2, in, version );
+	NifStream( unknownInt1, in, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownInt2, in, info );
 	};
-	NifStream( unknownByte, in, version );
-	NifStream( collisionType, in, version );
+	NifStream( unknownByte, in, info );
+	NifStream( collisionType, in, info );
 	if ( (collisionType == 0) ) {
-		NifStream( unknownInt2, in, version );
-		NifStream( unknownVector, in, version );
+		NifStream( unknownInt2, in, info );
+		NifStream( unknownVector, in, info );
 	};
 	if ( (collisionType == 2) ) {
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknownFloat1[i2], in, version );
+			NifStream( unknownFloat1[i2], in, info );
 		};
 	};
 	if ( (collisionType == 1) ) {
 		for (unsigned int i2 = 0; i2 < 15; i2++) {
-			NifStream( unknownFloat2[i2], in, version );
+			NifStream( unknownFloat2[i2], in, info );
 		};
 	};
 }
 
-void NiCollisionData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiCollisionData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( targetNode != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(targetNode) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(targetNode) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt1, out, version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownInt2, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt1, out, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownInt2, out, info );
 	};
-	NifStream( unknownByte, out, version );
-	NifStream( collisionType, out, version );
+	NifStream( unknownByte, out, info );
+	NifStream( collisionType, out, info );
 	if ( (collisionType == 0) ) {
-		NifStream( unknownInt2, out, version );
-		NifStream( unknownVector, out, version );
+		NifStream( unknownInt2, out, info );
+		NifStream( unknownVector, out, info );
 	};
 	if ( (collisionType == 2) ) {
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknownFloat1[i2], out, version );
+			NifStream( unknownFloat1[i2], out, info );
 		};
 	};
 	if ( (collisionType == 1) ) {
 		for (unsigned int i2 = 0; i2 < 15; i2++) {
-			NifStream( unknownFloat2[i2], out, version );
+			NifStream( unknownFloat2[i2], out, info );
 		};
 	};
 }
@@ -5004,9 +5004,9 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	targetNode = FixLink<NiNode>( objects, link_stack, version );
+void NiCollisionData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	targetNode = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCollisionData::InternalGetRefs() const {
@@ -5015,27 +5015,27 @@ std::list<NiObjectRef> NiCollisionData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiColorData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiColorData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiColorData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiColorData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -5063,8 +5063,8 @@ std::string NiColorData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiColorData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiColorData::InternalGetRefs() const {
@@ -5073,14 +5073,14 @@ std::list<NiObjectRef> NiColorData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiColorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( data, in, version );
+void NiColorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( data, in, info );
 }
 
-void NiColorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( data, out, version );
+void NiColorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( data, out, info );
 }
 
 std::string NiColorExtraData::InternalAsString( bool verbose ) const {
@@ -5091,8 +5091,8 @@ std::string NiColorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiColorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiColorExtraData::InternalGetRefs() const {
@@ -5101,35 +5101,35 @@ std::list<NiObjectRef> NiColorExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiControllerManager::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerManager::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( cumulative, in, version );
-	NifStream( numControllerSequences, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( cumulative, in, info );
+	NifStream( numControllerSequences, in, info );
 	controllerSequences.resize(numControllerSequences);
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiControllerManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiControllerManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numControllerSequences = (unsigned int)(controllerSequences.size());
-	NifStream( cumulative, out, version );
-	NifStream( numControllerSequences, out, version );
+	NifStream( cumulative, out, info );
+	NifStream( numControllerSequences, out, info );
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
 		if ( controllerSequences[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(controllerSequences[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(controllerSequences[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 	if ( objectPalette != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(objectPalette) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(objectPalette) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiControllerManager::InternalAsString( bool verbose ) const {
@@ -5155,12 +5155,12 @@ std::string NiControllerManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiControllerManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
-		controllerSequences[i1] = FixLink<NiControllerSequence>( objects, link_stack, version );
+		controllerSequences[i1] = FixLink<NiControllerSequence>( objects, link_stack, info );
 	};
-	objectPalette = FixLink<NiDefaultAVObjectPalette>( objects, link_stack, version );
+	objectPalette = FixLink<NiDefaultAVObjectPalette>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiControllerManager::InternalGetRefs() const {
@@ -5175,226 +5175,226 @@ std::list<NiObjectRef> NiControllerManager::InternalGetRefs() const {
 	return refs;
 }
 
-void NiControllerSequence::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerSequence::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( textKeysName, in, version );
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( textKeysName, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numControlledBlocks, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownInt1, in, version );
+	NifStream( numControlledBlocks, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownInt1, in, info );
 	};
 	controlledBlocks.resize(numControlledBlocks);
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			NifStream( controlledBlocks[i1].targetName, in, version );
-			NifStream( block_num, in, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( controlledBlocks[i1].targetName, in, info );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( version >= 0x0A01006A ) {
-			NifStream( block_num, in, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( block_num, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( controlledBlocks[i1].unknownShort0, in, version );
+			NifStream( controlledBlocks[i1].unknownShort0, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority_, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
+			NifStream( controlledBlocks[i1].priority_, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 11 ) ) {
-			NifStream( controlledBlocks[i1].priority_, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+			NifStream( controlledBlocks[i1].priority_, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( block_num, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].nodeName, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].nodeName, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].nodeNameOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].nodeNameOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].propertyType, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].propertyType, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].propertyTypeOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].propertyTypeOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].controllerType, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].controllerType, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].controllerTypeOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].controllerTypeOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable1, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable1, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset1, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset1, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable2, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable2, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset2, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset2, in, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( weight, in, version );
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( weight, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( cycleType, in, version );
+		NifStream( cycleType, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownInt0, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownInt0, in, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( frequency, in, version );
-		NifStream( startTime, in, version );
-		NifStream( stopTime, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( frequency, in, info );
+		NifStream( startTime, in, info );
+		NifStream( stopTime, in, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownFloat2, in, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownFloat2, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownByte, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownByte, in, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( targetName, in, version );
+		NifStream( targetName, in, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiControllerSequence::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiControllerSequence::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numControlledBlocks = (unsigned int)(controlledBlocks.size());
-	NifStream( name, out, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( textKeysName, out, version );
+	NifStream( name, out, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( textKeysName, out, info );
 		if ( textKeys != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numControlledBlocks, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownInt1, out, version );
+	NifStream( numControlledBlocks, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownInt1, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			NifStream( controlledBlocks[i1].targetName, out, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( controlledBlocks[i1].targetName, out, info );
 			if ( controlledBlocks[i1].controller != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( version >= 0x0A01006A ) {
+		if ( info.version >= 0x0A01006A ) {
 			if ( controlledBlocks[i1].interpolator != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].interpolator) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].interpolator) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 			if ( controlledBlocks[i1].controller != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 			if ( controlledBlocks[i1].unknownLink2 != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].unknownLink2) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].unknownLink2) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
-			NifStream( controlledBlocks[i1].unknownShort0, out, version );
+				NifStream( 0xffffffff, out, info );
+			NifStream( controlledBlocks[i1].unknownShort0, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority_, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
+			NifStream( controlledBlocks[i1].priority_, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 11 ) ) {
-			NifStream( controlledBlocks[i1].priority_, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+			NifStream( controlledBlocks[i1].priority_, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
+		if ( info.version >= 0x0A020000 ) {
 			if ( controlledBlocks[i1].stringPalette != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].stringPalette) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].stringPalette) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].nodeName, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].nodeName, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].nodeNameOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].nodeNameOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].propertyType, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].propertyType, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].propertyTypeOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].propertyTypeOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].controllerType, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].controllerType, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].controllerTypeOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].controllerTypeOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable1, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable1, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset1, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset1, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable2, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable2, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset2, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset2, out, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( weight, out, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( weight, out, info );
 		if ( textKeys != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( cycleType, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( cycleType, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownInt0, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownInt0, out, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( frequency, out, version );
-		NifStream( startTime, out, version );
-		NifStream( stopTime, out, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( frequency, out, info );
+		NifStream( startTime, out, info );
+		NifStream( stopTime, out, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownFloat2, out, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownFloat2, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownByte, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownByte, out, info );
 	};
-	if ( version >= 0x0A01006A ) {
+	if ( info.version >= 0x0A01006A ) {
 		if ( manager != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(manager) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(manager) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( targetName, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( targetName, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( stringPalette != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(stringPalette) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(stringPalette) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5446,32 +5446,32 @@ std::string NiControllerSequence::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerSequence::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
+void NiControllerSequence::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, info );
 	};
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
+		if ( info.version <= 0x0A010000 ) {
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, info );
 		};
-		if ( version >= 0x0A01006A ) {
-			controlledBlocks[i1].interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
-			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
+		if ( info.version >= 0x0A01006A ) {
+			controlledBlocks[i1].interpolator = FixLink<NiInterpolator>( objects, link_stack, info );
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			controlledBlocks[i1].unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			controlledBlocks[i1].unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			controlledBlocks[i1].stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
+		if ( info.version >= 0x0A020000 ) {
+			controlledBlocks[i1].stringPalette = FixLink<NiStringPalette>( objects, link_stack, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
-		manager = FixLink<NiControllerManager>( objects, link_stack, version );
+	if ( info.version >= 0x0A01006A ) {
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, info );
+		manager = FixLink<NiControllerManager>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		stringPalette = FixLink<NiStringPalette>( objects, link_stack, info );
 	};
 }
 
@@ -5495,30 +5495,30 @@ std::list<NiObjectRef> NiControllerSequence::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDefaultAVObjectPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDefaultAVObjectPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
-	NifStream( numObjs, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
+	NifStream( numObjs, in, info );
 	objs.resize(numObjs);
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		NifStream( objs[i1].name, in, version );
-		NifStream( block_num, in, version );
+		NifStream( objs[i1].name, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiDefaultAVObjectPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiDefaultAVObjectPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numObjs = (unsigned int)(objs.size());
-	NifStream( unknownInt, out, version );
-	NifStream( numObjs, out, version );
+	NifStream( unknownInt, out, info );
+	NifStream( numObjs, out, info );
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		NifStream( objs[i1].name, out, version );
+		NifStream( objs[i1].name, out, info );
 		if ( objs[i1].avObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(objs[i1].avObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(objs[i1].avObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5541,10 +5541,10 @@ std::string NiDefaultAVObjectPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDefaultAVObjectPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		objs[i1].avObject = FixLink<NiAVObject>( objects, link_stack, version );
+		objs[i1].avObject = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 }
 
@@ -5556,12 +5556,12 @@ std::list<NiObjectRef> NiDefaultAVObjectPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDirectionalLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
+void NiDirectionalLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
 }
 
-void NiDirectionalLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
+void NiDirectionalLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
 }
 
 std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
@@ -5571,8 +5571,8 @@ std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDirectionalLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiDirectionalLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiDirectionalLight::InternalGetRefs() const {
@@ -5581,14 +5581,14 @@ std::list<NiObjectRef> NiDirectionalLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDitherProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiDitherProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiDitherProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiDitherProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiDitherProperty::InternalAsString( bool verbose ) const {
@@ -5599,8 +5599,8 @@ std::string NiDitherProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDitherProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiDitherProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiDitherProperty::InternalGetRefs() const {
@@ -5609,36 +5609,36 @@ std::list<NiObjectRef> NiDitherProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFlipController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFlipController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( textureSlot, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt2, in, version );
-		NifStream( delta, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( textureSlot, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt2, in, info );
+		NifStream( delta, in, info );
 	};
-	NifStream( numSources, in, version );
+	NifStream( numSources, in, info );
 	sources.resize(numSources);
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiFlipController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
+void NiFlipController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
 	numSources = (unsigned int)(sources.size());
-	NifStream( textureSlot, out, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt2, out, version );
-		NifStream( delta, out, version );
+	NifStream( textureSlot, out, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt2, out, info );
+		NifStream( delta, out, info );
 	};
-	NifStream( numSources, out, version );
+	NifStream( numSources, out, info );
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
 		if ( sources[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(sources[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(sources[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5666,10 +5666,10 @@ std::string NiFlipController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFlipController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void NiFlipController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
-		sources[i1] = FixLink<NiSourceTexture>( objects, link_stack, version );
+		sources[i1] = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 }
 
@@ -5683,27 +5683,27 @@ std::list<NiObjectRef> NiFlipController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiFloatData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiFloatData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiFloatData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -5731,8 +5731,8 @@ std::string NiFloatData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatData::InternalGetRefs() const {
@@ -5741,14 +5741,14 @@ std::list<NiObjectRef> NiFloatData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( floatData, in, version );
+void NiFloatExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( floatData, in, info );
 }
 
-void NiFloatExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( floatData, out, version );
+void NiFloatExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( floatData, out, info );
 }
 
 std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
@@ -5759,8 +5759,8 @@ std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatExtraData::InternalGetRefs() const {
@@ -5769,24 +5769,24 @@ std::list<NiObjectRef> NiFloatExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatExtraDataController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraDataController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( unknownString, in, version );
+		NifStream( unknownString, in, info );
 	};
 }
 
-void NiFloatExtraDataController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x14000004 ) {
+void NiFloatExtraDataController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x14000004 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( unknownString, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( unknownString, out, info );
 	};
 }
 
@@ -5799,10 +5799,10 @@ std::string NiFloatExtraDataController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraDataController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		unknownLink = FixLink<NiObject>( objects, link_stack, version );
+void NiFloatExtraDataController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		unknownLink = FixLink<NiObject>( objects, link_stack, info );
 	};
 }
 
@@ -5814,21 +5814,21 @@ std::list<NiObjectRef> NiFloatExtraDataController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( floatValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( floatValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( floatValue, out, version );
+void NiFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( floatValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
@@ -5840,9 +5840,9 @@ std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatInterpolator::InternalGetRefs() const {
@@ -5853,21 +5853,21 @@ std::list<NiObjectRef> NiFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numFloats, in, version );
+void NiFloatsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numFloats, in, info );
 	data.resize(numFloats);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiFloatsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiFloatsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numFloats = (unsigned int)(data.size());
-	NifStream( numFloats, out, version );
+	NifStream( numFloats, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -5892,8 +5892,8 @@ std::string NiFloatsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatsExtraData::InternalGetRefs() const {
@@ -5902,18 +5902,18 @@ std::list<NiObjectRef> NiFloatsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFogProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( fogDepth, in, version );
-	NifStream( fogColor, in, version );
+void NiFogProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( fogDepth, in, info );
+	NifStream( fogColor, in, info );
 }
 
-void NiFogProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( fogDepth, out, version );
-	NifStream( fogColor, out, version );
+void NiFogProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( fogDepth, out, info );
+	NifStream( fogColor, out, info );
 }
 
 std::string NiFogProperty::InternalAsString( bool verbose ) const {
@@ -5926,8 +5926,8 @@ std::string NiFogProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFogProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiFogProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFogProperty::InternalGetRefs() const {
@@ -5936,63 +5936,63 @@ std::list<NiObjectRef> NiFogProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeomMorpherController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeomMorpherController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknown2, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknown2, in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownByte, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( numInterpolators, in, version );
+	NifStream( unknownByte, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( numInterpolators, in, info );
 		interpolators.resize(numInterpolators);
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( numUnknownInts, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( numUnknownInts, in, info );
 		unknownInts.resize(numUnknownInts);
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], in, version );
+			NifStream( unknownInts[i2], in, info );
 		};
 	};
 }
 
-void NiGeomMorpherController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiGeomMorpherController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numUnknownInts = (unsigned int)(unknownInts.size());
 	numInterpolators = (unsigned int)(interpolators.size());
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknown2, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknown2, out, info );
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownByte, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( numInterpolators, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownByte, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( numInterpolators, out, info );
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
 			if ( interpolators[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(interpolators[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(interpolators[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( numUnknownInts, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( numUnknownInts, out, info );
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], out, version );
+			NifStream( unknownInts[i2], out, info );
 		};
 	};
 }
@@ -6036,12 +6036,12 @@ std::string NiGeomMorpherController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeomMorpherController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiMorphData>( objects, link_stack, version );
-	if ( version >= 0x0A01006A ) {
+void NiGeomMorpherController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiMorphData>( objects, link_stack, info );
+	if ( info.version >= 0x0A01006A ) {
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
-			interpolators[i2] = FixLink<NiInterpolator>( objects, link_stack, version );
+			interpolators[i2] = FixLink<NiInterpolator>( objects, link_stack, info );
 		};
 	};
 }
@@ -6058,22 +6058,22 @@ std::list<NiObjectRef> NiGeomMorpherController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGravity::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( force, in, version );
-	NifStream( type, in, version );
-	NifStream( position, in, version );
-	NifStream( direction, in, version );
+void NiGravity::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( force, in, info );
+	NifStream( type, in, info );
+	NifStream( position, in, info );
+	NifStream( direction, in, info );
 }
 
-void NiGravity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( force, out, version );
-	NifStream( type, out, version );
-	NifStream( position, out, version );
-	NifStream( direction, out, version );
+void NiGravity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( force, out, info );
+	NifStream( type, out, info );
+	NifStream( position, out, info );
+	NifStream( direction, out, info );
 }
 
 std::string NiGravity::InternalAsString( bool verbose ) const {
@@ -6088,8 +6088,8 @@ std::string NiGravity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGravity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiGravity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiGravity::InternalGetRefs() const {
@@ -6098,14 +6098,14 @@ std::list<NiObjectRef> NiGravity::InternalGetRefs() const {
 	return refs;
 }
 
-void NiIntegerExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( integerData, in, version );
+void NiIntegerExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( integerData, in, info );
 }
 
-void NiIntegerExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( integerData, out, version );
+void NiIntegerExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( integerData, out, info );
 }
 
 std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
@@ -6116,8 +6116,8 @@ std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegerExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiIntegerExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiIntegerExtraData::InternalGetRefs() const {
@@ -6126,21 +6126,21 @@ std::list<NiObjectRef> NiIntegerExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiIntegersExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numIntegers, in, version );
+void NiIntegersExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numIntegers, in, info );
 	data.resize(numIntegers);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiIntegersExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiIntegersExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numIntegers = (unsigned int)(data.size());
-	NifStream( numIntegers, out, version );
+	NifStream( numIntegers, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -6165,8 +6165,8 @@ std::string NiIntegersExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegersExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiIntegersExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiIntegersExtraData::InternalGetRefs() const {
@@ -6175,19 +6175,19 @@ std::list<NiObjectRef> NiIntegersExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiKeyframeController::InternalAsString( bool verbose ) const {
@@ -6198,9 +6198,9 @@ std::string NiKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiKeyframeData>( objects, link_stack, version );
+void NiKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiKeyframeData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiKeyframeController::InternalGetRefs() const {
@@ -6211,19 +6211,19 @@ std::list<NiObjectRef> NiKeyframeController::InternalGetRefs() const {
 	return refs;
 }
 
-void BSKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiKeyframeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiKeyframeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void BSKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiKeyframeController::Write( out, link_map, version, user_version );
+void BSKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiKeyframeController::Write( out, link_map, info );
 	if ( data2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string BSKeyframeController::InternalAsString( bool verbose ) const {
@@ -6234,9 +6234,9 @@ std::string BSKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeController::FixLinks( objects, link_stack, version, user_version );
-	data2 = FixLink<NiKeyframeData>( objects, link_stack, version );
+void BSKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeController::FixLinks( objects, link_stack, info );
+	data2 = FixLink<NiKeyframeData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSKeyframeController::InternalGetRefs() const {
@@ -6247,96 +6247,96 @@ std::list<NiObjectRef> BSKeyframeController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiKeyframeData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( numRotationKeys, in, version );
+void NiKeyframeData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( numRotationKeys, in, info );
 	if ( (numRotationKeys != 0) ) {
-		NifStream( rotationType, in, version );
+		NifStream( rotationType, in, info );
 	};
 	if ( (rotationType != 4) ) {
 		quaternionKeys.resize(numRotationKeys);
 		for (unsigned int i2 = 0; i2 < quaternionKeys.size(); i2++) {
-			NifStream( quaternionKeys[i2], in, version, rotationType );
+			NifStream( quaternionKeys[i2], in, info, rotationType );
 		};
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( (rotationType == 4) ) {
-			NifStream( unknownFloat, in, version );
+			NifStream( unknownFloat, in, info );
 		};
 	};
 	if ( (rotationType == 4) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( xyzRotations[i2].numKeys, in, version );
+			NifStream( xyzRotations[i2].numKeys, in, info );
 			if ( (xyzRotations[i2].numKeys != 0) ) {
-				NifStream( xyzRotations[i2].interpolation, in, version );
+				NifStream( xyzRotations[i2].interpolation, in, info );
 			};
 			xyzRotations[i2].keys.resize(xyzRotations[i2].numKeys);
 			for (unsigned int i3 = 0; i3 < xyzRotations[i2].keys.size(); i3++) {
-				NifStream( xyzRotations[i2].keys[i3], in, version, xyzRotations[i2].interpolation );
+				NifStream( xyzRotations[i2].keys[i3], in, info, xyzRotations[i2].interpolation );
 			};
 		};
 	};
-	NifStream( translations.numKeys, in, version );
+	NifStream( translations.numKeys, in, info );
 	if ( (translations.numKeys != 0) ) {
-		NifStream( translations.interpolation, in, version );
+		NifStream( translations.interpolation, in, info );
 	};
 	translations.keys.resize(translations.numKeys);
 	for (unsigned int i1 = 0; i1 < translations.keys.size(); i1++) {
-		NifStream( translations.keys[i1], in, version, translations.interpolation );
+		NifStream( translations.keys[i1], in, info, translations.interpolation );
 	};
-	NifStream( scales.numKeys, in, version );
+	NifStream( scales.numKeys, in, info );
 	if ( (scales.numKeys != 0) ) {
-		NifStream( scales.interpolation, in, version );
+		NifStream( scales.interpolation, in, info );
 	};
 	scales.keys.resize(scales.numKeys);
 	for (unsigned int i1 = 0; i1 < scales.keys.size(); i1++) {
-		NifStream( scales.keys[i1], in, version, scales.interpolation );
+		NifStream( scales.keys[i1], in, info, scales.interpolation );
 	};
 }
 
-void NiKeyframeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
-	NifStream( numRotationKeys, out, version );
+void NiKeyframeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
+	NifStream( numRotationKeys, out, info );
 	if ( (numRotationKeys != 0) ) {
-		NifStream( rotationType, out, version );
+		NifStream( rotationType, out, info );
 	};
 	if ( (rotationType != 4) ) {
 		for (unsigned int i2 = 0; i2 < quaternionKeys.size(); i2++) {
-			NifStream( quaternionKeys[i2], out, version, rotationType );
+			NifStream( quaternionKeys[i2], out, info, rotationType );
 		};
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( (rotationType == 4) ) {
-			NifStream( unknownFloat, out, version );
+			NifStream( unknownFloat, out, info );
 		};
 	};
 	if ( (rotationType == 4) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
 			xyzRotations[i2].numKeys = (unsigned int)(xyzRotations[i2].keys.size());
-			NifStream( xyzRotations[i2].numKeys, out, version );
+			NifStream( xyzRotations[i2].numKeys, out, info );
 			if ( (xyzRotations[i2].numKeys != 0) ) {
-				NifStream( xyzRotations[i2].interpolation, out, version );
+				NifStream( xyzRotations[i2].interpolation, out, info );
 			};
 			for (unsigned int i3 = 0; i3 < xyzRotations[i2].keys.size(); i3++) {
-				NifStream( xyzRotations[i2].keys[i3], out, version, xyzRotations[i2].interpolation );
+				NifStream( xyzRotations[i2].keys[i3], out, info, xyzRotations[i2].interpolation );
 			};
 		};
 	};
 	translations.numKeys = (unsigned int)(translations.keys.size());
-	NifStream( translations.numKeys, out, version );
+	NifStream( translations.numKeys, out, info );
 	if ( (translations.numKeys != 0) ) {
-		NifStream( translations.interpolation, out, version );
+		NifStream( translations.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < translations.keys.size(); i1++) {
-		NifStream( translations.keys[i1], out, version, translations.interpolation );
+		NifStream( translations.keys[i1], out, info, translations.interpolation );
 	};
 	scales.numKeys = (unsigned int)(scales.keys.size());
-	NifStream( scales.numKeys, out, version );
+	NifStream( scales.numKeys, out, info );
 	if ( (scales.numKeys != 0) ) {
-		NifStream( scales.interpolation, out, version );
+		NifStream( scales.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < scales.keys.size(); i1++) {
-		NifStream( scales.keys[i1], out, version, scales.interpolation );
+		NifStream( scales.keys[i1], out, info, scales.interpolation );
 	};
 }
 
@@ -6426,8 +6426,8 @@ std::string NiKeyframeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiKeyframeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiKeyframeData::InternalGetRefs() const {
@@ -6436,40 +6436,40 @@ std::list<NiObjectRef> NiKeyframeData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLightColorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightColorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownShort, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownShort, in, info );
 	};
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( unknownShort, in, version );
+		NifStream( unknownShort, in, info );
 	};
 }
 
-void NiLightColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownShort, out, version );
+void NiLightColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownShort, out, info );
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( interpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( unknownShort, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( unknownShort, out, info );
 	};
 }
 
@@ -6483,13 +6483,13 @@ std::string NiLightColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPosData>( objects, link_stack, version );
+void NiLightColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPosData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		interpolator = FixLink<NiPoint3Interpolator>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		interpolator = FixLink<NiPoint3Interpolator>( objects, link_stack, info );
 	};
 }
 
@@ -6503,19 +6503,19 @@ std::list<NiObjectRef> NiLightColorController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLightDimmerController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightDimmerController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLightDimmerController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiLightDimmerController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
@@ -6526,9 +6526,9 @@ std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightDimmerController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	unknownLink = FixLink<NiInterpolator>( objects, link_stack, version );
+void NiLightDimmerController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	unknownLink = FixLink<NiInterpolator>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLightDimmerController::InternalGetRefs() const {
@@ -6539,25 +6539,25 @@ std::list<NiObjectRef> NiLightDimmerController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLookAtController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown1, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown1, in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLookAtController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown1, out, version );
+void NiLookAtController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown1, out, info );
 	};
 	if ( lookAtNode != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(lookAtNode) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(lookAtNode) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLookAtController::InternalAsString( bool verbose ) const {
@@ -6569,9 +6569,9 @@ std::string NiLookAtController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	lookAtNode = FixLink<NiNode>( objects, link_stack, version );
+void NiLookAtController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	lookAtNode = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLookAtController::InternalGetRefs() const {
@@ -6582,47 +6582,47 @@ std::list<NiObjectRef> NiLookAtController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLookAtInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownFloat, in, version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	NifStream( block_num, in, version );
+	NifStream( unknownFloat, in, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLookAtInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
+void NiLookAtInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
 	if ( lookAt != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(lookAt) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(lookAt) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownFloat, out, version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownFloat, out, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
 	if ( unknownLink1 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink3 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink3) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink3) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
@@ -6641,12 +6641,12 @@ std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	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 );
+void NiLookAtInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	lookAt = FixLink<NiNode>( objects, link_stack, info );
+	unknownLink1 = FixLink<NiPoint3Interpolator>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiFloatInterpolator>( objects, link_stack, info );
+	unknownLink3 = FixLink<NiFloatInterpolator>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLookAtInterpolator::InternalGetRefs() const {
@@ -6663,28 +6663,28 @@ std::list<NiObjectRef> NiLookAtInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMaterialColorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialColorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( targetColor, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( targetColor, in, info );
 	};
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMaterialColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( targetColor, out, version );
+void NiMaterialColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( targetColor, out, info );
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -6697,10 +6697,10 @@ std::string NiMaterialColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPosData>( objects, link_stack, version );
+void NiMaterialColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPosData>( objects, link_stack, info );
 	};
 }
 
@@ -6712,30 +6712,30 @@ std::list<NiObjectRef> NiMaterialColorController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMaterialProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+void NiMaterialProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( ambientColor, in, version );
-	NifStream( diffuseColor, in, version );
-	NifStream( specularColor, in, version );
-	NifStream( emissiveColor, in, version );
-	NifStream( glossiness, in, version );
-	NifStream( alpha, in, version );
+	NifStream( ambientColor, in, info );
+	NifStream( diffuseColor, in, info );
+	NifStream( specularColor, in, info );
+	NifStream( emissiveColor, in, info );
+	NifStream( glossiness, in, info );
+	NifStream( alpha, in, info );
 }
 
-void NiMaterialProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+void NiMaterialProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( ambientColor, out, version );
-	NifStream( diffuseColor, out, version );
-	NifStream( specularColor, out, version );
-	NifStream( emissiveColor, out, version );
-	NifStream( glossiness, out, version );
-	NifStream( alpha, out, version );
+	NifStream( ambientColor, out, info );
+	NifStream( diffuseColor, out, info );
+	NifStream( specularColor, out, info );
+	NifStream( emissiveColor, out, info );
+	NifStream( glossiness, out, info );
+	NifStream( alpha, out, info );
 }
 
 std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
@@ -6752,8 +6752,8 @@ std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiMaterialProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMaterialProperty::InternalGetRefs() const {
@@ -6762,104 +6762,104 @@ std::list<NiObjectRef> NiMaterialProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMeshPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysData::Read( in, link_stack, version, user_version );
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownByte11, in, version );
+	APSysData::Read( in, link_stack, info );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownByte11, in, info );
 	};
-	if ( version <= 0x14000004 ) {
+	if ( info.version <= 0x14000004 ) {
 		unknownFloats4.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], in, version );
+				NifStream( unknownFloats4[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x14000005 ) {
+	if ( info.version >= 0x14000005 ) {
 		unknownFloats5.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats5.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 12; i3++) {
-				NifStream( unknownFloats5[i2][i3], in, version );
+				NifStream( unknownFloats5[i2][i3], in, info );
 			};
 		};
 	};
-	NifStream( unknownInt1, in, version );
-	if ( version <= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	NifStream( unknownInt1, in, info );
+	if ( info.version <= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
-		NifStream( unknownByte2, in, version );
-		NifStream( numUnknownLinks, in, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
+		NifStream( unknownByte2, in, info );
+		NifStream( numUnknownLinks, in, info );
 		unknownLinks.resize(numUnknownLinks);
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownShort4, in, version );
-		NifStream( unknownInt2, in, version );
-		NifStream( unknownByte12, in, version );
-		NifStream( unknownInt3, in, version );
-		NifStream( unknownInt4, in, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownShort4, in, info );
+		NifStream( unknownInt2, in, info );
+		NifStream( unknownByte12, in, info );
+		NifStream( unknownInt3, in, info );
+		NifStream( unknownInt4, in, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMeshPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysData::Write( out, link_map, version, user_version );
+void NiMeshPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysData::Write( out, link_map, info );
 	numUnknownLinks = (unsigned int)(unknownLinks.size());
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownByte11, out, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownByte11, out, info );
 	};
-	if ( version <= 0x14000004 ) {
+	if ( info.version <= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], out, version );
+				NifStream( unknownFloats4[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x14000005 ) {
+	if ( info.version >= 0x14000005 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats5.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 12; i3++) {
-				NifStream( unknownFloats5[i2][i3], out, version );
+				NifStream( unknownFloats5[i2][i3], out, info );
 			};
 		};
 	};
-	NifStream( unknownInt1, out, version );
-	if ( version <= 0x14000004 ) {
+	NifStream( unknownInt1, out, info );
+	if ( info.version <= 0x14000004 ) {
 		if ( modifier != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(modifier) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(modifier) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
-		NifStream( unknownByte2, out, version );
-		NifStream( numUnknownLinks, out, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
+		NifStream( unknownByte2, out, info );
+		NifStream( numUnknownLinks, out, info );
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
 			if ( unknownLinks[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLinks[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLinks[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownShort4, out, version );
-		NifStream( unknownInt2, out, version );
-		NifStream( unknownByte12, out, version );
-		NifStream( unknownInt3, out, version );
-		NifStream( unknownInt4, out, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownShort4, out, info );
+		NifStream( unknownInt2, out, info );
+		NifStream( unknownByte12, out, info );
+		NifStream( unknownInt3, out, info );
+		NifStream( unknownInt4, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( unknownLink2 != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -6922,18 +6922,18 @@ std::string NiMeshPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x14000004 ) {
-		modifier = FixLink<NiObject>( objects, link_stack, version );
+void NiMeshPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x14000004 ) {
+		modifier = FixLink<NiObject>( objects, link_stack, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			unknownLinks[i2] = FixLink<NiObject>( objects, link_stack, version );
+			unknownLinks[i2] = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		unknownLink2 = FixLink<NiNode>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		unknownLink2 = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -6951,57 +6951,57 @@ std::list<NiObjectRef> NiMeshPSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMorphData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numMorphs, in, version );
-	NifStream( numVertices, in, version );
-	NifStream( unknownByte, in, version );
+void NiMorphData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numMorphs, in, info );
+	NifStream( numVertices, in, info );
+	NifStream( unknownByte, in, info );
 	morphs.resize(numMorphs);
 	for (unsigned int i1 = 0; i1 < morphs.size(); i1++) {
-		if ( version >= 0x0A01006A ) {
-			NifStream( morphs[i1].frameName, in, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( morphs[i1].frameName, in, info );
 		};
-		if ( version <= 0x0A010000 ) {
-			NifStream( morphs[i1].numKeys, in, version );
-			NifStream( morphs[i1].interpolation, in, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( morphs[i1].numKeys, in, info );
+			NifStream( morphs[i1].interpolation, in, info );
 			morphs[i1].keys.resize(morphs[i1].numKeys);
 			for (unsigned int i3 = 0; i3 < morphs[i1].keys.size(); i3++) {
-				NifStream( morphs[i1].keys[i3], in, version, morphs[i1].interpolation );
+				NifStream( morphs[i1].keys[i3], in, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( morphs[i1].unknownInt, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( morphs[i1].unknownInt, in, info );
 		};
 		morphs[i1].vectors.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
-			NifStream( morphs[i1].vectors[i2], in, version );
+			NifStream( morphs[i1].vectors[i2], in, info );
 		};
 	};
 }
 
-void NiMorphData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiMorphData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numMorphs = (unsigned int)(morphs.size());
-	NifStream( numMorphs, out, version );
-	NifStream( numVertices, out, version );
-	NifStream( unknownByte, out, version );
+	NifStream( numMorphs, out, info );
+	NifStream( numVertices, out, info );
+	NifStream( unknownByte, out, info );
 	for (unsigned int i1 = 0; i1 < morphs.size(); i1++) {
 		morphs[i1].numKeys = (unsigned int)(morphs[i1].keys.size());
-		if ( version >= 0x0A01006A ) {
-			NifStream( morphs[i1].frameName, out, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( morphs[i1].frameName, out, info );
 		};
-		if ( version <= 0x0A010000 ) {
-			NifStream( morphs[i1].numKeys, out, version );
-			NifStream( morphs[i1].interpolation, out, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( morphs[i1].numKeys, out, info );
+			NifStream( morphs[i1].interpolation, out, info );
 			for (unsigned int i3 = 0; i3 < morphs[i1].keys.size(); i3++) {
-				NifStream( morphs[i1].keys[i3], out, version, morphs[i1].interpolation );
+				NifStream( morphs[i1].keys[i3], out, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( morphs[i1].unknownInt, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( morphs[i1].unknownInt, out, info );
 		};
 		for (unsigned int i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
-			NifStream( morphs[i1].vectors[i2], out, version );
+			NifStream( morphs[i1].vectors[i2], out, info );
 		};
 	};
 }
@@ -7053,8 +7053,8 @@ std::string NiMorphData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMorphData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiMorphData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMorphData::InternalGetRefs() const {
@@ -7063,26 +7063,26 @@ std::list<NiObjectRef> NiMorphData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMultiTargetTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMultiTargetTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( numExtraTargets, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( numExtraTargets, in, info );
 	extraTargets.resize(numExtraTargets);
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMultiTargetTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiMultiTargetTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numExtraTargets = (unsigned short)(extraTargets.size());
-	NifStream( numExtraTargets, out, version );
+	NifStream( numExtraTargets, out, info );
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
 		if ( extraTargets[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(extraTargets[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(extraTargets[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7107,10 +7107,10 @@ std::string NiMultiTargetTransformController::InternalAsString( bool verbose ) c
 	return out.str();
 }
 
-void NiMultiTargetTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiMultiTargetTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
-		extraTargets[i1] = FixLink<NiNode>( objects, link_stack, version );
+		extraTargets[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -7122,40 +7122,40 @@ std::list<NiObjectRef> NiMultiTargetTransformController::InternalGetRefs() const
 	return refs;
 }
 
-void NiNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	NifStream( numChildren, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	NifStream( numChildren, in, info );
 	children.resize(numChildren);
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numEffects, in, version );
+	NifStream( numEffects, in, info );
 	effects.resize(numEffects);
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	numEffects = (unsigned int)(effects.size());
 	numChildren = (unsigned int)(children.size());
-	NifStream( numChildren, out, version );
+	NifStream( numChildren, out, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
 		if ( children[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numEffects, out, version );
+	NifStream( numEffects, out, info );
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
 		if ( effects[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(effects[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(effects[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7194,13 +7194,13 @@ std::string NiNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
+void NiNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
-		children[i1] = FixLink<NiAVObject>( objects, link_stack, version );
+		children[i1] = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
-		effects[i1] = FixLink<NiDynamicEffect>( objects, link_stack, version );
+		effects[i1] = FixLink<NiDynamicEffect>( objects, link_stack, info );
 	};
 }
 
@@ -7218,12 +7218,12 @@ std::list<NiObjectRef> NiNode::InternalGetRefs() const {
 	return refs;
 }
 
-void AvoidNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void AvoidNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void AvoidNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void AvoidNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string AvoidNode::InternalAsString( bool verbose ) const {
@@ -7233,8 +7233,8 @@ std::string AvoidNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AvoidNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void AvoidNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AvoidNode::InternalGetRefs() const {
@@ -7243,19 +7243,19 @@ std::list<NiObjectRef> AvoidNode::InternalGetRefs() const {
 	return refs;
 }
 
-void FxWidget::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
-	NifStream( unknown1, in, version );
+void FxWidget::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknown1, in, info );
 	for (unsigned int i1 = 0; i1 < 292; i1++) {
-		NifStream( unknown292Bytes[i1], in, version );
+		NifStream( unknown292Bytes[i1], in, info );
 	};
 }
 
-void FxWidget::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
-	NifStream( unknown1, out, version );
+void FxWidget::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
+	NifStream( unknown1, out, info );
 	for (unsigned int i1 = 0; i1 < 292; i1++) {
-		NifStream( unknown292Bytes[i1], out, version );
+		NifStream( unknown292Bytes[i1], out, info );
 	};
 }
 
@@ -7279,8 +7279,8 @@ std::string FxWidget::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxWidget::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void FxWidget::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> FxWidget::InternalGetRefs() const {
@@ -7289,12 +7289,12 @@ std::list<NiObjectRef> FxWidget::InternalGetRefs() const {
 	return refs;
 }
 
-void FxButton::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::Read( in, link_stack, version, user_version );
+void FxButton::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::Read( in, link_stack, info );
 }
 
-void FxButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	FxWidget::Write( out, link_map, version, user_version );
+void FxButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	FxWidget::Write( out, link_map, info );
 }
 
 std::string FxButton::InternalAsString( bool verbose ) const {
@@ -7304,8 +7304,8 @@ std::string FxButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::FixLinks( objects, link_stack, version, user_version );
+void FxButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> FxButton::InternalGetRefs() const {
@@ -7314,32 +7314,32 @@ std::list<NiObjectRef> FxButton::InternalGetRefs() const {
 	return refs;
 }
 
-void FxRadioButton::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxRadioButton::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	FxWidget::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( numButtons, in, version );
+	FxWidget::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( numButtons, in, info );
 	buttons.resize(numButtons);
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void FxRadioButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	FxWidget::Write( out, link_map, version, user_version );
+void FxRadioButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	FxWidget::Write( out, link_map, info );
 	numButtons = (unsigned int)(buttons.size());
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( numButtons, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( numButtons, out, info );
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
 		if ( buttons[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(buttons[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(buttons[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7367,10 +7367,10 @@ std::string FxRadioButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxRadioButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::FixLinks( objects, link_stack, version, user_version );
+void FxRadioButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
-		buttons[i1] = FixLink<FxRadioButton>( objects, link_stack, version );
+		buttons[i1] = FixLink<FxRadioButton>( objects, link_stack, info );
 	};
 }
 
@@ -7382,17 +7382,17 @@ std::list<NiObjectRef> FxRadioButton::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBillboardNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( billboardMode, in, version );
+void NiBillboardNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( billboardMode, in, info );
 	};
 }
 
-void NiBillboardNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( billboardMode, out, version );
+void NiBillboardNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( billboardMode, out, info );
 	};
 }
 
@@ -7404,8 +7404,8 @@ std::string NiBillboardNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBillboardNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBillboardNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBillboardNode::InternalGetRefs() const {
@@ -7414,12 +7414,12 @@ std::list<NiObjectRef> NiBillboardNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSAnimationNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void NiBSAnimationNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void NiBSAnimationNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiBSAnimationNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
@@ -7429,8 +7429,8 @@ std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSAnimationNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBSAnimationNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSAnimationNode::InternalGetRefs() const {
@@ -7439,12 +7439,12 @@ std::list<NiObjectRef> NiBSAnimationNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSParticleNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void NiBSParticleNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void NiBSParticleNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiBSParticleNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
@@ -7454,8 +7454,8 @@ std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSParticleNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBSParticleNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSParticleNode::InternalGetRefs() const {
@@ -7464,48 +7464,48 @@ std::list<NiObjectRef> NiBSParticleNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLODNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiNode::Read( in, link_stack, version, user_version );
+	NiNode::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Bytes[i1], in, version );
+		NifStream( unknown4Bytes[i1], in, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( lodCenter, in, version );
-		NifStream( numLodLevels, in, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( lodCenter, in, info );
+		NifStream( numLodLevels, in, info );
 		lodLevels.resize(numLodLevels);
 		for (unsigned int i2 = 0; i2 < lodLevels.size(); i2++) {
-			NifStream( lodLevels[i2].nearExtent, in, version );
-			NifStream( lodLevels[i2].farExtent, in, version );
+			NifStream( lodLevels[i2].nearExtent, in, info );
+			NifStream( lodLevels[i2].farExtent, in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, in, version );
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiLODNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiLODNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 	numLodLevels = (unsigned int)(lodLevels.size());
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Bytes[i1], out, version );
+		NifStream( unknown4Bytes[i1], out, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( lodCenter, out, version );
-		NifStream( numLodLevels, out, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( lodCenter, out, info );
+		NifStream( numLodLevels, out, info );
 		for (unsigned int i2 = 0; i2 < lodLevels.size(); i2++) {
-			NifStream( lodLevels[i2].nearExtent, out, version );
-			NifStream( lodLevels[i2].farExtent, out, version );
+			NifStream( lodLevels[i2].nearExtent, out, info );
+			NifStream( lodLevels[i2].farExtent, out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, out, info );
 		if ( lodLevelData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(lodLevelData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(lodLevelData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7542,10 +7542,10 @@ std::string NiLODNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		lodLevelData = FixLink<NiLODData>( objects, link_stack, version );
+void NiLODNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		lodLevelData = FixLink<NiLODData>( objects, link_stack, info );
 	};
 }
 
@@ -7557,24 +7557,24 @@ std::list<NiObjectRef> NiLODNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownByte, in, version );
-	NifStream( numEntries_, in, version );
+void NiPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownByte, in, info );
+	NifStream( numEntries_, in, info );
 	for (unsigned int i1 = 0; i1 < 256; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( palette[i1][i2], in, version );
+			NifStream( palette[i1][i2], in, info );
 		};
 	};
 }
 
-void NiPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( unknownByte, out, version );
-	NifStream( numEntries_, out, version );
+void NiPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( unknownByte, out, info );
+	NifStream( numEntries_, out, info );
 	for (unsigned int i1 = 0; i1 < 256; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( palette[i1][i2], out, version );
+			NifStream( palette[i1][i2], out, info );
 		};
 	};
 }
@@ -7602,8 +7602,8 @@ std::string NiPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPalette::InternalGetRefs() const {
@@ -7612,36 +7612,36 @@ std::list<NiObjectRef> NiPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleBomb::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-}
-
-void NiParticleBomb::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
+void NiParticleBomb::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+}
+
+void NiParticleBomb::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
 }
 
 std::string NiParticleBomb::InternalAsString( bool verbose ) const {
@@ -7663,8 +7663,8 @@ std::string NiParticleBomb::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleBomb::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleBomb::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleBomb::InternalGetRefs() const {
@@ -7673,19 +7673,19 @@ std::list<NiObjectRef> NiParticleBomb::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiParticleColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
+void NiParticleColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
 	if ( colorData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
@@ -7696,9 +7696,9 @@ std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
-	colorData = FixLink<NiColorData>( objects, link_stack, version );
+void NiParticleColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
+	colorData = FixLink<NiColorData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleColorModifier::InternalGetRefs() const {
@@ -7709,16 +7709,16 @@ std::list<NiObjectRef> NiParticleColorModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleGrowFade::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( grow, in, version );
-	NifStream( fade, in, version );
+void NiParticleGrowFade::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( grow, in, info );
+	NifStream( fade, in, info );
 }
 
-void NiParticleGrowFade::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( grow, out, version );
-	NifStream( fade, out, version );
+void NiParticleGrowFade::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( grow, out, info );
+	NifStream( fade, out, info );
 }
 
 std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
@@ -7730,8 +7730,8 @@ std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleGrowFade::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleGrowFade::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleGrowFade::InternalGetRefs() const {
@@ -7740,26 +7740,26 @@ std::list<NiObjectRef> NiParticleGrowFade::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( numParticleMeshes, in, version );
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( numParticleMeshes, in, info );
 	particleMeshes.resize(numParticleMeshes);
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiParticleMeshModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
+void NiParticleMeshModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
 	numParticleMeshes = (unsigned int)(particleMeshes.size());
-	NifStream( numParticleMeshes, out, version );
+	NifStream( numParticleMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
 		if ( particleMeshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(particleMeshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(particleMeshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7784,10 +7784,10 @@ std::string NiParticleMeshModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
-		particleMeshes[i1] = FixLink<NiAVObject>( objects, link_stack, version );
+		particleMeshes[i1] = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 }
 
@@ -7801,22 +7801,22 @@ std::list<NiObjectRef> NiParticleMeshModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleRotation::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownByte, in, version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
+void NiParticleRotation::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownByte, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
 }
 
-void NiParticleRotation::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownByte, out, version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
+void NiParticleRotation::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownByte, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
 }
 
 std::string NiParticleRotation::InternalAsString( bool verbose ) const {
@@ -7831,8 +7831,8 @@ std::string NiParticleRotation::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleRotation::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleRotation::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleRotation::InternalGetRefs() const {
@@ -7841,12 +7841,12 @@ std::list<NiObjectRef> NiParticleRotation::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::Read( in, link_stack, version, user_version );
+void NiParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::Read( in, link_stack, info );
 }
 
-void NiParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometry::Write( out, link_map, version, user_version );
+void NiParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometry::Write( out, link_map, info );
 }
 
 std::string NiParticles::InternalAsString( bool verbose ) const {
@@ -7856,8 +7856,8 @@ std::string NiParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::FixLinks( objects, link_stack, version, user_version );
+void NiParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticles::InternalGetRefs() const {
@@ -7866,12 +7866,12 @@ std::list<NiObjectRef> NiParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAutoNormalParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiAutoNormalParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiAutoNormalParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiAutoNormalParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
@@ -7881,8 +7881,8 @@ std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAutoNormalParticles::InternalGetRefs() const {
@@ -7891,12 +7891,12 @@ std::list<NiObjectRef> NiAutoNormalParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshes::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiParticleMeshes::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiParticleMeshes::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiParticleMeshes::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
@@ -7906,8 +7906,8 @@ std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshes::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshes::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleMeshes::InternalGetRefs() const {
@@ -7916,42 +7916,42 @@ std::list<NiObjectRef> NiParticleMeshes::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAutoNormalParticlesData::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( numActive, in, version );
-		NifStream( hasUnknownFloats, in, version );
+void NiParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAutoNormalParticlesData::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numActive, in, info );
+		NifStream( hasUnknownFloats, in, info );
 		if ( (hasUnknownFloats != 0) ) {
 			unknownFloats.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownFloats.size(); i3++) {
-				NifStream( unknownFloats[i3], in, version );
+				NifStream( unknownFloats[i3], in, info );
 			};
 		};
 	};
-	NifStream( hasRotations, in, version );
+	NifStream( hasRotations, in, info );
 	if ( (hasRotations != 0) ) {
 		rotations.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < rotations.size(); i2++) {
-			NifStream( rotations[i2], in, version );
+			NifStream( rotations[i2], in, info );
 		};
 	};
 }
 
-void NiParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAutoNormalParticlesData::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( numActive, out, version );
-		NifStream( hasUnknownFloats, out, version );
+void NiParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAutoNormalParticlesData::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numActive, out, info );
+		NifStream( hasUnknownFloats, out, info );
 		if ( (hasUnknownFloats != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownFloats.size(); i3++) {
-				NifStream( unknownFloats[i3], out, version );
+				NifStream( unknownFloats[i3], out, info );
 			};
 		};
 	};
-	NifStream( hasRotations, out, version );
+	NifStream( hasRotations, out, info );
 	if ( (hasRotations != 0) ) {
 		for (unsigned int i2 = 0; i2 < rotations.size(); i2++) {
-			NifStream( rotations[i2], out, version );
+			NifStream( rotations[i2], out, info );
 		};
 	};
 }
@@ -7994,8 +7994,8 @@ std::string NiParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAutoNormalParticlesData::FixLinks( objects, link_stack, version, user_version );
+void NiParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAutoNormalParticlesData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticlesData::InternalGetRefs() const {
@@ -8004,19 +8004,19 @@ std::list<NiObjectRef> NiParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiParticlesData::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiParticlesData::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiParticleMeshesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticlesData::Write( out, link_map, version, user_version );
+void NiParticleMeshesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticlesData::Write( out, link_map, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
@@ -8027,9 +8027,9 @@ std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
-	unknownLink2 = FixLink<NiAVObject>( objects, link_stack, version );
+void NiParticleMeshesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::FixLinks( objects, link_stack, info );
+	unknownLink2 = FixLink<NiAVObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleMeshesData::InternalGetRefs() const {
@@ -8040,31 +8040,31 @@ std::list<NiObjectRef> NiParticleMeshesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiParticles::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownBool, in, version );
-		NifStream( numModifiers, in, version );
+	NiParticles::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownBool, in, info );
+		NifStream( numModifiers, in, info );
 		modifiers.resize(numModifiers);
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 	numModifiers = (unsigned int)(modifiers.size());
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownBool, out, version );
-		NifStream( numModifiers, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownBool, out, info );
+		NifStream( numModifiers, out, info );
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
 			if ( modifiers[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(modifiers[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(modifiers[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -8091,11 +8091,11 @@ std::string NiParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
-			modifiers[i2] = FixLink<NiPSysModifier>( objects, link_stack, version );
+			modifiers[i2] = FixLink<NiPSysModifier>( objects, link_stack, info );
 		};
 	};
 }
@@ -8110,12 +8110,12 @@ std::list<NiObjectRef> NiParticleSystem::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMeshParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystem::Read( in, link_stack, version, user_version );
+void NiMeshParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystem::Read( in, link_stack, info );
 }
 
-void NiMeshParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticleSystem::Write( out, link_map, version, user_version );
+void NiMeshParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticleSystem::Write( out, link_map, info );
 }
 
 std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
@@ -8125,8 +8125,8 @@ std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystem::FixLinks( objects, link_stack, version, user_version );
+void NiMeshParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystem::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMeshParticleSystem::InternalGetRefs() const {
@@ -8135,117 +8135,117 @@ std::list<NiObjectRef> NiMeshParticleSystem::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleSystemController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystemController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( speed, in, version );
-	NifStream( speedRandom, in, version );
-	NifStream( verticalDirection, in, version );
-	NifStream( verticalAngle, in, version );
-	NifStream( horizontalDirection, in, version );
-	NifStream( horizontalAngle, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-	NifStream( unknownFloat11, in, version );
-	NifStream( size, in, version );
-	NifStream( emitStartTime, in, version );
-	NifStream( emitStopTime, in, version );
-	NifStream( unknownByte, in, version );
-	NifStream( emitRate, in, version );
-	NifStream( lifetime, in, version );
-	NifStream( lifetimeRandom, in, version );
-	NifStream( emitFlags, in, version );
-	NifStream( startRandom, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( speed, in, info );
+	NifStream( speedRandom, in, info );
+	NifStream( verticalDirection, in, info );
+	NifStream( verticalAngle, in, info );
+	NifStream( horizontalDirection, in, info );
+	NifStream( horizontalAngle, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+	NifStream( unknownFloat11, in, info );
+	NifStream( size, in, info );
+	NifStream( emitStartTime, in, info );
+	NifStream( emitStopTime, in, info );
+	NifStream( unknownByte, in, info );
+	NifStream( emitRate, in, info );
+	NifStream( lifetime, in, info );
+	NifStream( lifetimeRandom, in, info );
+	NifStream( emitFlags, in, info );
+	NifStream( startRandom, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownShort2_, in, version );
-	NifStream( unknownFloat13_, in, version );
-	NifStream( unknownInt1_, in, version );
-	NifStream( unknownInt2_, in, version );
-	NifStream( unknownShort3_, in, version );
-	NifStream( numParticles, in, version );
-	NifStream( numValid, in, version );
+	NifStream( unknownShort2_, in, info );
+	NifStream( unknownFloat13_, in, info );
+	NifStream( unknownInt1_, in, info );
+	NifStream( unknownInt2_, in, info );
+	NifStream( unknownShort3_, in, info );
+	NifStream( numParticles, in, info );
+	NifStream( numValid, in, info );
 	particles.resize(numParticles);
 	for (unsigned int i1 = 0; i1 < particles.size(); i1++) {
-		NifStream( particles[i1].velocity, in, version );
-		NifStream( particles[i1].unknownVector, in, version );
-		NifStream( particles[i1].lifetime, in, version );
-		NifStream( particles[i1].lifespan, in, version );
-		NifStream( particles[i1].timestamp, in, version );
-		NifStream( particles[i1].unknownShort, in, version );
-		NifStream( particles[i1].vertexId, in, version );
-	};
-	NifStream( block_num, in, version );
+		NifStream( particles[i1].velocity, in, info );
+		NifStream( particles[i1].unknownVector, in, info );
+		NifStream( particles[i1].lifetime, in, info );
+		NifStream( particles[i1].lifespan, in, info );
+		NifStream( particles[i1].timestamp, in, info );
+		NifStream( particles[i1].unknownShort, in, info );
+		NifStream( particles[i1].vertexId, in, info );
+	};
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( trailer, in, version );
+	NifStream( trailer, in, info );
 }
 
-void NiParticleSystemController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiParticleSystemController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numParticles = (unsigned short)(particles.size());
-	NifStream( speed, out, version );
-	NifStream( speedRandom, out, version );
-	NifStream( verticalDirection, out, version );
-	NifStream( verticalAngle, out, version );
-	NifStream( horizontalDirection, out, version );
-	NifStream( horizontalAngle, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
-	NifStream( unknownFloat11, out, version );
-	NifStream( size, out, version );
-	NifStream( emitStartTime, out, version );
-	NifStream( emitStopTime, out, version );
-	NifStream( unknownByte, out, version );
-	NifStream( emitRate, out, version );
-	NifStream( lifetime, out, version );
-	NifStream( lifetimeRandom, out, version );
-	NifStream( emitFlags, out, version );
-	NifStream( startRandom, out, version );
+	NifStream( speed, out, info );
+	NifStream( speedRandom, out, info );
+	NifStream( verticalDirection, out, info );
+	NifStream( verticalAngle, out, info );
+	NifStream( horizontalDirection, out, info );
+	NifStream( horizontalAngle, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
+	NifStream( unknownFloat11, out, info );
+	NifStream( size, out, info );
+	NifStream( emitStartTime, out, info );
+	NifStream( emitStopTime, out, info );
+	NifStream( unknownByte, out, info );
+	NifStream( emitRate, out, info );
+	NifStream( lifetime, out, info );
+	NifStream( lifetimeRandom, out, info );
+	NifStream( emitFlags, out, info );
+	NifStream( startRandom, out, info );
 	if ( emitter != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(emitter) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(emitter) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownShort2_, out, version );
-	NifStream( unknownFloat13_, out, version );
-	NifStream( unknownInt1_, out, version );
-	NifStream( unknownInt2_, out, version );
-	NifStream( unknownShort3_, out, version );
-	NifStream( numParticles, out, version );
-	NifStream( numValid, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownShort2_, out, info );
+	NifStream( unknownFloat13_, out, info );
+	NifStream( unknownInt1_, out, info );
+	NifStream( unknownInt2_, out, info );
+	NifStream( unknownShort3_, out, info );
+	NifStream( numParticles, out, info );
+	NifStream( numValid, out, info );
 	for (unsigned int i1 = 0; i1 < particles.size(); i1++) {
-		NifStream( particles[i1].velocity, out, version );
-		NifStream( particles[i1].unknownVector, out, version );
-		NifStream( particles[i1].lifetime, out, version );
-		NifStream( particles[i1].lifespan, out, version );
-		NifStream( particles[i1].timestamp, out, version );
-		NifStream( particles[i1].unknownShort, out, version );
-		NifStream( particles[i1].vertexId, out, version );
+		NifStream( particles[i1].velocity, out, info );
+		NifStream( particles[i1].unknownVector, out, info );
+		NifStream( particles[i1].lifetime, out, info );
+		NifStream( particles[i1].lifespan, out, info );
+		NifStream( particles[i1].timestamp, out, info );
+		NifStream( particles[i1].unknownShort, out, info );
+		NifStream( particles[i1].vertexId, out, info );
 	};
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( particleExtra != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(particleExtra) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(particleExtra) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( trailer, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( trailer, out, info );
 }
 
 std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
@@ -8304,12 +8304,12 @@ std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystemController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	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 );
+void NiParticleSystemController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	emitter = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink = FixLink<NiObject>( objects, link_stack, info );
+	particleExtra = FixLink<AParticleModifier>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
@@ -8324,12 +8324,12 @@ std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSPArrayController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystemController::Read( in, link_stack, version, user_version );
+void NiBSPArrayController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystemController::Read( in, link_stack, info );
 }
 
-void NiBSPArrayController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticleSystemController::Write( out, link_map, version, user_version );
+void NiBSPArrayController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticleSystemController::Write( out, link_map, info );
 }
 
 std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
@@ -8339,8 +8339,8 @@ std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSPArrayController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystemController::FixLinks( objects, link_stack, version, user_version );
+void NiBSPArrayController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystemController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSPArrayController::InternalGetRefs() const {
@@ -8349,39 +8349,39 @@ std::list<NiObjectRef> NiBSPArrayController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPathController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort2, in, version );
-	};
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort2, in, info );
+	};
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPathController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort2, out, version );
+void NiPathController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort2, out, info );
 	};
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( unknownShort, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownShort, out, info );
 	if ( posData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( floatData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPathController::InternalAsString( bool verbose ) const {
@@ -8398,10 +8398,10 @@ std::string NiPathController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	posData = FixLink<NiPosData>( objects, link_stack, version );
-	floatData = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPathController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	posData = FixLink<NiPosData>( objects, link_stack, info );
+	floatData = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPathController::InternalGetRefs() const {
@@ -8414,31 +8414,31 @@ std::list<NiObjectRef> NiPathController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPathInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( block_num, in, version );
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPathInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownShort2, out, version );
+void NiPathInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownShort2, out, info );
 	if ( posData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( floatData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
@@ -8453,10 +8453,10 @@ std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
-	posData = FixLink<NiPosData>( objects, link_stack, version );
-	floatData = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPathInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
+	posData = FixLink<NiPosData>( objects, link_stack, info );
+	floatData = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPathInterpolator::InternalGetRefs() const {
@@ -8469,88 +8469,88 @@ std::list<NiObjectRef> NiPathInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPixelData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPixelData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( pixelFormat, in, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( redMask, in, version );
-		NifStream( greenMask, in, version );
-		NifStream( blueMask, in, version );
-		NifStream( alphaMask, in, version );
-		NifStream( bitsPerPixel, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( pixelFormat, in, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( redMask, in, info );
+		NifStream( greenMask, in, info );
+		NifStream( blueMask, in, info );
+		NifStream( alphaMask, in, info );
+		NifStream( bitsPerPixel, in, info );
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknown8Bytes[i2], in, version );
+			NifStream( unknown8Bytes[i2], in, info );
 		};
 	};
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownInt, in, version );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownInt, in, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < 54; i2++) {
-			NifStream( unknown54Bytes[i2], in, version );
+			NifStream( unknown54Bytes[i2], in, info );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( numMipmaps, in, version );
-	NifStream( bytesPerPixel, in, version );
+	NifStream( numMipmaps, in, info );
+	NifStream( bytesPerPixel, in, info );
 	mipmaps.resize(numMipmaps);
 	for (unsigned int i1 = 0; i1 < mipmaps.size(); i1++) {
-		NifStream( mipmaps[i1].width, in, version );
-		NifStream( mipmaps[i1].height, in, version );
-		NifStream( mipmaps[i1].offset, in, version );
+		NifStream( mipmaps[i1].width, in, info );
+		NifStream( mipmaps[i1].height, in, info );
+		NifStream( mipmaps[i1].offset, in, info );
 	};
-	NifStream( pixelData.dataSize, in, version );
+	NifStream( pixelData.dataSize, in, info );
 	pixelData.data.resize(pixelData.dataSize);
 	for (unsigned int i1 = 0; i1 < pixelData.data.size(); i1++) {
-		NifStream( pixelData.data[i1], in, version );
+		NifStream( pixelData.data[i1], in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownInt2, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownInt2, in, info );
 	};
 }
 
-void NiPixelData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiPixelData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numMipmaps = (unsigned int)(mipmaps.size());
-	NifStream( pixelFormat, out, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( redMask, out, version );
-		NifStream( greenMask, out, version );
-		NifStream( blueMask, out, version );
-		NifStream( alphaMask, out, version );
-		NifStream( bitsPerPixel, out, version );
+	NifStream( pixelFormat, out, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( redMask, out, info );
+		NifStream( greenMask, out, info );
+		NifStream( blueMask, out, info );
+		NifStream( alphaMask, out, info );
+		NifStream( bitsPerPixel, out, info );
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknown8Bytes[i2], out, version );
+			NifStream( unknown8Bytes[i2], out, info );
 		};
 	};
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownInt, out, version );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownInt, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < 54; i2++) {
-			NifStream( unknown54Bytes[i2], out, version );
+			NifStream( unknown54Bytes[i2], out, info );
 		};
 	};
 	if ( palette != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(palette) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(palette) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( numMipmaps, out, version );
-	NifStream( bytesPerPixel, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( numMipmaps, out, info );
+	NifStream( bytesPerPixel, out, info );
 	for (unsigned int i1 = 0; i1 < mipmaps.size(); i1++) {
-		NifStream( mipmaps[i1].width, out, version );
-		NifStream( mipmaps[i1].height, out, version );
-		NifStream( mipmaps[i1].offset, out, version );
+		NifStream( mipmaps[i1].width, out, info );
+		NifStream( mipmaps[i1].height, out, info );
+		NifStream( mipmaps[i1].offset, out, info );
 	};
 	pixelData.dataSize = (unsigned int)(pixelData.data.size());
-	NifStream( pixelData.dataSize, out, version );
+	NifStream( pixelData.dataSize, out, info );
 	for (unsigned int i1 = 0; i1 < pixelData.data.size(); i1++) {
-		NifStream( pixelData.data[i1], out, version );
+		NifStream( pixelData.data[i1], out, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownInt2, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownInt2, out, info );
 	};
 }
 
@@ -8621,9 +8621,9 @@ std::string NiPixelData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPixelData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	palette = FixLink<NiPalette>( objects, link_stack, version );
+void NiPixelData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	palette = FixLink<NiPalette>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPixelData::InternalGetRefs() const {
@@ -8634,56 +8634,56 @@ std::list<NiObjectRef> NiPixelData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( unknownShort, in, version );
-	};
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	if ( ( version >= 0x04020200 ) && ( version <= 0x04020200 ) ) {
-		NifStream( unknownShort2, in, version );
-	};
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-	NifStream( unknownFloat11, in, version );
-	NifStream( unknownFloat12, in, version );
-	NifStream( unknownFloat13, in, version );
-	NifStream( unknownFloat14, in, version );
-	NifStream( unknownFloat15, in, version );
-	NifStream( unknownFloat16, in, version );
-}
-
-void NiPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( unknownShort, out, version );
-	};
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	if ( ( version >= 0x04020200 ) && ( version <= 0x04020200 ) ) {
-		NifStream( unknownShort2, out, version );
-	};
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
-	NifStream( unknownFloat11, out, version );
-	NifStream( unknownFloat12, out, version );
-	NifStream( unknownFloat13, out, version );
-	NifStream( unknownFloat14, out, version );
-	NifStream( unknownFloat15, out, version );
-	NifStream( unknownFloat16, out, version );
+void NiPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( unknownShort, in, info );
+	};
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	if ( ( info.version >= 0x04020200 ) && ( info.version <= 0x04020200 ) ) {
+		NifStream( unknownShort2, in, info );
+	};
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+	NifStream( unknownFloat11, in, info );
+	NifStream( unknownFloat12, in, info );
+	NifStream( unknownFloat13, in, info );
+	NifStream( unknownFloat14, in, info );
+	NifStream( unknownFloat15, in, info );
+	NifStream( unknownFloat16, in, info );
+}
+
+void NiPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( unknownShort, out, info );
+	};
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	if ( ( info.version >= 0x04020200 ) && ( info.version <= 0x04020200 ) ) {
+		NifStream( unknownShort2, out, info );
+	};
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
+	NifStream( unknownFloat11, out, info );
+	NifStream( unknownFloat12, out, info );
+	NifStream( unknownFloat13, out, info );
+	NifStream( unknownFloat14, out, info );
+	NifStream( unknownFloat15, out, info );
+	NifStream( unknownFloat16, out, info );
 }
 
 std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
@@ -8711,8 +8711,8 @@ std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPlanarCollider::InternalGetRefs() const {
@@ -8721,21 +8721,21 @@ std::list<NiObjectRef> NiPlanarCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( point3Value, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( point3Value, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( point3Value, out, version );
+void NiPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( point3Value, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
@@ -8747,9 +8747,9 @@ std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiPosData>( objects, link_stack, version );
+void NiPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiPosData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPoint3Interpolator::InternalGetRefs() const {
@@ -8760,18 +8760,18 @@ std::list<NiObjectRef> NiPoint3Interpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPointLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
-	NifStream( constantAttenuation, in, version );
-	NifStream( linearAttenuation, in, version );
-	NifStream( quadraticAttenuation, in, version );
+void NiPointLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
+	NifStream( constantAttenuation, in, info );
+	NifStream( linearAttenuation, in, info );
+	NifStream( quadraticAttenuation, in, info );
 }
 
-void NiPointLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
-	NifStream( constantAttenuation, out, version );
-	NifStream( linearAttenuation, out, version );
-	NifStream( quadraticAttenuation, out, version );
+void NiPointLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
+	NifStream( constantAttenuation, out, info );
+	NifStream( linearAttenuation, out, info );
+	NifStream( quadraticAttenuation, out, info );
 }
 
 std::string NiPointLight::InternalAsString( bool verbose ) const {
@@ -8784,8 +8784,8 @@ std::string NiPointLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPointLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiPointLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPointLight::InternalGetRefs() const {
@@ -8794,27 +8794,27 @@ std::list<NiObjectRef> NiPointLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPosData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiPosData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiPosData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiPosData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -8842,8 +8842,8 @@ std::string NiPosData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPosData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiPosData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPosData::InternalGetRefs() const {
@@ -8852,21 +8852,21 @@ std::list<NiObjectRef> NiPosData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysAgeDeathModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysAgeDeathModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( spawnOnDeath, in, version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( spawnOnDeath, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysAgeDeathModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( spawnOnDeath, out, version );
+void NiPSysAgeDeathModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( spawnOnDeath, out, info );
 	if ( spawnModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
@@ -8878,9 +8878,9 @@ std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysAgeDeathModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, version );
+void NiPSysAgeDeathModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysAgeDeathModifier::InternalGetRefs() const {
@@ -8891,36 +8891,36 @@ std::list<NiObjectRef> NiPSysAgeDeathModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBombModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBombModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts1[i1], in, version );
+		NifStream( unknownInts1[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts2[i1], in, version );
+		NifStream( unknownInts2[i1], in, info );
 	};
 }
 
-void NiPSysBombModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysBombModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts1[i1], out, version );
+		NifStream( unknownInts1[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts2[i1], out, version );
+		NifStream( unknownInts2[i1], out, info );
 	};
 }
 
@@ -8968,9 +8968,9 @@ std::string NiPSysBombModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBombModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	unknownLink = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysBombModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	unknownLink = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBombModifier::InternalGetRefs() const {
@@ -8979,14 +8979,14 @@ std::list<NiObjectRef> NiPSysBombModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBoundUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( updateSkip, in, version );
+void NiPSysBoundUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( updateSkip, in, info );
 }
 
-void NiPSysBoundUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( updateSkip, out, version );
+void NiPSysBoundUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( updateSkip, out, info );
 }
 
 std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
@@ -8997,8 +8997,8 @@ std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoundUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBoundUpdateModifier::InternalGetRefs() const {
@@ -9007,18 +9007,18 @@ std::list<NiObjectRef> NiPSysBoundUpdateModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBoxEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( width, in, version );
-	NifStream( height, in, version );
-	NifStream( depth, in, version );
+void NiPSysBoxEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( width, in, info );
+	NifStream( height, in, info );
+	NifStream( depth, in, info );
 }
 
-void NiPSysBoxEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( width, out, version );
-	NifStream( height, out, version );
-	NifStream( depth, out, version );
+void NiPSysBoxEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( width, out, info );
+	NifStream( height, out, info );
+	NifStream( depth, out, info );
 }
 
 std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
@@ -9031,8 +9031,8 @@ std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoxEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysBoxEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBoxEmitter::InternalGetRefs() const {
@@ -9041,19 +9041,19 @@ std::list<NiObjectRef> NiPSysBoxEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysColliderManager::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColliderManager::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysColliderManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysColliderManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( collider != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(collider) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(collider) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
@@ -9064,9 +9064,9 @@ std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColliderManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	collider = FixLink<NiPSysPlanarCollider>( objects, link_stack, version );
+void NiPSysColliderManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	collider = FixLink<NiPSysPlanarCollider>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysColliderManager::InternalGetRefs() const {
@@ -9077,19 +9077,19 @@ std::list<NiObjectRef> NiPSysColliderManager::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
@@ -9100,9 +9100,9 @@ std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiColorData>( objects, link_stack, version );
+void NiPSysColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	data = FixLink<NiColorData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysColorModifier::InternalGetRefs() const {
@@ -9113,16 +9113,16 @@ std::list<NiObjectRef> NiPSysColorModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysCylinderEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
-	NifStream( height, in, version );
+void NiPSysCylinderEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( radius, in, info );
+	NifStream( height, in, info );
 }
 
-void NiPSysCylinderEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
-	NifStream( height, out, version );
+void NiPSysCylinderEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( radius, out, info );
+	NifStream( height, out, info );
 }
 
 std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
@@ -9134,8 +9134,8 @@ std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysCylinderEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysCylinderEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysCylinderEmitter::InternalGetRefs() const {
@@ -9144,23 +9144,23 @@ std::list<NiObjectRef> NiPSysCylinderEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A020000 ) {
+void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::Read( in, link_stack, info );
+	if ( info.version <= 0x0A020000 ) {
 		unknownFloats4.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], in, version );
+				NifStream( unknownFloats4[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownBool1, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownBool1, in, info );
 		if ( (unknownBool1 != 0) ) {
 			unknownBytes.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytes.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 32; i4++) {
-					NifStream( unknownBytes[i3][i4], in, version );
+					NifStream( unknownBytes[i3][i4], in, info );
 				};
 			};
 		};
@@ -9168,60 +9168,60 @@ void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, uns
 			unknownBytesAlt.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytesAlt.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 28; i4++) {
-					NifStream( unknownBytesAlt[i3][i4], in, version );
+					NifStream( unknownBytesAlt[i3][i4], in, info );
 				};
 			};
 		};
-		NifStream( unknownByte3, in, version );
-		NifStream( unknownBool2, in, version );
+		NifStream( unknownByte3, in, info );
+		NifStream( unknownBool2, in, info );
 		if ( (unknownBool2 != 0) ) {
 			unknownBytes2.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytes2.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 4; i4++) {
-					NifStream( unknownBytes2[i3][i4], in, version );
+					NifStream( unknownBytes2[i3][i4], in, info );
 				};
 			};
 		};
 	};
-	NifStream( unknownInt1, in, version );
+	NifStream( unknownInt1, in, info );
 }
 
-void NiPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysData::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A020000 ) {
+void NiPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysData::Write( out, link_map, info );
+	if ( info.version <= 0x0A020000 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], out, version );
+				NifStream( unknownFloats4[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownBool1, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownBool1, out, info );
 		if ( (unknownBool1 != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytes.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 32; i4++) {
-					NifStream( unknownBytes[i3][i4], out, version );
+					NifStream( unknownBytes[i3][i4], out, info );
 				};
 			};
 		};
 		if ( (unknownBool1 == 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytesAlt.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 28; i4++) {
-					NifStream( unknownBytesAlt[i3][i4], out, version );
+					NifStream( unknownBytesAlt[i3][i4], out, info );
 				};
 			};
 		};
-		NifStream( unknownByte3, out, version );
-		NifStream( unknownBool2, out, version );
+		NifStream( unknownByte3, out, info );
+		NifStream( unknownBool2, out, info );
 		if ( (unknownBool2 != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytes2.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 4; i4++) {
-					NifStream( unknownBytes2[i3][i4], out, version );
+					NifStream( unknownBytes2[i3][i4], out, info );
 				};
 			};
 		};
 	};
-	NifStream( unknownInt1, out, version );
+	NifStream( unknownInt1, out, info );
 }
 
 std::string NiPSysData::InternalAsString( bool verbose ) const {
@@ -9297,8 +9297,8 @@ std::string NiPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::FixLinks( objects, link_stack, version, user_version );
+void NiPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysData::InternalGetRefs() const {
@@ -9307,27 +9307,27 @@ std::list<NiObjectRef> NiPSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysDragModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysDragModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( dragAxis, in, version );
-	NifStream( percentage, in, version );
-	NifStream( range, in, version );
-	NifStream( rangeFalloff, in, version );
+	NifStream( dragAxis, in, info );
+	NifStream( percentage, in, info );
+	NifStream( range, in, info );
+	NifStream( rangeFalloff, in, info );
 }
 
-void NiPSysDragModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysDragModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( dragAxis, out, version );
-	NifStream( percentage, out, version );
-	NifStream( range, out, version );
-	NifStream( rangeFalloff, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( dragAxis, out, info );
+	NifStream( percentage, out, info );
+	NifStream( range, out, info );
+	NifStream( rangeFalloff, out, info );
 }
 
 std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
@@ -9342,9 +9342,9 @@ std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysDragModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	parent = FixLink<NiObject>( objects, link_stack, version );
+void NiPSysDragModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	parent = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysDragModifier::InternalGetRefs() const {
@@ -9353,32 +9353,32 @@ std::list<NiObjectRef> NiPSysDragModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( visibilityInterpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9391,13 +9391,13 @@ std::string NiPSysEmitterCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, version );
+void NiPSysEmitterCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, info );
 	};
 }
 
@@ -9411,37 +9411,37 @@ std::list<NiObjectRef> NiPSysEmitterCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterCtlrData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( floatKeys_.numKeys, in, version );
+void NiPSysEmitterCtlrData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( floatKeys_.numKeys, in, info );
 	if ( (floatKeys_.numKeys != 0) ) {
-		NifStream( floatKeys_.interpolation, in, version );
+		NifStream( floatKeys_.interpolation, in, info );
 	};
 	floatKeys_.keys.resize(floatKeys_.numKeys);
 	for (unsigned int i1 = 0; i1 < floatKeys_.keys.size(); i1++) {
-		NifStream( floatKeys_.keys[i1], in, version, floatKeys_.interpolation );
+		NifStream( floatKeys_.keys[i1], in, info, floatKeys_.interpolation );
 	};
-	NifStream( numVisibilityKeys_, in, version );
+	NifStream( numVisibilityKeys_, in, info );
 	visibilityKeys_.resize(numVisibilityKeys_);
 	for (unsigned int i1 = 0; i1 < visibilityKeys_.size(); i1++) {
-		NifStream( visibilityKeys_[i1], in, version, 1 );
+		NifStream( visibilityKeys_[i1], in, info, 1 );
 	};
 }
 
-void NiPSysEmitterCtlrData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiPSysEmitterCtlrData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numVisibilityKeys_ = (unsigned int)(visibilityKeys_.size());
 	floatKeys_.numKeys = (unsigned int)(floatKeys_.keys.size());
-	NifStream( floatKeys_.numKeys, out, version );
+	NifStream( floatKeys_.numKeys, out, info );
 	if ( (floatKeys_.numKeys != 0) ) {
-		NifStream( floatKeys_.interpolation, out, version );
+		NifStream( floatKeys_.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < floatKeys_.keys.size(); i1++) {
-		NifStream( floatKeys_.keys[i1], out, version, floatKeys_.interpolation );
+		NifStream( floatKeys_.keys[i1], out, info, floatKeys_.interpolation );
 	};
-	NifStream( numVisibilityKeys_, out, version );
+	NifStream( numVisibilityKeys_, out, info );
 	for (unsigned int i1 = 0; i1 < visibilityKeys_.size(); i1++) {
-		NifStream( visibilityKeys_[i1], out, version, 1 );
+		NifStream( visibilityKeys_[i1], out, info, 1 );
 	};
 }
 
@@ -9483,8 +9483,8 @@ std::string NiPSysEmitterCtlrData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlrData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterCtlrData::InternalGetRefs() const {
@@ -9493,12 +9493,12 @@ std::list<NiObjectRef> NiPSysEmitterCtlrData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const {
@@ -9508,8 +9508,8 @@ std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterDeclinationCtlr::InternalGetRefs() const {
@@ -9518,12 +9518,12 @@ std::list<NiObjectRef> NiPSysEmitterDeclinationCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) const {
@@ -9533,8 +9533,8 @@ std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::InternalGetRefs() const {
@@ -9543,12 +9543,12 @@ std::list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::InternalGetRefs() const
 	return refs;
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) const {
@@ -9558,8 +9558,8 @@ std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::InternalGetRefs() const {
@@ -9568,22 +9568,22 @@ std::list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterLifeSpanCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterLifeSpanCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9595,10 +9595,10 @@ std::string NiPSysEmitterLifeSpanCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9610,22 +9610,22 @@ std::list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterSpeedCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterSpeedCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9637,10 +9637,10 @@ std::string NiPSysEmitterSpeedCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9652,31 +9652,31 @@ std::list<NiObjectRef> NiPSysEmitterSpeedCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGravityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( gravityAxis, in, version );
-	NifStream( decay, in, version );
-	NifStream( strength, in, version );
-	NifStream( forceType, in, version );
-	NifStream( turbulence, in, version );
-	NifStream( turbulenceScale, in, version );
+	NifStream( gravityAxis, in, info );
+	NifStream( decay, in, info );
+	NifStream( strength, in, info );
+	NifStream( forceType, in, info );
+	NifStream( turbulence, in, info );
+	NifStream( turbulenceScale, in, info );
 }
 
-void NiPSysGravityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysGravityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( gravityObject != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(gravityObject) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(gravityObject) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( gravityAxis, out, version );
-	NifStream( decay, out, version );
-	NifStream( strength, out, version );
-	NifStream( forceType, out, version );
-	NifStream( turbulence, out, version );
-	NifStream( turbulenceScale, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( gravityAxis, out, info );
+	NifStream( decay, out, info );
+	NifStream( strength, out, info );
+	NifStream( forceType, out, info );
+	NifStream( turbulence, out, info );
+	NifStream( turbulenceScale, out, info );
 }
 
 std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
@@ -9693,9 +9693,9 @@ std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	gravityObject = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysGravityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	gravityObject = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const {
@@ -9704,22 +9704,22 @@ std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGravityStrengthCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityStrengthCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9731,10 +9731,10 @@ std::string NiPSysGravityStrengthCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9746,20 +9746,20 @@ std::list<NiObjectRef> NiPSysGravityStrengthCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGrowFadeModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( growTime, in, version );
-	NifStream( growGeneration, in, version );
-	NifStream( fadeTime, in, version );
-	NifStream( fadeGeneration, in, version );
+void NiPSysGrowFadeModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( growTime, in, info );
+	NifStream( growGeneration, in, info );
+	NifStream( fadeTime, in, info );
+	NifStream( fadeGeneration, in, info );
 }
 
-void NiPSysGrowFadeModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( growTime, out, version );
-	NifStream( growGeneration, out, version );
-	NifStream( fadeTime, out, version );
-	NifStream( fadeGeneration, out, version );
+void NiPSysGrowFadeModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( growTime, out, info );
+	NifStream( growGeneration, out, info );
+	NifStream( fadeTime, out, info );
+	NifStream( fadeGeneration, out, info );
 }
 
 std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
@@ -9773,8 +9773,8 @@ std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGrowFadeModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysGrowFadeModifier::InternalGetRefs() const {
@@ -9783,33 +9783,33 @@ std::list<NiObjectRef> NiPSysGrowFadeModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysMeshEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysEmitter::Read( in, link_stack, version, user_version );
-	NifStream( numEmitterMeshes, in, version );
+	NiPSysEmitter::Read( in, link_stack, info );
+	NifStream( numEmitterMeshes, in, info );
 	emitterMeshes.resize(numEmitterMeshes);
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( initialVelocityType, in, version );
-	NifStream( emissionType, in, version );
-	NifStream( emissionAxis, in, version );
+	NifStream( initialVelocityType, in, info );
+	NifStream( emissionType, in, info );
+	NifStream( emissionAxis, in, info );
 }
 
-void NiPSysMeshEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysEmitter::Write( out, link_map, version, user_version );
+void NiPSysMeshEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysEmitter::Write( out, link_map, info );
 	numEmitterMeshes = (unsigned int)(emitterMeshes.size());
-	NifStream( numEmitterMeshes, out, version );
+	NifStream( numEmitterMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
 		if ( emitterMeshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(emitterMeshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(emitterMeshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( initialVelocityType, out, version );
-	NifStream( emissionType, out, version );
-	NifStream( emissionAxis, out, version );
+	NifStream( initialVelocityType, out, info );
+	NifStream( emissionType, out, info );
+	NifStream( emissionAxis, out, info );
 }
 
 std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
@@ -9836,10 +9836,10 @@ std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysEmitter::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		emitterMeshes[i1] = FixLink<NiTriBasedGeom>( objects, link_stack, version );
+		emitterMeshes[i1] = FixLink<NiTriBasedGeom>( objects, link_stack, info );
 	};
 }
 
@@ -9853,26 +9853,26 @@ std::list<NiObjectRef> NiPSysMeshEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysMeshUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( numMeshes, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( numMeshes, in, info );
 	meshes.resize(numMeshes);
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysMeshUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysMeshUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	numMeshes = (unsigned int)(meshes.size());
-	NifStream( numMeshes, out, version );
+	NifStream( numMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
 		if ( meshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(meshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(meshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9897,10 +9897,10 @@ std::string NiPSysMeshUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
-		meshes[i1] = FixLink<NiNode>( objects, link_stack, version );
+		meshes[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -9914,17 +9914,17 @@ std::list<NiObjectRef> NiPSysMeshUpdateModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysModifierActiveCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt, in, version );
+void NiPSysModifierActiveCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt, in, info );
 	};
 }
 
-void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt, out, version );
+void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt, out, info );
 	};
 }
 
@@ -9936,8 +9936,8 @@ std::string NiPSysModifierActiveCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifierActiveCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysModifierActiveCtlr::InternalGetRefs() const {
@@ -9946,51 +9946,51 @@ std::list<NiObjectRef> NiPSysModifierActiveCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( bounce, in, version );
-	NifStream( spawnOnCollide, in, version );
-	NifStream( dieOnCollide, in, version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( bounce, in, info );
+	NifStream( spawnOnCollide, in, info );
+	NifStream( dieOnCollide, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( width, in, version );
-	NifStream( height, in, version );
-	NifStream( xAxis, in, version );
-	NifStream( yAxis, in, version );
+	NifStream( width, in, info );
+	NifStream( height, in, info );
+	NifStream( xAxis, in, info );
+	NifStream( yAxis, in, info );
 }
 
-void NiPSysPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( bounce, out, version );
-	NifStream( spawnOnCollide, out, version );
-	NifStream( dieOnCollide, out, version );
+void NiPSysPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( bounce, out, info );
+	NifStream( spawnOnCollide, out, info );
+	NifStream( dieOnCollide, out, info );
 	if ( spawnModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink_ != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( colliderObject != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(colliderObject) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(colliderObject) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( width, out, version );
-	NifStream( height, out, version );
-	NifStream( xAxis, out, version );
-	NifStream( yAxis, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( width, out, info );
+	NifStream( height, out, info );
+	NifStream( xAxis, out, info );
+	NifStream( yAxis, out, info );
 }
 
 std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
@@ -10011,12 +10011,12 @@ std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	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 );
+void NiPSysPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, info );
+	parent = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, info );
+	colliderObject = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysPlanarCollider::InternalGetRefs() const {
@@ -10031,12 +10031,12 @@ std::list<NiObjectRef> NiPSysPlanarCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysPositionModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
+void NiPSysPositionModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
 }
 
-void NiPSysPositionModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysPositionModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 }
 
 std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
@@ -10046,8 +10046,8 @@ std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPositionModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysPositionModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysPositionModifier::InternalGetRefs() const {
@@ -10056,12 +10056,12 @@ std::list<NiObjectRef> NiPSysPositionModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysResetOnLoopCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
 }
 
-void NiPSysResetOnLoopCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 }
 
 std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
@@ -10071,8 +10071,8 @@ std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysResetOnLoopCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysResetOnLoopCtlr::InternalGetRefs() const {
@@ -10081,30 +10081,30 @@ std::list<NiObjectRef> NiPSysResetOnLoopCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysRotationModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( initialRotationSpeed, in, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( initialRotationSpeedVariation, in, version );
-		NifStream( initialRotationAngle, in, version );
-		NifStream( initialRotationAngleVariation, in, version );
-		NifStream( randomRotSpeedSign, in, version );
+void NiPSysRotationModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( initialRotationSpeed, in, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( initialRotationSpeedVariation, in, info );
+		NifStream( initialRotationAngle, in, info );
+		NifStream( initialRotationAngleVariation, in, info );
+		NifStream( randomRotSpeedSign, in, info );
 	};
-	NifStream( randomInitialAxis, in, version );
-	NifStream( initialAxis, in, version );
+	NifStream( randomInitialAxis, in, info );
+	NifStream( initialAxis, in, info );
 }
 
-void NiPSysRotationModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( initialRotationSpeed, out, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( initialRotationSpeedVariation, out, version );
-		NifStream( initialRotationAngle, out, version );
-		NifStream( initialRotationAngleVariation, out, version );
-		NifStream( randomRotSpeedSign, out, version );
+void NiPSysRotationModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( initialRotationSpeed, out, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( initialRotationSpeedVariation, out, info );
+		NifStream( initialRotationAngle, out, info );
+		NifStream( initialRotationAngleVariation, out, info );
+		NifStream( randomRotSpeedSign, out, info );
 	};
-	NifStream( randomInitialAxis, out, version );
-	NifStream( initialAxis, out, version );
+	NifStream( randomInitialAxis, out, info );
+	NifStream( initialAxis, out, info );
 }
 
 std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
@@ -10121,8 +10121,8 @@ std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysRotationModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysRotationModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysRotationModifier::InternalGetRefs() const {
@@ -10131,28 +10131,28 @@ std::list<NiObjectRef> NiPSysRotationModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysSpawnModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( numSpawnGenerations, in, version );
-	NifStream( percentageSpawned, in, version );
-	NifStream( minNumToSpawn, in, version );
-	NifStream( maxNumToSpawn, in, version );
-	NifStream( spawnSpeedChaos, in, version );
-	NifStream( spawnDirChaos, in, version );
-	NifStream( lifeSpan, in, version );
-	NifStream( lifeSpanVariation, in, version );
+void NiPSysSpawnModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( numSpawnGenerations, in, info );
+	NifStream( percentageSpawned, in, info );
+	NifStream( minNumToSpawn, in, info );
+	NifStream( maxNumToSpawn, in, info );
+	NifStream( spawnSpeedChaos, in, info );
+	NifStream( spawnDirChaos, in, info );
+	NifStream( lifeSpan, in, info );
+	NifStream( lifeSpanVariation, in, info );
 }
 
-void NiPSysSpawnModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( numSpawnGenerations, out, version );
-	NifStream( percentageSpawned, out, version );
-	NifStream( minNumToSpawn, out, version );
-	NifStream( maxNumToSpawn, out, version );
-	NifStream( spawnSpeedChaos, out, version );
-	NifStream( spawnDirChaos, out, version );
-	NifStream( lifeSpan, out, version );
-	NifStream( lifeSpanVariation, out, version );
+void NiPSysSpawnModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( numSpawnGenerations, out, info );
+	NifStream( percentageSpawned, out, info );
+	NifStream( minNumToSpawn, out, info );
+	NifStream( maxNumToSpawn, out, info );
+	NifStream( spawnSpeedChaos, out, info );
+	NifStream( spawnDirChaos, out, info );
+	NifStream( lifeSpan, out, info );
+	NifStream( lifeSpanVariation, out, info );
 }
 
 std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
@@ -10170,8 +10170,8 @@ std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSpawnModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysSpawnModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysSpawnModifier::InternalGetRefs() const {
@@ -10180,14 +10180,14 @@ std::list<NiObjectRef> NiPSysSpawnModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysSphereEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
+void NiPSysSphereEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( radius, in, info );
 }
 
-void NiPSysSphereEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
+void NiPSysSphereEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( radius, out, info );
 }
 
 std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
@@ -10198,8 +10198,8 @@ std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSphereEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysSphereEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysSphereEmitter::InternalGetRefs() const {
@@ -10208,12 +10208,12 @@ std::list<NiObjectRef> NiPSysSphereEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysUpdateCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
+void NiPSysUpdateCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
 }
 
-void NiPSysUpdateCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiPSysUpdateCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 }
 
 std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
@@ -10223,8 +10223,8 @@ std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysUpdateCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiPSysUpdateCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysUpdateCtlr::InternalGetRefs() const {
@@ -10233,12 +10233,12 @@ std::list<NiObjectRef> NiPSysUpdateCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void NiLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string NiLODData::InternalAsString( bool verbose ) const {
@@ -10248,8 +10248,8 @@ std::string NiLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLODData::InternalGetRefs() const {
@@ -10258,25 +10258,25 @@ std::list<NiObjectRef> NiLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRangeLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::Read( in, link_stack, version, user_version );
-	NifStream( lodCenter, in, version );
-	NifStream( numLodLevels, in, version );
+void NiRangeLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::Read( in, link_stack, info );
+	NifStream( lodCenter, in, info );
+	NifStream( numLodLevels, in, info );
 	lodLevels.resize(numLodLevels);
 	for (unsigned int i1 = 0; i1 < lodLevels.size(); i1++) {
-		NifStream( lodLevels[i1].nearExtent, in, version );
-		NifStream( lodLevels[i1].farExtent, in, version );
+		NifStream( lodLevels[i1].nearExtent, in, info );
+		NifStream( lodLevels[i1].farExtent, in, info );
 	};
 }
 
-void NiRangeLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLODData::Write( out, link_map, version, user_version );
+void NiRangeLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLODData::Write( out, link_map, info );
 	numLodLevels = (unsigned int)(lodLevels.size());
-	NifStream( lodCenter, out, version );
-	NifStream( numLodLevels, out, version );
+	NifStream( lodCenter, out, info );
+	NifStream( numLodLevels, out, info );
 	for (unsigned int i1 = 0; i1 < lodLevels.size(); i1++) {
-		NifStream( lodLevels[i1].nearExtent, out, version );
-		NifStream( lodLevels[i1].farExtent, out, version );
+		NifStream( lodLevels[i1].nearExtent, out, info );
+		NifStream( lodLevels[i1].farExtent, out, info );
 	};
 }
 
@@ -10299,8 +10299,8 @@ std::string NiRangeLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRangeLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::FixLinks( objects, link_stack, version, user_version );
+void NiRangeLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRangeLODData::InternalGetRefs() const {
@@ -10309,29 +10309,29 @@ std::list<NiObjectRef> NiRangeLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiScreenLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::Read( in, link_stack, version, user_version );
-	NifStream( boundCenter, in, version );
-	NifStream( boundRadius, in, version );
-	NifStream( worldCenter, in, version );
-	NifStream( worldRadius, in, version );
-	NifStream( proportionCount, in, version );
+void NiScreenLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::Read( in, link_stack, info );
+	NifStream( boundCenter, in, info );
+	NifStream( boundRadius, in, info );
+	NifStream( worldCenter, in, info );
+	NifStream( worldRadius, in, info );
+	NifStream( proportionCount, in, info );
 	proportionLevels.resize(proportionCount);
 	for (unsigned int i1 = 0; i1 < proportionLevels.size(); i1++) {
-		NifStream( proportionLevels[i1], in, version );
+		NifStream( proportionLevels[i1], in, info );
 	};
 }
 
-void NiScreenLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLODData::Write( out, link_map, version, user_version );
+void NiScreenLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLODData::Write( out, link_map, info );
 	proportionCount = (unsigned int)(proportionLevels.size());
-	NifStream( boundCenter, out, version );
-	NifStream( boundRadius, out, version );
-	NifStream( worldCenter, out, version );
-	NifStream( worldRadius, out, version );
-	NifStream( proportionCount, out, version );
+	NifStream( boundCenter, out, info );
+	NifStream( boundRadius, out, info );
+	NifStream( worldCenter, out, info );
+	NifStream( worldRadius, out, info );
+	NifStream( proportionCount, out, info );
 	for (unsigned int i1 = 0; i1 < proportionLevels.size(); i1++) {
-		NifStream( proportionLevels[i1], out, version );
+		NifStream( proportionLevels[i1], out, info );
 	};
 }
 
@@ -10360,8 +10360,8 @@ std::string NiScreenLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiScreenLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::FixLinks( objects, link_stack, version, user_version );
+void NiScreenLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiScreenLODData::InternalGetRefs() const {
@@ -10370,12 +10370,12 @@ std::list<NiObjectRef> NiScreenLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRotatingParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiRotatingParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiRotatingParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiRotatingParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
@@ -10385,8 +10385,8 @@ std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRotatingParticles::InternalGetRefs() const {
@@ -10395,12 +10395,12 @@ std::list<NiObjectRef> NiRotatingParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRotatingParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::Read( in, link_stack, version, user_version );
+void NiRotatingParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::Read( in, link_stack, info );
 }
 
-void NiRotatingParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticlesData::Write( out, link_map, version, user_version );
+void NiRotatingParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticlesData::Write( out, link_map, info );
 }
 
 std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
@@ -10410,8 +10410,8 @@ std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRotatingParticlesData::InternalGetRefs() const {
@@ -10420,12 +10420,12 @@ std::list<NiObjectRef> NiRotatingParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSequenceStreamHelper::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::Read( in, link_stack, version, user_version );
+void NiSequenceStreamHelper::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::Read( in, link_stack, info );
 }
 
-void NiSequenceStreamHelper::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiSequenceStreamHelper::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 }
 
 std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
@@ -10435,8 +10435,8 @@ std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSequenceStreamHelper::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiSequenceStreamHelper::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSequenceStreamHelper::InternalGetRefs() const {
@@ -10445,14 +10445,14 @@ std::list<NiObjectRef> NiSequenceStreamHelper::InternalGetRefs() const {
 	return refs;
 }
 
-void NiShadeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiShadeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiShadeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiShadeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiShadeProperty::InternalAsString( bool verbose ) const {
@@ -10463,8 +10463,8 @@ std::string NiShadeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiShadeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiShadeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiShadeProperty::InternalGetRefs() const {
@@ -10473,63 +10473,63 @@ std::list<NiObjectRef> NiShadeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( rotation, in, version );
-	NifStream( translation, in, version );
-	NifStream( scale, in, version );
-	NifStream( numBones, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( rotation, in, info );
+	NifStream( translation, in, info );
+	NifStream( scale, in, info );
+	NifStream( numBones, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownByte, in, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownByte, in, info );
 	};
 	boneList.resize(numBones);
 	for (unsigned int i1 = 0; i1 < boneList.size(); i1++) {
-		NifStream( boneList[i1].rotation, in, version );
-		NifStream( boneList[i1].translation, in, version );
-		NifStream( boneList[i1].scale, in, version );
-		NifStream( boneList[i1].boundingSphereOffset, in, version );
-		NifStream( boneList[i1].boundingSphereRadius, in, version );
-		NifStream( boneList[i1].numVertices, in, version );
+		NifStream( boneList[i1].rotation, in, info );
+		NifStream( boneList[i1].translation, in, info );
+		NifStream( boneList[i1].scale, in, info );
+		NifStream( boneList[i1].boundingSphereOffset, in, info );
+		NifStream( boneList[i1].boundingSphereRadius, in, info );
+		NifStream( boneList[i1].numVertices, in, info );
 		boneList[i1].vertexWeights.resize(boneList[i1].numVertices);
 		for (unsigned int i2 = 0; i2 < boneList[i1].vertexWeights.size(); i2++) {
-			NifStream( boneList[i1].vertexWeights[i2].index, in, version );
-			NifStream( boneList[i1].vertexWeights[i2].weight, in, version );
+			NifStream( boneList[i1].vertexWeights[i2].index, in, info );
+			NifStream( boneList[i1].vertexWeights[i2].weight, in, info );
 		};
 	};
 }
 
-void NiSkinData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numBones = (unsigned int)(boneList.size());
-	NifStream( rotation, out, version );
-	NifStream( translation, out, version );
-	NifStream( scale, out, version );
-	NifStream( numBones, out, version );
-	if ( version <= 0x0A010000 ) {
+	NifStream( rotation, out, info );
+	NifStream( translation, out, info );
+	NifStream( scale, out, info );
+	NifStream( numBones, out, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( skinPartition != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownByte, out, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownByte, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < boneList.size(); i1++) {
 		boneList[i1].numVertices = (unsigned short)(boneList[i1].vertexWeights.size());
-		NifStream( boneList[i1].rotation, out, version );
-		NifStream( boneList[i1].translation, out, version );
-		NifStream( boneList[i1].scale, out, version );
-		NifStream( boneList[i1].boundingSphereOffset, out, version );
-		NifStream( boneList[i1].boundingSphereRadius, out, version );
-		NifStream( boneList[i1].numVertices, out, version );
+		NifStream( boneList[i1].rotation, out, info );
+		NifStream( boneList[i1].translation, out, info );
+		NifStream( boneList[i1].scale, out, info );
+		NifStream( boneList[i1].boundingSphereOffset, out, info );
+		NifStream( boneList[i1].boundingSphereRadius, out, info );
+		NifStream( boneList[i1].numVertices, out, info );
 		for (unsigned int i2 = 0; i2 < boneList[i1].vertexWeights.size(); i2++) {
-			NifStream( boneList[i1].vertexWeights[i2].index, out, version );
-			NifStream( boneList[i1].vertexWeights[i2].weight, out, version );
+			NifStream( boneList[i1].vertexWeights[i2].index, out, info );
+			NifStream( boneList[i1].vertexWeights[i2].weight, out, info );
 		};
 	};
 }
@@ -10571,10 +10571,10 @@ std::string NiSkinData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
+void NiSkinData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, info );
 	};
 }
 
@@ -10586,48 +10586,48 @@ std::list<NiObjectRef> NiSkinData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( numBones, in, version );
+	NifStream( numBones, in, info );
 	bones.resize(numBones);
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numBones = (unsigned int)(bones.size());
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	if ( version >= 0x0A020000 ) {
+		NifStream( 0xffffffff, out, info );
+	if ( info.version >= 0x0A020000 ) {
 		if ( skinPartition != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 	if ( skeletonRoot != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(skeletonRoot) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(skeletonRoot) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( numBones, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( numBones, out, info );
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
 		if ( bones[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -10655,15 +10655,15 @@ std::string NiSkinInstance::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiSkinData>( objects, link_stack, version );
-	if ( version >= 0x0A020000 ) {
-		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
+void NiSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	data = FixLink<NiSkinData>( objects, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, info );
 	};
-	skeletonRoot = FixLink<NiNode>( objects, link_stack, version );
+	skeletonRoot = FixLink<NiNode>( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
-		bones[i1] = FixLink<NiNode>( objects, link_stack, version );
+		bones[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -10679,12 +10679,12 @@ std::list<NiObjectRef> NiSkinInstance::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClodSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSkinInstance::Read( in, link_stack, version, user_version );
+void NiClodSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSkinInstance::Read( in, link_stack, info );
 }
 
-void NiClodSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSkinInstance::Write( out, link_map, version, user_version );
+void NiClodSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSkinInstance::Write( out, link_map, info );
 }
 
 std::string NiClodSkinInstance::InternalAsString( bool verbose ) const {
@@ -10694,8 +10694,8 @@ std::string NiClodSkinInstance::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClodSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSkinInstance::FixLinks( objects, link_stack, version, user_version );
+void NiClodSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSkinInstance::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClodSkinInstance::InternalGetRefs() const {
@@ -10704,81 +10704,81 @@ std::list<NiObjectRef> NiClodSkinInstance::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numSkinPartitionBlocks, in, version );
+void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numSkinPartitionBlocks, in, info );
 	skinPartitionBlocks.resize(numSkinPartitionBlocks);
 	for (unsigned int i1 = 0; i1 < skinPartitionBlocks.size(); i1++) {
-		NifStream( skinPartitionBlocks[i1].numVertices, in, version );
-		NifStream( skinPartitionBlocks[i1].numTriangles, in, version );
-		NifStream( skinPartitionBlocks[i1].numBones, in, version );
-		NifStream( skinPartitionBlocks[i1].numStrips, in, version );
-		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, in, version );
+		NifStream( skinPartitionBlocks[i1].numVertices, in, info );
+		NifStream( skinPartitionBlocks[i1].numTriangles, in, info );
+		NifStream( skinPartitionBlocks[i1].numBones, in, info );
+		NifStream( skinPartitionBlocks[i1].numStrips, in, info );
+		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, in, info );
 		skinPartitionBlocks[i1].bones.resize(skinPartitionBlocks[i1].numBones);
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].bones.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].bones[i2], in, version );
+			NifStream( skinPartitionBlocks[i1].bones[i2], in, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasVertexMap, in, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasVertexMap, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].vertexMap.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexMap.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].vertexMap[i3], in, version );
+				NifStream( skinPartitionBlocks[i1].vertexMap[i3], in, info );
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexMap != 0) ) {
 				skinPartitionBlocks[i1].vertexMap.resize(skinPartitionBlocks[i1].numVertices);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexMap.size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexMap[i4], in, version );
+					NifStream( skinPartitionBlocks[i1].vertexMap[i4], in, info );
 				};
 			};
-			NifStream( skinPartitionBlocks[i1].hasVertexWeights, in, version );
+			NifStream( skinPartitionBlocks[i1].hasVertexWeights, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].vertexWeights.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexWeights.size(); i3++) {
 				skinPartitionBlocks[i1].vertexWeights[i3].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], in, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexWeights != 0) ) {
 				skinPartitionBlocks[i1].vertexWeights.resize(skinPartitionBlocks[i1].numVertices);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights.size(); i4++) {
 					skinPartitionBlocks[i1].vertexWeights[i4].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].vertexWeights[i4].size(); i5++) {
-						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], in, version );
+						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], in, info );
 					};
 				};
 			};
 		};
 		skinPartitionBlocks[i1].stripLengths.resize(skinPartitionBlocks[i1].numStrips);
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].stripLengths.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].stripLengths[i2], in, version );
+			NifStream( skinPartitionBlocks[i1].stripLengths[i2], in, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasStrips, in, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasStrips, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].strips.resize(skinPartitionBlocks[i1].numStrips);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].strips.size(); i3++) {
 				skinPartitionBlocks[i1].strips[i3].resize(skinPartitionBlocks[i1].stripLengths[i3]);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].stripLengths[i3]; i4++) {
-					NifStream( skinPartitionBlocks[i1].strips[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].strips[i3][i4], in, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasStrips != 0) ) {
 				skinPartitionBlocks[i1].strips.resize(skinPartitionBlocks[i1].numStrips);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].strips.size(); i4++) {
 					skinPartitionBlocks[i1].strips[i4].resize(skinPartitionBlocks[i1].stripLengths[i4]);
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].stripLengths[i4]; i5++) {
-						NifStream( skinPartitionBlocks[i1].strips[i4][i5], in, version );
+						NifStream( skinPartitionBlocks[i1].strips[i4][i5], in, info );
 					};
 				};
 			};
@@ -10786,26 +10786,26 @@ void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack
 		if ( (skinPartitionBlocks[i1].numStrips == 0) ) {
 			skinPartitionBlocks[i1].triangles.resize(skinPartitionBlocks[i1].numTriangles);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].triangles.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].triangles[i3], in, version );
+				NifStream( skinPartitionBlocks[i1].triangles[i3], in, info );
 			};
 		};
-		NifStream( skinPartitionBlocks[i1].hasBoneIndices, in, version );
+		NifStream( skinPartitionBlocks[i1].hasBoneIndices, in, info );
 		if ( (skinPartitionBlocks[i1].hasBoneIndices != 0) ) {
 			skinPartitionBlocks[i1].boneIndices.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].boneIndices.size(); i3++) {
 				skinPartitionBlocks[i1].boneIndices[i3].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].boneIndices[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], in, info );
 				};
 			};
 		};
 	};
 }
 
-void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numSkinPartitionBlocks = (unsigned int)(skinPartitionBlocks.size());
-	NifStream( numSkinPartitionBlocks, out, version );
+	NifStream( numSkinPartitionBlocks, out, info );
 	for (unsigned int i1 = 0; i1 < skinPartitionBlocks.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].strips.size(); i2++)
 			skinPartitionBlocks[i1].stripLengths[i2] = (unsigned short)(skinPartitionBlocks[i1].strips[i2].size());
@@ -10814,78 +10814,78 @@ void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigne
 		skinPartitionBlocks[i1].numBones = (unsigned short)(skinPartitionBlocks[i1].bones.size());
 		skinPartitionBlocks[i1].numTriangles = (unsigned short)(skinPartitionBlocks[i1].triangles.size());
 		skinPartitionBlocks[i1].numVertices = (unsigned short)(skinPartitionBlocks[i1].vertexMap.size());
-		NifStream( skinPartitionBlocks[i1].numVertices, out, version );
-		NifStream( skinPartitionBlocks[i1].numTriangles, out, version );
-		NifStream( skinPartitionBlocks[i1].numBones, out, version );
-		NifStream( skinPartitionBlocks[i1].numStrips, out, version );
-		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, out, version );
+		NifStream( skinPartitionBlocks[i1].numVertices, out, info );
+		NifStream( skinPartitionBlocks[i1].numTriangles, out, info );
+		NifStream( skinPartitionBlocks[i1].numBones, out, info );
+		NifStream( skinPartitionBlocks[i1].numStrips, out, info );
+		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, out, info );
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].bones.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].bones[i2], out, version );
+			NifStream( skinPartitionBlocks[i1].bones[i2], out, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasVertexMap, out, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasVertexMap, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexMap.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].vertexMap[i3], out, version );
+				NifStream( skinPartitionBlocks[i1].vertexMap[i3], out, info );
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexMap != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexMap.size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexMap[i4], out, version );
+					NifStream( skinPartitionBlocks[i1].vertexMap[i4], out, info );
 				};
 			};
-			NifStream( skinPartitionBlocks[i1].hasVertexWeights, out, version );
+			NifStream( skinPartitionBlocks[i1].hasVertexWeights, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexWeights.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], out, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexWeights != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights.size(); i4++) {
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].vertexWeights[i4].size(); i5++) {
-						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], out, version );
+						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], out, info );
 					};
 				};
 			};
 		};
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].stripLengths.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].stripLengths[i2], out, version );
+			NifStream( skinPartitionBlocks[i1].stripLengths[i2], out, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasStrips, out, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasStrips, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].strips.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].stripLengths[i3]; i4++) {
-					NifStream( skinPartitionBlocks[i1].strips[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].strips[i3][i4], out, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasStrips != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].strips.size(); i4++) {
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].stripLengths[i4]; i5++) {
-						NifStream( skinPartitionBlocks[i1].strips[i4][i5], out, version );
+						NifStream( skinPartitionBlocks[i1].strips[i4][i5], out, info );
 					};
 				};
 			};
 		};
 		if ( (skinPartitionBlocks[i1].numStrips == 0) ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].triangles.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].triangles[i3], out, version );
+				NifStream( skinPartitionBlocks[i1].triangles[i3], out, info );
 			};
 		};
-		NifStream( skinPartitionBlocks[i1].hasBoneIndices, out, version );
+		NifStream( skinPartitionBlocks[i1].hasBoneIndices, out, info );
 		if ( (skinPartitionBlocks[i1].hasBoneIndices != 0) ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].boneIndices.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].boneIndices[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], out, info );
 				};
 			};
 		};
@@ -11018,8 +11018,8 @@ std::string NiSkinPartition::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinPartition::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiSkinPartition::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSkinPartition::InternalGetRefs() const {
@@ -11028,78 +11028,78 @@ std::list<NiObjectRef> NiSkinPartition::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSourceTexture::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSourceTexture::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObjectNET::Read( in, link_stack, version, user_version );
-	NifStream( useExternal, in, version );
+	NiObjectNET::Read( in, link_stack, info );
+	NifStream( useExternal, in, info );
 	if ( (useExternal == 1) ) {
-		NifStream( fileName, in, version );
+		NifStream( fileName, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version <= 0x0A000100 ) {
+	if ( info.version <= 0x0A000100 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( unknownByte, in, version );
+			NifStream( unknownByte, in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( originalFileName_, in, version );
+			NifStream( originalFileName_, in, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( pixelLayout, in, version );
-	NifStream( useMipmaps, in, version );
-	NifStream( alphaFormat, in, version );
-	NifStream( unknownByte, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownByte2, in, version );
+	NifStream( pixelLayout, in, info );
+	NifStream( useMipmaps, in, info );
+	NifStream( alphaFormat, in, info );
+	NifStream( unknownByte, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownByte2, in, info );
 	};
 }
 
-void NiSourceTexture::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
-	NifStream( useExternal, out, version );
+void NiSourceTexture::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
+	NifStream( useExternal, out, info );
 	if ( (useExternal == 1) ) {
-		NifStream( fileName, out, version );
+		NifStream( fileName, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
 			if ( unknownLink != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version <= 0x0A000100 ) {
+	if ( info.version <= 0x0A000100 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( unknownByte, out, version );
+			NifStream( unknownByte, out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( originalFileName_, out, version );
+			NifStream( originalFileName_, out, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
 		if ( pixelData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(pixelData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(pixelData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( pixelLayout, out, version );
-	NifStream( useMipmaps, out, version );
-	NifStream( alphaFormat, out, version );
-	NifStream( unknownByte, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownByte2, out, version );
+	NifStream( pixelLayout, out, info );
+	NifStream( useMipmaps, out, info );
+	NifStream( alphaFormat, out, info );
+	NifStream( unknownByte, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownByte2, out, info );
 	};
 }
 
@@ -11124,15 +11124,15 @@ std::string NiSourceTexture::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSourceTexture::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiSourceTexture::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
-			unknownLink = FixLink<NiObject>( objects, link_stack, version );
+			unknownLink = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
-		pixelData = FixLink<NiPixelData>( objects, link_stack, version );
+		pixelData = FixLink<NiPixelData>( objects, link_stack, info );
 	};
 }
 
@@ -11146,14 +11146,14 @@ std::list<NiObjectRef> NiSourceTexture::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSpecularProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiSpecularProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiSpecularProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiSpecularProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
@@ -11164,8 +11164,8 @@ std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpecularProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiSpecularProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSpecularProperty::InternalGetRefs() const {
@@ -11174,34 +11174,34 @@ std::list<NiObjectRef> NiSpecularProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSphericalCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownFloat2, in, version );
-	if ( version <= 0x04020002 ) {
-		NifStream( unknownShort2, in, version );
+void NiSphericalCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownFloat2, in, info );
+	if ( info.version <= 0x04020002 ) {
+		NifStream( unknownShort2, in, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownFloat3, in, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownFloat3, in, info );
 	};
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownFloat5, in, version );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownFloat5, in, info );
 }
 
-void NiSphericalCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownFloat2, out, version );
-	if ( version <= 0x04020002 ) {
-		NifStream( unknownShort2, out, version );
+void NiSphericalCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownFloat2, out, info );
+	if ( info.version <= 0x04020002 ) {
+		NifStream( unknownShort2, out, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownFloat3, out, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownFloat3, out, info );
 	};
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownFloat5, out, version );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownFloat5, out, info );
 }
 
 std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
@@ -11218,8 +11218,8 @@ std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSphericalCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiSphericalCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSphericalCollider::InternalGetRefs() const {
@@ -11228,16 +11228,16 @@ std::list<NiObjectRef> NiSphericalCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSpotLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPointLight::Read( in, link_stack, version, user_version );
-	NifStream( cutoffAngle, in, version );
-	NifStream( exponent, in, version );
+void NiSpotLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPointLight::Read( in, link_stack, info );
+	NifStream( cutoffAngle, in, info );
+	NifStream( exponent, in, info );
 }
 
-void NiSpotLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPointLight::Write( out, link_map, version, user_version );
-	NifStream( cutoffAngle, out, version );
-	NifStream( exponent, out, version );
+void NiSpotLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPointLight::Write( out, link_map, info );
+	NifStream( cutoffAngle, out, info );
+	NifStream( exponent, out, info );
 }
 
 std::string NiSpotLight::InternalAsString( bool verbose ) const {
@@ -11249,8 +11249,8 @@ std::string NiSpotLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpotLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPointLight::FixLinks( objects, link_stack, version, user_version );
+void NiSpotLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPointLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSpotLight::InternalGetRefs() const {
@@ -11259,34 +11259,34 @@ std::list<NiObjectRef> NiSpotLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStencilProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+void NiStencilProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( stencilEnabled, in, version );
-	NifStream( stencilFunction, in, version );
-	NifStream( stencilRef, in, version );
-	NifStream( stencilMask, in, version );
-	NifStream( failAction, in, version );
-	NifStream( zFailAction, in, version );
-	NifStream( passAction, in, version );
-	NifStream( drawMode, in, version );
+	NifStream( stencilEnabled, in, info );
+	NifStream( stencilFunction, in, info );
+	NifStream( stencilRef, in, info );
+	NifStream( stencilMask, in, info );
+	NifStream( failAction, in, info );
+	NifStream( zFailAction, in, info );
+	NifStream( passAction, in, info );
+	NifStream( drawMode, in, info );
 }
 
-void NiStencilProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+void NiStencilProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( stencilEnabled, out, version );
-	NifStream( stencilFunction, out, version );
-	NifStream( stencilRef, out, version );
-	NifStream( stencilMask, out, version );
-	NifStream( failAction, out, version );
-	NifStream( zFailAction, out, version );
-	NifStream( passAction, out, version );
-	NifStream( drawMode, out, version );
+	NifStream( stencilEnabled, out, info );
+	NifStream( stencilFunction, out, info );
+	NifStream( stencilRef, out, info );
+	NifStream( stencilMask, out, info );
+	NifStream( failAction, out, info );
+	NifStream( zFailAction, out, info );
+	NifStream( passAction, out, info );
+	NifStream( drawMode, out, info );
 }
 
 std::string NiStencilProperty::InternalAsString( bool verbose ) const {
@@ -11305,8 +11305,8 @@ std::string NiStencilProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStencilProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiStencilProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStencilProperty::InternalGetRefs() const {
@@ -11315,20 +11315,20 @@ std::list<NiObjectRef> NiStencilProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( bytesRemaining, in, version );
+void NiStringExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( bytesRemaining, in, info );
 	};
-	NifStream( stringData, in, version );
+	NifStream( stringData, in, info );
 }
 
-void NiStringExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( bytesRemaining, out, version );
+void NiStringExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( bytesRemaining, out, info );
 	};
-	NifStream( stringData, out, version );
+	NifStream( stringData, out, info );
 }
 
 std::string NiStringExtraData::InternalAsString( bool verbose ) const {
@@ -11340,8 +11340,8 @@ std::string NiStringExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiStringExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringExtraData::InternalGetRefs() const {
@@ -11350,16 +11350,16 @@ std::list<NiObjectRef> NiStringExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( palette.palette, in, version );
-	NifStream( palette.length, in, version );
+void NiStringPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( palette.palette, in, info );
+	NifStream( palette.length, in, info );
 }
 
-void NiStringPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( palette.palette, out, version );
-	NifStream( palette.length, out, version );
+void NiStringPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( palette.palette, out, info );
+	NifStream( palette.length, out, info );
 }
 
 std::string NiStringPalette::InternalAsString( bool verbose ) const {
@@ -11371,8 +11371,8 @@ std::string NiStringPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiStringPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringPalette::InternalGetRefs() const {
@@ -11381,21 +11381,21 @@ std::list<NiObjectRef> NiStringPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numStrings, in, version );
+void NiStringsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numStrings, in, info );
 	data.resize(numStrings);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiStringsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiStringsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numStrings = (unsigned int)(data.size());
-	NifStream( numStrings, out, version );
+	NifStream( numStrings, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -11420,8 +11420,8 @@ std::string NiStringsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiStringsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringsExtraData::InternalGetRefs() const {
@@ -11430,27 +11430,27 @@ std::list<NiObjectRef> NiStringsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextKeyExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( unknownInt1, in, version );
+void NiTextKeyExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( unknownInt1, in, info );
 	};
-	NifStream( numTextKeys, in, version );
+	NifStream( numTextKeys, in, info );
 	textKeys.resize(numTextKeys);
 	for (unsigned int i1 = 0; i1 < textKeys.size(); i1++) {
-		NifStream( textKeys[i1], in, version, 1 );
+		NifStream( textKeys[i1], in, info, 1 );
 	};
 }
 
-void NiTextKeyExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiTextKeyExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numTextKeys = (unsigned int)(textKeys.size());
-	if ( version <= 0x04020200 ) {
-		NifStream( unknownInt1, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( unknownInt1, out, info );
 	};
-	NifStream( numTextKeys, out, version );
+	NifStream( numTextKeys, out, info );
 	for (unsigned int i1 = 0; i1 < textKeys.size(); i1++) {
-		NifStream( textKeys[i1], out, version, 1 );
+		NifStream( textKeys[i1], out, info, 1 );
 	};
 }
 
@@ -11476,8 +11476,8 @@ std::string NiTextKeyExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextKeyExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiTextKeyExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextKeyExtraData::InternalGetRefs() const {
@@ -11486,50 +11486,50 @@ std::list<NiObjectRef> NiTextKeyExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureEffect::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureEffect::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiDynamicEffect::Read( in, link_stack, version, user_version );
-	NifStream( modelProjectionMatrix, in, version );
-	NifStream( modelProjectionTransform, in, version );
-	NifStream( textureFiltering, in, version );
-	NifStream( textureClamping, in, version );
-	NifStream( textureType, in, version );
-	NifStream( coordinateGenerationType, in, version );
-	NifStream( block_num, in, version );
+	NiDynamicEffect::Read( in, link_stack, info );
+	NifStream( modelProjectionMatrix, in, info );
+	NifStream( modelProjectionTransform, in, info );
+	NifStream( textureFiltering, in, info );
+	NifStream( textureClamping, in, info );
+	NifStream( textureType, in, info );
+	NifStream( coordinateGenerationType, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( clippingPlane, in, version );
-	NifStream( unknownVector, in, version );
-	NifStream( unknownFloat, in, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( ps2L, in, version );
-		NifStream( ps2K, in, version );
-	};
-	if ( version <= 0x0401000C ) {
-		NifStream( unknownShort, in, version );
-	};
-}
-
-void NiTextureEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiDynamicEffect::Write( out, link_map, version, user_version );
-	NifStream( modelProjectionMatrix, out, version );
-	NifStream( modelProjectionTransform, out, version );
-	NifStream( textureFiltering, out, version );
-	NifStream( textureClamping, out, version );
-	NifStream( textureType, out, version );
-	NifStream( coordinateGenerationType, out, version );
+	NifStream( clippingPlane, in, info );
+	NifStream( unknownVector, in, info );
+	NifStream( unknownFloat, in, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( ps2L, in, info );
+		NifStream( ps2K, in, info );
+	};
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownShort, in, info );
+	};
+}
+
+void NiTextureEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiDynamicEffect::Write( out, link_map, info );
+	NifStream( modelProjectionMatrix, out, info );
+	NifStream( modelProjectionTransform, out, info );
+	NifStream( textureFiltering, out, info );
+	NifStream( textureClamping, out, info );
+	NifStream( textureType, out, info );
+	NifStream( coordinateGenerationType, out, info );
 	if ( sourceTexture != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(sourceTexture) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(sourceTexture) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( clippingPlane, out, version );
-	NifStream( unknownVector, out, version );
-	NifStream( unknownFloat, out, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( ps2L, out, version );
-		NifStream( ps2K, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( clippingPlane, out, info );
+	NifStream( unknownVector, out, info );
+	NifStream( unknownFloat, out, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( ps2L, out, info );
+		NifStream( ps2K, out, info );
 	};
-	if ( version <= 0x0401000C ) {
-		NifStream( unknownShort, out, version );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownShort, out, info );
 	};
 }
 
@@ -11553,9 +11553,9 @@ std::string NiTextureEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
-	sourceTexture = FixLink<NiSourceTexture>( objects, link_stack, version );
+void NiTextureEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::FixLinks( objects, link_stack, info );
+	sourceTexture = FixLink<NiSourceTexture>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureEffect::InternalGetRefs() const {
@@ -11566,28 +11566,28 @@ std::list<NiObjectRef> NiTextureEffect::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( unknown2, in, version );
-	NifStream( textureSlot, in, version );
-	NifStream( operation, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( unknown2, in, info );
+	NifStream( textureSlot, in, info );
+	NifStream( operation, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiTextureTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	NifStream( unknown2, out, version );
-	NifStream( textureSlot, out, version );
-	NifStream( operation, out, version );
-	if ( version <= 0x0A010000 ) {
+void NiTextureTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	NifStream( unknown2, out, info );
+	NifStream( textureSlot, out, info );
+	NifStream( operation, out, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -11602,10 +11602,10 @@ std::string NiTextureTransformController::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiTextureTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiTextureTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -11617,17 +11617,17 @@ std::list<NiObjectRef> NiTextureTransformController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureModeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
+void NiTextureModeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknown3Shorts[i1], in, version );
+		NifStream( unknown3Shorts[i1], in, info );
 	};
 }
 
-void NiTextureModeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
+void NiTextureModeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknown3Shorts[i1], out, version );
+		NifStream( unknown3Shorts[i1], out, info );
 	};
 }
 
@@ -11650,8 +11650,8 @@ std::string NiTextureModeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureModeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiTextureModeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureModeProperty::InternalGetRefs() const {
@@ -11660,21 +11660,21 @@ std::list<NiObjectRef> NiTextureModeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiImage::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( external_, in, version );
-	NifStream( file, in, version );
+void NiImage::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( external_, in, info );
+	NifStream( file, in, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], in, version );
+		NifStream( unknown4Shorts[i1], in, info );
 	};
 }
 
-void NiImage::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( external_, out, version );
-	NifStream( file, out, version );
+void NiImage::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( external_, out, info );
+	NifStream( file, out, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], out, version );
+		NifStream( unknown4Shorts[i1], out, info );
 	};
 }
 
@@ -11699,8 +11699,8 @@ std::string NiImage::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiImage::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiImage::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiImage::InternalGetRefs() const {
@@ -11709,21 +11709,21 @@ std::list<NiObjectRef> NiImage::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( block_num, in, version );
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTextureProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiTextureProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 	if ( image != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTextureProperty::InternalAsString( bool verbose ) const {
@@ -11735,9 +11735,9 @@ std::string NiTextureProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
-	image = FixLink<NiImage>( objects, link_stack, version );
+void NiTextureProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
+	image = FixLink<NiImage>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureProperty::InternalGetRefs() const {
@@ -11748,624 +11748,624 @@ std::list<NiObjectRef> NiTextureProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTexturingProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTexturingProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( applyMode, in, version );
-	NifStream( textureCount, in, version );
-	NifStream( hasBaseTexture, in, version );
+	NifStream( applyMode, in, info );
+	NifStream( textureCount, in, info );
+	NifStream( hasBaseTexture, in, info );
 	if ( (hasBaseTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( baseTexture.clampMode, in, version );
-		NifStream( baseTexture.filterMode, in, version );
-		NifStream( baseTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( baseTexture.ps2L, in, version );
-			NifStream( baseTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( baseTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( baseTexture.hasTextureTransform, in, version );
+		NifStream( baseTexture.clampMode, in, info );
+		NifStream( baseTexture.filterMode, in, info );
+		NifStream( baseTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( baseTexture.ps2L, in, info );
+			NifStream( baseTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( baseTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( baseTexture.hasTextureTransform, in, info );
 			if ( (baseTexture.hasTextureTransform != 0) ) {
-				NifStream( baseTexture.translation, in, version );
-				NifStream( baseTexture.tiling, in, version );
-				NifStream( baseTexture.wRotation, in, version );
-				NifStream( baseTexture.transformType_, in, version );
-				NifStream( baseTexture.centerOffset, in, version );
+				NifStream( baseTexture.translation, in, info );
+				NifStream( baseTexture.tiling, in, info );
+				NifStream( baseTexture.wRotation, in, info );
+				NifStream( baseTexture.transformType_, in, info );
+				NifStream( baseTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasDarkTexture, in, version );
+	NifStream( hasDarkTexture, in, info );
 	if ( (hasDarkTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( darkTexture.clampMode, in, version );
-		NifStream( darkTexture.filterMode, in, version );
-		NifStream( darkTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( darkTexture.ps2L, in, version );
-			NifStream( darkTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( darkTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( darkTexture.hasTextureTransform, in, version );
+		NifStream( darkTexture.clampMode, in, info );
+		NifStream( darkTexture.filterMode, in, info );
+		NifStream( darkTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( darkTexture.ps2L, in, info );
+			NifStream( darkTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( darkTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( darkTexture.hasTextureTransform, in, info );
 			if ( (darkTexture.hasTextureTransform != 0) ) {
-				NifStream( darkTexture.translation, in, version );
-				NifStream( darkTexture.tiling, in, version );
-				NifStream( darkTexture.wRotation, in, version );
-				NifStream( darkTexture.transformType_, in, version );
-				NifStream( darkTexture.centerOffset, in, version );
+				NifStream( darkTexture.translation, in, info );
+				NifStream( darkTexture.tiling, in, info );
+				NifStream( darkTexture.wRotation, in, info );
+				NifStream( darkTexture.transformType_, in, info );
+				NifStream( darkTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasDetailTexture, in, version );
+	NifStream( hasDetailTexture, in, info );
 	if ( (hasDetailTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( detailTexture.clampMode, in, version );
-		NifStream( detailTexture.filterMode, in, version );
-		NifStream( detailTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( detailTexture.ps2L, in, version );
-			NifStream( detailTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( detailTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( detailTexture.hasTextureTransform, in, version );
+		NifStream( detailTexture.clampMode, in, info );
+		NifStream( detailTexture.filterMode, in, info );
+		NifStream( detailTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( detailTexture.ps2L, in, info );
+			NifStream( detailTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( detailTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( detailTexture.hasTextureTransform, in, info );
 			if ( (detailTexture.hasTextureTransform != 0) ) {
-				NifStream( detailTexture.translation, in, version );
-				NifStream( detailTexture.tiling, in, version );
-				NifStream( detailTexture.wRotation, in, version );
-				NifStream( detailTexture.transformType_, in, version );
-				NifStream( detailTexture.centerOffset, in, version );
+				NifStream( detailTexture.translation, in, info );
+				NifStream( detailTexture.tiling, in, info );
+				NifStream( detailTexture.wRotation, in, info );
+				NifStream( detailTexture.transformType_, in, info );
+				NifStream( detailTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasGlossTexture, in, version );
+	NifStream( hasGlossTexture, in, info );
 	if ( (hasGlossTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( glossTexture.clampMode, in, version );
-		NifStream( glossTexture.filterMode, in, version );
-		NifStream( glossTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glossTexture.ps2L, in, version );
-			NifStream( glossTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glossTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glossTexture.hasTextureTransform, in, version );
+		NifStream( glossTexture.clampMode, in, info );
+		NifStream( glossTexture.filterMode, in, info );
+		NifStream( glossTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glossTexture.ps2L, in, info );
+			NifStream( glossTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glossTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glossTexture.hasTextureTransform, in, info );
 			if ( (glossTexture.hasTextureTransform != 0) ) {
-				NifStream( glossTexture.translation, in, version );
-				NifStream( glossTexture.tiling, in, version );
-				NifStream( glossTexture.wRotation, in, version );
-				NifStream( glossTexture.transformType_, in, version );
-				NifStream( glossTexture.centerOffset, in, version );
+				NifStream( glossTexture.translation, in, info );
+				NifStream( glossTexture.tiling, in, info );
+				NifStream( glossTexture.wRotation, in, info );
+				NifStream( glossTexture.transformType_, in, info );
+				NifStream( glossTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasGlowTexture, in, version );
+	NifStream( hasGlowTexture, in, info );
 	if ( (hasGlowTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( glowTexture.clampMode, in, version );
-		NifStream( glowTexture.filterMode, in, version );
-		NifStream( glowTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glowTexture.ps2L, in, version );
-			NifStream( glowTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glowTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glowTexture.hasTextureTransform, in, version );
+		NifStream( glowTexture.clampMode, in, info );
+		NifStream( glowTexture.filterMode, in, info );
+		NifStream( glowTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glowTexture.ps2L, in, info );
+			NifStream( glowTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glowTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glowTexture.hasTextureTransform, in, info );
 			if ( (glowTexture.hasTextureTransform != 0) ) {
-				NifStream( glowTexture.translation, in, version );
-				NifStream( glowTexture.tiling, in, version );
-				NifStream( glowTexture.wRotation, in, version );
-				NifStream( glowTexture.transformType_, in, version );
-				NifStream( glowTexture.centerOffset, in, version );
+				NifStream( glowTexture.translation, in, info );
+				NifStream( glowTexture.tiling, in, info );
+				NifStream( glowTexture.wRotation, in, info );
+				NifStream( glowTexture.transformType_, in, info );
+				NifStream( glowTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasBumpMapTexture, in, version );
+	NifStream( hasBumpMapTexture, in, info );
 	if ( (hasBumpMapTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( bumpMapTexture.clampMode, in, version );
-		NifStream( bumpMapTexture.filterMode, in, version );
-		NifStream( bumpMapTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( bumpMapTexture.ps2L, in, version );
-			NifStream( bumpMapTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( bumpMapTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( bumpMapTexture.hasTextureTransform, in, version );
+		NifStream( bumpMapTexture.clampMode, in, info );
+		NifStream( bumpMapTexture.filterMode, in, info );
+		NifStream( bumpMapTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( bumpMapTexture.ps2L, in, info );
+			NifStream( bumpMapTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( bumpMapTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( bumpMapTexture.hasTextureTransform, in, info );
 			if ( (bumpMapTexture.hasTextureTransform != 0) ) {
-				NifStream( bumpMapTexture.translation, in, version );
-				NifStream( bumpMapTexture.tiling, in, version );
-				NifStream( bumpMapTexture.wRotation, in, version );
-				NifStream( bumpMapTexture.transformType_, in, version );
-				NifStream( bumpMapTexture.centerOffset, in, version );
+				NifStream( bumpMapTexture.translation, in, info );
+				NifStream( bumpMapTexture.tiling, in, info );
+				NifStream( bumpMapTexture.wRotation, in, info );
+				NifStream( bumpMapTexture.transformType_, in, info );
+				NifStream( bumpMapTexture.centerOffset, in, info );
 			};
 		};
-		NifStream( bumpMapLumaScale, in, version );
-		NifStream( bumpMapLumaOffset, in, version );
-		NifStream( bumpMapMatrix, in, version );
+		NifStream( bumpMapLumaScale, in, info );
+		NifStream( bumpMapLumaOffset, in, info );
+		NifStream( bumpMapMatrix, in, info );
 	};
-	NifStream( hasDecal0Texture, in, version );
+	NifStream( hasDecal0Texture, in, info );
 	if ( (hasDecal0Texture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal0Texture.clampMode, in, version );
-		NifStream( decal0Texture.filterMode, in, version );
-		NifStream( decal0Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal0Texture.ps2L, in, version );
-			NifStream( decal0Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal0Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal0Texture.hasTextureTransform, in, version );
+		NifStream( decal0Texture.clampMode, in, info );
+		NifStream( decal0Texture.filterMode, in, info );
+		NifStream( decal0Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal0Texture.ps2L, in, info );
+			NifStream( decal0Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal0Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal0Texture.hasTextureTransform, in, info );
 			if ( (decal0Texture.hasTextureTransform != 0) ) {
-				NifStream( decal0Texture.translation, in, version );
-				NifStream( decal0Texture.tiling, in, version );
-				NifStream( decal0Texture.wRotation, in, version );
-				NifStream( decal0Texture.transformType_, in, version );
-				NifStream( decal0Texture.centerOffset, in, version );
+				NifStream( decal0Texture.translation, in, info );
+				NifStream( decal0Texture.tiling, in, info );
+				NifStream( decal0Texture.wRotation, in, info );
+				NifStream( decal0Texture.transformType_, in, info );
+				NifStream( decal0Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 8) ) {
-		NifStream( hasDecal1Texture, in, version );
+		NifStream( hasDecal1Texture, in, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal1Texture.clampMode, in, version );
-		NifStream( decal1Texture.filterMode, in, version );
-		NifStream( decal1Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal1Texture.ps2L, in, version );
-			NifStream( decal1Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal1Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal1Texture.hasTextureTransform, in, version );
+		NifStream( decal1Texture.clampMode, in, info );
+		NifStream( decal1Texture.filterMode, in, info );
+		NifStream( decal1Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal1Texture.ps2L, in, info );
+			NifStream( decal1Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal1Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal1Texture.hasTextureTransform, in, info );
 			if ( (decal1Texture.hasTextureTransform != 0) ) {
-				NifStream( decal1Texture.translation, in, version );
-				NifStream( decal1Texture.tiling, in, version );
-				NifStream( decal1Texture.wRotation, in, version );
-				NifStream( decal1Texture.transformType_, in, version );
-				NifStream( decal1Texture.centerOffset, in, version );
+				NifStream( decal1Texture.translation, in, info );
+				NifStream( decal1Texture.tiling, in, info );
+				NifStream( decal1Texture.wRotation, in, info );
+				NifStream( decal1Texture.transformType_, in, info );
+				NifStream( decal1Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 9) ) {
-		NifStream( hasDecal2Texture, in, version );
+		NifStream( hasDecal2Texture, in, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal2Texture.clampMode, in, version );
-		NifStream( decal2Texture.filterMode, in, version );
-		NifStream( decal2Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal2Texture.ps2L, in, version );
-			NifStream( decal2Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal2Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal2Texture.hasTextureTransform, in, version );
+		NifStream( decal2Texture.clampMode, in, info );
+		NifStream( decal2Texture.filterMode, in, info );
+		NifStream( decal2Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal2Texture.ps2L, in, info );
+			NifStream( decal2Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal2Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal2Texture.hasTextureTransform, in, info );
 			if ( (decal2Texture.hasTextureTransform != 0) ) {
-				NifStream( decal2Texture.translation, in, version );
-				NifStream( decal2Texture.tiling, in, version );
-				NifStream( decal2Texture.wRotation, in, version );
-				NifStream( decal2Texture.transformType_, in, version );
-				NifStream( decal2Texture.centerOffset, in, version );
+				NifStream( decal2Texture.translation, in, info );
+				NifStream( decal2Texture.tiling, in, info );
+				NifStream( decal2Texture.wRotation, in, info );
+				NifStream( decal2Texture.transformType_, in, info );
+				NifStream( decal2Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 10) ) {
-		NifStream( hasDecal3Texture, in, version );
+		NifStream( hasDecal3Texture, in, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal3Texture.clampMode, in, version );
-		NifStream( decal3Texture.filterMode, in, version );
-		NifStream( decal3Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal3Texture.ps2L, in, version );
-			NifStream( decal3Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal3Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal3Texture.hasTextureTransform, in, version );
+		NifStream( decal3Texture.clampMode, in, info );
+		NifStream( decal3Texture.filterMode, in, info );
+		NifStream( decal3Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal3Texture.ps2L, in, info );
+			NifStream( decal3Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal3Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal3Texture.hasTextureTransform, in, info );
 			if ( (decal3Texture.hasTextureTransform != 0) ) {
-				NifStream( decal3Texture.translation, in, version );
-				NifStream( decal3Texture.tiling, in, version );
-				NifStream( decal3Texture.wRotation, in, version );
-				NifStream( decal3Texture.transformType_, in, version );
-				NifStream( decal3Texture.centerOffset, in, version );
+				NifStream( decal3Texture.translation, in, info );
+				NifStream( decal3Texture.tiling, in, info );
+				NifStream( decal3Texture.wRotation, in, info );
+				NifStream( decal3Texture.transformType_, in, info );
+				NifStream( decal3Texture.centerOffset, in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numShaderTextures, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numShaderTextures, in, info );
 		shaderTextures.resize(numShaderTextures);
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
-			NifStream( shaderTextures[i2].isUsed, in, version );
+			NifStream( shaderTextures[i2].isUsed, in, info );
 			if ( (shaderTextures[i2].isUsed != 0) ) {
-				NifStream( block_num, in, version );
+				NifStream( block_num, in, info );
 				link_stack.push_back( block_num );
-				NifStream( shaderTextures[i2].textureData.clampMode, in, version );
-				NifStream( shaderTextures[i2].textureData.filterMode, in, version );
-				NifStream( shaderTextures[i2].textureData.uvSet, in, version );
-				if ( version <= 0x0A020000 ) {
-					NifStream( shaderTextures[i2].textureData.ps2L, in, version );
-					NifStream( shaderTextures[i2].textureData.ps2K, in, version );
+				NifStream( shaderTextures[i2].textureData.clampMode, in, info );
+				NifStream( shaderTextures[i2].textureData.filterMode, in, info );
+				NifStream( shaderTextures[i2].textureData.uvSet, in, info );
+				if ( info.version <= 0x0A020000 ) {
+					NifStream( shaderTextures[i2].textureData.ps2L, in, info );
+					NifStream( shaderTextures[i2].textureData.ps2K, in, info );
 				};
-				if ( version <= 0x0401000C ) {
-					NifStream( shaderTextures[i2].textureData.unknown1, in, version );
+				if ( info.version <= 0x0401000C ) {
+					NifStream( shaderTextures[i2].textureData.unknown1, in, info );
 				};
-				if ( version >= 0x0A010000 ) {
-					NifStream( shaderTextures[i2].textureData.hasTextureTransform, in, version );
+				if ( info.version >= 0x0A010000 ) {
+					NifStream( shaderTextures[i2].textureData.hasTextureTransform, in, info );
 					if ( (shaderTextures[i2].textureData.hasTextureTransform != 0) ) {
-						NifStream( shaderTextures[i2].textureData.translation, in, version );
-						NifStream( shaderTextures[i2].textureData.tiling, in, version );
-						NifStream( shaderTextures[i2].textureData.wRotation, in, version );
-						NifStream( shaderTextures[i2].textureData.transformType_, in, version );
-						NifStream( shaderTextures[i2].textureData.centerOffset, in, version );
+						NifStream( shaderTextures[i2].textureData.translation, in, info );
+						NifStream( shaderTextures[i2].textureData.tiling, in, info );
+						NifStream( shaderTextures[i2].textureData.wRotation, in, info );
+						NifStream( shaderTextures[i2].textureData.transformType_, in, info );
+						NifStream( shaderTextures[i2].textureData.centerOffset, in, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, in, version );
+				NifStream( shaderTextures[i2].unknownInt, in, info );
 			};
 		};
 	};
 }
 
-void NiTexturingProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
+void NiTexturingProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
 	numShaderTextures = (unsigned int)(shaderTextures.size());
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( applyMode, out, version );
-	NifStream( textureCount, out, version );
-	NifStream( hasBaseTexture, out, version );
+	NifStream( applyMode, out, info );
+	NifStream( textureCount, out, info );
+	NifStream( hasBaseTexture, out, info );
 	if ( (hasBaseTexture != 0) ) {
 		if ( baseTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(baseTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(baseTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( baseTexture.clampMode, out, version );
-		NifStream( baseTexture.filterMode, out, version );
-		NifStream( baseTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( baseTexture.ps2L, out, version );
-			NifStream( baseTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( baseTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( baseTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( baseTexture.clampMode, out, info );
+		NifStream( baseTexture.filterMode, out, info );
+		NifStream( baseTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( baseTexture.ps2L, out, info );
+			NifStream( baseTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( baseTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( baseTexture.hasTextureTransform, out, info );
 			if ( (baseTexture.hasTextureTransform != 0) ) {
-				NifStream( baseTexture.translation, out, version );
-				NifStream( baseTexture.tiling, out, version );
-				NifStream( baseTexture.wRotation, out, version );
-				NifStream( baseTexture.transformType_, out, version );
-				NifStream( baseTexture.centerOffset, out, version );
+				NifStream( baseTexture.translation, out, info );
+				NifStream( baseTexture.tiling, out, info );
+				NifStream( baseTexture.wRotation, out, info );
+				NifStream( baseTexture.transformType_, out, info );
+				NifStream( baseTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasDarkTexture, out, version );
+	NifStream( hasDarkTexture, out, info );
 	if ( (hasDarkTexture != 0) ) {
 		if ( darkTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(darkTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(darkTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( darkTexture.clampMode, out, version );
-		NifStream( darkTexture.filterMode, out, version );
-		NifStream( darkTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( darkTexture.ps2L, out, version );
-			NifStream( darkTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( darkTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( darkTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( darkTexture.clampMode, out, info );
+		NifStream( darkTexture.filterMode, out, info );
+		NifStream( darkTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( darkTexture.ps2L, out, info );
+			NifStream( darkTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( darkTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( darkTexture.hasTextureTransform, out, info );
 			if ( (darkTexture.hasTextureTransform != 0) ) {
-				NifStream( darkTexture.translation, out, version );
-				NifStream( darkTexture.tiling, out, version );
-				NifStream( darkTexture.wRotation, out, version );
-				NifStream( darkTexture.transformType_, out, version );
-				NifStream( darkTexture.centerOffset, out, version );
+				NifStream( darkTexture.translation, out, info );
+				NifStream( darkTexture.tiling, out, info );
+				NifStream( darkTexture.wRotation, out, info );
+				NifStream( darkTexture.transformType_, out, info );
+				NifStream( darkTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasDetailTexture, out, version );
+	NifStream( hasDetailTexture, out, info );
 	if ( (hasDetailTexture != 0) ) {
 		if ( detailTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(detailTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(detailTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( detailTexture.clampMode, out, version );
-		NifStream( detailTexture.filterMode, out, version );
-		NifStream( detailTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( detailTexture.ps2L, out, version );
-			NifStream( detailTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( detailTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( detailTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( detailTexture.clampMode, out, info );
+		NifStream( detailTexture.filterMode, out, info );
+		NifStream( detailTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( detailTexture.ps2L, out, info );
+			NifStream( detailTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( detailTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( detailTexture.hasTextureTransform, out, info );
 			if ( (detailTexture.hasTextureTransform != 0) ) {
-				NifStream( detailTexture.translation, out, version );
-				NifStream( detailTexture.tiling, out, version );
-				NifStream( detailTexture.wRotation, out, version );
-				NifStream( detailTexture.transformType_, out, version );
-				NifStream( detailTexture.centerOffset, out, version );
+				NifStream( detailTexture.translation, out, info );
+				NifStream( detailTexture.tiling, out, info );
+				NifStream( detailTexture.wRotation, out, info );
+				NifStream( detailTexture.transformType_, out, info );
+				NifStream( detailTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasGlossTexture, out, version );
+	NifStream( hasGlossTexture, out, info );
 	if ( (hasGlossTexture != 0) ) {
 		if ( glossTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(glossTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(glossTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( glossTexture.clampMode, out, version );
-		NifStream( glossTexture.filterMode, out, version );
-		NifStream( glossTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glossTexture.ps2L, out, version );
-			NifStream( glossTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glossTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glossTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( glossTexture.clampMode, out, info );
+		NifStream( glossTexture.filterMode, out, info );
+		NifStream( glossTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glossTexture.ps2L, out, info );
+			NifStream( glossTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glossTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glossTexture.hasTextureTransform, out, info );
 			if ( (glossTexture.hasTextureTransform != 0) ) {
-				NifStream( glossTexture.translation, out, version );
-				NifStream( glossTexture.tiling, out, version );
-				NifStream( glossTexture.wRotation, out, version );
-				NifStream( glossTexture.transformType_, out, version );
-				NifStream( glossTexture.centerOffset, out, version );
+				NifStream( glossTexture.translation, out, info );
+				NifStream( glossTexture.tiling, out, info );
+				NifStream( glossTexture.wRotation, out, info );
+				NifStream( glossTexture.transformType_, out, info );
+				NifStream( glossTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasGlowTexture, out, version );
+	NifStream( hasGlowTexture, out, info );
 	if ( (hasGlowTexture != 0) ) {
 		if ( glowTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(glowTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(glowTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( glowTexture.clampMode, out, version );
-		NifStream( glowTexture.filterMode, out, version );
-		NifStream( glowTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glowTexture.ps2L, out, version );
-			NifStream( glowTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glowTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glowTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( glowTexture.clampMode, out, info );
+		NifStream( glowTexture.filterMode, out, info );
+		NifStream( glowTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glowTexture.ps2L, out, info );
+			NifStream( glowTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glowTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glowTexture.hasTextureTransform, out, info );
 			if ( (glowTexture.hasTextureTransform != 0) ) {
-				NifStream( glowTexture.translation, out, version );
-				NifStream( glowTexture.tiling, out, version );
-				NifStream( glowTexture.wRotation, out, version );
-				NifStream( glowTexture.transformType_, out, version );
-				NifStream( glowTexture.centerOffset, out, version );
+				NifStream( glowTexture.translation, out, info );
+				NifStream( glowTexture.tiling, out, info );
+				NifStream( glowTexture.wRotation, out, info );
+				NifStream( glowTexture.transformType_, out, info );
+				NifStream( glowTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasBumpMapTexture, out, version );
+	NifStream( hasBumpMapTexture, out, info );
 	if ( (hasBumpMapTexture != 0) ) {
 		if ( bumpMapTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bumpMapTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bumpMapTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( bumpMapTexture.clampMode, out, version );
-		NifStream( bumpMapTexture.filterMode, out, version );
-		NifStream( bumpMapTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( bumpMapTexture.ps2L, out, version );
-			NifStream( bumpMapTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( bumpMapTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( bumpMapTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( bumpMapTexture.clampMode, out, info );
+		NifStream( bumpMapTexture.filterMode, out, info );
+		NifStream( bumpMapTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( bumpMapTexture.ps2L, out, info );
+			NifStream( bumpMapTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( bumpMapTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( bumpMapTexture.hasTextureTransform, out, info );
 			if ( (bumpMapTexture.hasTextureTransform != 0) ) {
-				NifStream( bumpMapTexture.translation, out, version );
-				NifStream( bumpMapTexture.tiling, out, version );
-				NifStream( bumpMapTexture.wRotation, out, version );
-				NifStream( bumpMapTexture.transformType_, out, version );
-				NifStream( bumpMapTexture.centerOffset, out, version );
+				NifStream( bumpMapTexture.translation, out, info );
+				NifStream( bumpMapTexture.tiling, out, info );
+				NifStream( bumpMapTexture.wRotation, out, info );
+				NifStream( bumpMapTexture.transformType_, out, info );
+				NifStream( bumpMapTexture.centerOffset, out, info );
 			};
 		};
-		NifStream( bumpMapLumaScale, out, version );
-		NifStream( bumpMapLumaOffset, out, version );
-		NifStream( bumpMapMatrix, out, version );
+		NifStream( bumpMapLumaScale, out, info );
+		NifStream( bumpMapLumaOffset, out, info );
+		NifStream( bumpMapMatrix, out, info );
 	};
-	NifStream( hasDecal0Texture, out, version );
+	NifStream( hasDecal0Texture, out, info );
 	if ( (hasDecal0Texture != 0) ) {
 		if ( decal0Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal0Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal0Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal0Texture.clampMode, out, version );
-		NifStream( decal0Texture.filterMode, out, version );
-		NifStream( decal0Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal0Texture.ps2L, out, version );
-			NifStream( decal0Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal0Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal0Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal0Texture.clampMode, out, info );
+		NifStream( decal0Texture.filterMode, out, info );
+		NifStream( decal0Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal0Texture.ps2L, out, info );
+			NifStream( decal0Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal0Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal0Texture.hasTextureTransform, out, info );
 			if ( (decal0Texture.hasTextureTransform != 0) ) {
-				NifStream( decal0Texture.translation, out, version );
-				NifStream( decal0Texture.tiling, out, version );
-				NifStream( decal0Texture.wRotation, out, version );
-				NifStream( decal0Texture.transformType_, out, version );
-				NifStream( decal0Texture.centerOffset, out, version );
+				NifStream( decal0Texture.translation, out, info );
+				NifStream( decal0Texture.tiling, out, info );
+				NifStream( decal0Texture.wRotation, out, info );
+				NifStream( decal0Texture.transformType_, out, info );
+				NifStream( decal0Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 8) ) {
-		NifStream( hasDecal1Texture, out, version );
+		NifStream( hasDecal1Texture, out, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
 		if ( decal1Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal1Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal1Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal1Texture.clampMode, out, version );
-		NifStream( decal1Texture.filterMode, out, version );
-		NifStream( decal1Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal1Texture.ps2L, out, version );
-			NifStream( decal1Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal1Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal1Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal1Texture.clampMode, out, info );
+		NifStream( decal1Texture.filterMode, out, info );
+		NifStream( decal1Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal1Texture.ps2L, out, info );
+			NifStream( decal1Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal1Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal1Texture.hasTextureTransform, out, info );
 			if ( (decal1Texture.hasTextureTransform != 0) ) {
-				NifStream( decal1Texture.translation, out, version );
-				NifStream( decal1Texture.tiling, out, version );
-				NifStream( decal1Texture.wRotation, out, version );
-				NifStream( decal1Texture.transformType_, out, version );
-				NifStream( decal1Texture.centerOffset, out, version );
+				NifStream( decal1Texture.translation, out, info );
+				NifStream( decal1Texture.tiling, out, info );
+				NifStream( decal1Texture.wRotation, out, info );
+				NifStream( decal1Texture.transformType_, out, info );
+				NifStream( decal1Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 9) ) {
-		NifStream( hasDecal2Texture, out, version );
+		NifStream( hasDecal2Texture, out, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
 		if ( decal2Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal2Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal2Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal2Texture.clampMode, out, version );
-		NifStream( decal2Texture.filterMode, out, version );
-		NifStream( decal2Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal2Texture.ps2L, out, version );
-			NifStream( decal2Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal2Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal2Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal2Texture.clampMode, out, info );
+		NifStream( decal2Texture.filterMode, out, info );
+		NifStream( decal2Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal2Texture.ps2L, out, info );
+			NifStream( decal2Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal2Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal2Texture.hasTextureTransform, out, info );
 			if ( (decal2Texture.hasTextureTransform != 0) ) {
-				NifStream( decal2Texture.translation, out, version );
-				NifStream( decal2Texture.tiling, out, version );
-				NifStream( decal2Texture.wRotation, out, version );
-				NifStream( decal2Texture.transformType_, out, version );
-				NifStream( decal2Texture.centerOffset, out, version );
+				NifStream( decal2Texture.translation, out, info );
+				NifStream( decal2Texture.tiling, out, info );
+				NifStream( decal2Texture.wRotation, out, info );
+				NifStream( decal2Texture.transformType_, out, info );
+				NifStream( decal2Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 10) ) {
-		NifStream( hasDecal3Texture, out, version );
+		NifStream( hasDecal3Texture, out, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
 		if ( decal3Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal3Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal3Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal3Texture.clampMode, out, version );
-		NifStream( decal3Texture.filterMode, out, version );
-		NifStream( decal3Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal3Texture.ps2L, out, version );
-			NifStream( decal3Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal3Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal3Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal3Texture.clampMode, out, info );
+		NifStream( decal3Texture.filterMode, out, info );
+		NifStream( decal3Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal3Texture.ps2L, out, info );
+			NifStream( decal3Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal3Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal3Texture.hasTextureTransform, out, info );
 			if ( (decal3Texture.hasTextureTransform != 0) ) {
-				NifStream( decal3Texture.translation, out, version );
-				NifStream( decal3Texture.tiling, out, version );
-				NifStream( decal3Texture.wRotation, out, version );
-				NifStream( decal3Texture.transformType_, out, version );
-				NifStream( decal3Texture.centerOffset, out, version );
+				NifStream( decal3Texture.translation, out, info );
+				NifStream( decal3Texture.tiling, out, info );
+				NifStream( decal3Texture.wRotation, out, info );
+				NifStream( decal3Texture.transformType_, out, info );
+				NifStream( decal3Texture.centerOffset, out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numShaderTextures, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numShaderTextures, out, info );
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
-			NifStream( shaderTextures[i2].isUsed, out, version );
+			NifStream( shaderTextures[i2].isUsed, out, info );
 			if ( (shaderTextures[i2].isUsed != 0) ) {
 				if ( shaderTextures[i2].textureData.source != NULL )
-					NifStream( link_map.find( StaticCast<NiObject>(shaderTextures[i2].textureData.source) )->second, out, version );
+					NifStream( link_map.find( StaticCast<NiObject>(shaderTextures[i2].textureData.source) )->second, out, info );
 				else
-					NifStream( 0xffffffff, out, version );
-				NifStream( shaderTextures[i2].textureData.clampMode, out, version );
-				NifStream( shaderTextures[i2].textureData.filterMode, out, version );
-				NifStream( shaderTextures[i2].textureData.uvSet, out, version );
-				if ( version <= 0x0A020000 ) {
-					NifStream( shaderTextures[i2].textureData.ps2L, out, version );
-					NifStream( shaderTextures[i2].textureData.ps2K, out, version );
+					NifStream( 0xffffffff, out, info );
+				NifStream( shaderTextures[i2].textureData.clampMode, out, info );
+				NifStream( shaderTextures[i2].textureData.filterMode, out, info );
+				NifStream( shaderTextures[i2].textureData.uvSet, out, info );
+				if ( info.version <= 0x0A020000 ) {
+					NifStream( shaderTextures[i2].textureData.ps2L, out, info );
+					NifStream( shaderTextures[i2].textureData.ps2K, out, info );
 				};
-				if ( version <= 0x0401000C ) {
-					NifStream( shaderTextures[i2].textureData.unknown1, out, version );
+				if ( info.version <= 0x0401000C ) {
+					NifStream( shaderTextures[i2].textureData.unknown1, out, info );
 				};
-				if ( version >= 0x0A010000 ) {
-					NifStream( shaderTextures[i2].textureData.hasTextureTransform, out, version );
+				if ( info.version >= 0x0A010000 ) {
+					NifStream( shaderTextures[i2].textureData.hasTextureTransform, out, info );
 					if ( (shaderTextures[i2].textureData.hasTextureTransform != 0) ) {
-						NifStream( shaderTextures[i2].textureData.translation, out, version );
-						NifStream( shaderTextures[i2].textureData.tiling, out, version );
-						NifStream( shaderTextures[i2].textureData.wRotation, out, version );
-						NifStream( shaderTextures[i2].textureData.transformType_, out, version );
-						NifStream( shaderTextures[i2].textureData.centerOffset, out, version );
+						NifStream( shaderTextures[i2].textureData.translation, out, info );
+						NifStream( shaderTextures[i2].textureData.tiling, out, info );
+						NifStream( shaderTextures[i2].textureData.wRotation, out, info );
+						NifStream( shaderTextures[i2].textureData.transformType_, out, info );
+						NifStream( shaderTextures[i2].textureData.centerOffset, out, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, out, version );
+				NifStream( shaderTextures[i2].unknownInt, out, info );
 			};
 		};
 	};
@@ -12598,42 +12598,42 @@ std::string NiTexturingProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTexturingProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiTexturingProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 	if ( (hasBaseTexture != 0) ) {
-		baseTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		baseTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDarkTexture != 0) ) {
-		darkTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		darkTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDetailTexture != 0) ) {
-		detailTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		detailTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasGlossTexture != 0) ) {
-		glossTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		glossTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasGlowTexture != 0) ) {
-		glowTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		glowTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasBumpMapTexture != 0) ) {
-		bumpMapTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		bumpMapTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDecal0Texture != 0) ) {
-		decal0Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal0Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
-		decal1Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal1Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
-		decal2Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal2Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
-		decal3Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal3Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
 			if ( (shaderTextures[i2].isUsed != 0) ) {
-				shaderTextures[i2].textureData.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+				shaderTextures[i2].textureData.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 			};
 		};
 	};
@@ -12669,12 +12669,12 @@ std::list<NiObjectRef> NiTexturingProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
+void NiTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::Read( in, link_stack, info );
 }
 
-void NiTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
+void NiTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
 }
 
 std::string NiTransformController::InternalAsString( bool verbose ) const {
@@ -12684,8 +12684,8 @@ std::string NiTransformController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void NiTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformController::InternalGetRefs() const {
@@ -12694,12 +12694,12 @@ std::list<NiObjectRef> NiTransformController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeData::Read( in, link_stack, version, user_version );
+void NiTransformData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeData::Read( in, link_stack, info );
 }
 
-void NiTransformData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiKeyframeData::Write( out, link_map, version, user_version );
+void NiTransformData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiKeyframeData::Write( out, link_map, info );
 }
 
 std::string NiTransformData::InternalAsString( bool verbose ) const {
@@ -12709,8 +12709,8 @@ std::string NiTransformData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeData::FixLinks( objects, link_stack, version, user_version );
+void NiTransformData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformData::InternalGetRefs() const {
@@ -12719,35 +12719,35 @@ std::list<NiObjectRef> NiTransformData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( unknownBytes[i2], in, version );
+			NifStream( unknownBytes[i2], in, info );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+void NiTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( unknownBytes[i2], out, version );
+			NifStream( unknownBytes[i2], out, info );
 		};
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -12773,9 +12773,9 @@ std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiTransformData>( objects, link_stack, version );
+void NiTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiTransformData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformInterpolator::InternalGetRefs() const {
@@ -12786,12 +12786,12 @@ std::list<NiObjectRef> NiTransformInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiTriShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiTriShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiTriShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiTriShape::InternalAsString( bool verbose ) const {
@@ -12801,8 +12801,8 @@ std::string NiTriShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiTriShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriShape::InternalGetRefs() const {
@@ -12811,62 +12811,62 @@ std::list<NiObjectRef> NiTriShape::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriShapeData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( numTrianglePoints, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasTriangles, in, version );
+void NiTriShapeData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( numTrianglePoints, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasTriangles, in, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		triangles.resize(numTriangles);
 		for (unsigned int i2 = 0; i2 < triangles.size(); i2++) {
-			NifStream( triangles[i2], in, version );
+			NifStream( triangles[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasTriangles != 0) ) {
 			triangles.resize(numTriangles);
 			for (unsigned int i3 = 0; i3 < triangles.size(); i3++) {
-				NifStream( triangles[i3], in, version );
+				NifStream( triangles[i3], in, info );
 			};
 		};
 	};
-	NifStream( numMatchGroups, in, version );
+	NifStream( numMatchGroups, in, info );
 	matchGroups.resize(numMatchGroups);
 	for (unsigned int i1 = 0; i1 < matchGroups.size(); i1++) {
-		NifStream( matchGroups[i1].numVertices, in, version );
+		NifStream( matchGroups[i1].numVertices, in, info );
 		matchGroups[i1].vertexIndices.resize(matchGroups[i1].numVertices);
 		for (unsigned int i2 = 0; i2 < matchGroups[i1].vertexIndices.size(); i2++) {
-			NifStream( matchGroups[i1].vertexIndices[i2], in, version );
+			NifStream( matchGroups[i1].vertexIndices[i2], in, info );
 		};
 	};
 }
 
-void NiTriShapeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiTriShapeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	numMatchGroups = (unsigned short)(matchGroups.size());
-	NifStream( numTrianglePoints, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasTriangles, out, version );
+	NifStream( numTrianglePoints, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasTriangles, out, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		for (unsigned int i2 = 0; i2 < triangles.size(); i2++) {
-			NifStream( triangles[i2], out, version );
+			NifStream( triangles[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasTriangles != 0) ) {
 			for (unsigned int i3 = 0; i3 < triangles.size(); i3++) {
-				NifStream( triangles[i3], out, version );
+				NifStream( triangles[i3], out, info );
 			};
 		};
 	};
-	NifStream( numMatchGroups, out, version );
+	NifStream( numMatchGroups, out, info );
 	for (unsigned int i1 = 0; i1 < matchGroups.size(); i1++) {
 		matchGroups[i1].numVertices = (unsigned short)(matchGroups[i1].vertexIndices.size());
-		NifStream( matchGroups[i1].numVertices, out, version );
+		NifStream( matchGroups[i1].numVertices, out, info );
 		for (unsigned int i2 = 0; i2 < matchGroups[i1].vertexIndices.size(); i2++) {
-			NifStream( matchGroups[i1].vertexIndices[i2], out, version );
+			NifStream( matchGroups[i1].vertexIndices[i2], out, info );
 		};
 	};
 }
@@ -12915,8 +12915,8 @@ std::string NiTriShapeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShapeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiTriShapeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriShapeData::InternalGetRefs() const {
@@ -12925,12 +12925,12 @@ std::list<NiObjectRef> NiTriShapeData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriStrips::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiTriStrips::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiTriStrips::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiTriStrips::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiTriStrips::InternalAsString( bool verbose ) const {
@@ -12940,8 +12940,8 @@ std::string NiTriStrips::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStrips::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiTriStrips::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriStrips::InternalGetRefs() const {
@@ -12950,62 +12950,62 @@ std::list<NiObjectRef> NiTriStrips::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( numStrips, in, version );
+void NiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( numStrips, in, info );
 	stripLengths.resize(numStrips);
 	for (unsigned int i1 = 0; i1 < stripLengths.size(); i1++) {
-		NifStream( stripLengths[i1], in, version );
+		NifStream( stripLengths[i1], in, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasPoints, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasPoints, in, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		points.resize(numStrips);
 		for (unsigned int i2 = 0; i2 < points.size(); i2++) {
 			points[i2].resize(stripLengths[i2]);
 			for (unsigned int i3 = 0; i3 < stripLengths[i2]; i3++) {
-				NifStream( points[i2][i3], in, version );
+				NifStream( points[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasPoints != 0) ) {
 			points.resize(numStrips);
 			for (unsigned int i3 = 0; i3 < points.size(); i3++) {
 				points[i3].resize(stripLengths[i3]);
 				for (unsigned int i4 = 0; i4 < stripLengths[i3]; i4++) {
-					NifStream( points[i3][i4], in, version );
+					NifStream( points[i3][i4], in, info );
 				};
 			};
 		};
 	};
 }
 
-void NiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < points.size(); i1++)
 		stripLengths[i1] = (unsigned short)(points[i1].size());
 	numStrips = (unsigned short)(stripLengths.size());
-	NifStream( numStrips, out, version );
+	NifStream( numStrips, out, info );
 	for (unsigned int i1 = 0; i1 < stripLengths.size(); i1++) {
-		NifStream( stripLengths[i1], out, version );
+		NifStream( stripLengths[i1], out, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasPoints, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasPoints, out, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		for (unsigned int i2 = 0; i2 < points.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < stripLengths[i2]; i3++) {
-				NifStream( points[i2][i3], out, version );
+				NifStream( points[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasPoints != 0) ) {
 			for (unsigned int i3 = 0; i3 < points.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < stripLengths[i3]; i4++) {
-					NifStream( points[i3][i4], out, version );
+					NifStream( points[i3][i4], out, info );
 				};
 			};
 		};
@@ -13050,8 +13050,8 @@ std::string NiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriStripsData::InternalGetRefs() const {
@@ -13060,12 +13060,12 @@ std::list<NiObjectRef> NiTriStripsData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClod::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiClod::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiClod::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiClod::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiClod::InternalAsString( bool verbose ) const {
@@ -13075,8 +13075,8 @@ std::string NiClod::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClod::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiClod::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClod::InternalGetRefs() const {
@@ -13085,54 +13085,54 @@ std::list<NiObjectRef> NiClod::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClodData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( unknownShorts, in, version );
-	NifStream( unknownCount1, in, version );
-	NifStream( unknownCount2, in, version );
-	NifStream( unknownCount3, in, version );
-	NifStream( unknownFloat, in, version );
-	NifStream( unknownShort, in, version );
+void NiClodData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( unknownShorts, in, info );
+	NifStream( unknownCount1, in, info );
+	NifStream( unknownCount2, in, info );
+	NifStream( unknownCount3, in, info );
+	NifStream( unknownFloat, in, info );
+	NifStream( unknownShort, in, info );
 	unknownClodShorts1.resize(unknownCount1);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts1[i1][i2], in, version );
+			NifStream( unknownClodShorts1[i1][i2], in, info );
 		};
 	};
 	unknownClodShorts2.resize(unknownCount2);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts2.size(); i1++) {
-		NifStream( unknownClodShorts2[i1], in, version );
+		NifStream( unknownClodShorts2[i1], in, info );
 	};
 	unknownClodShorts3.resize(unknownCount3);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts3.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts3[i1][i2], in, version );
+			NifStream( unknownClodShorts3[i1][i2], in, info );
 		};
 	};
 }
 
-void NiClodData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiClodData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	unknownCount3 = (unsigned short)(unknownClodShorts3.size());
 	unknownCount2 = (unsigned short)(unknownClodShorts2.size());
 	unknownCount1 = (unsigned short)(unknownClodShorts1.size());
-	NifStream( unknownShorts, out, version );
-	NifStream( unknownCount1, out, version );
-	NifStream( unknownCount2, out, version );
-	NifStream( unknownCount3, out, version );
-	NifStream( unknownFloat, out, version );
-	NifStream( unknownShort, out, version );
+	NifStream( unknownShorts, out, info );
+	NifStream( unknownCount1, out, info );
+	NifStream( unknownCount2, out, info );
+	NifStream( unknownCount3, out, info );
+	NifStream( unknownFloat, out, info );
+	NifStream( unknownShort, out, info );
 	for (unsigned int i1 = 0; i1 < unknownClodShorts1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts1[i1][i2], out, version );
+			NifStream( unknownClodShorts1[i1][i2], out, info );
 		};
 	};
 	for (unsigned int i1 = 0; i1 < unknownClodShorts2.size(); i1++) {
-		NifStream( unknownClodShorts2[i1], out, version );
+		NifStream( unknownClodShorts2[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < unknownClodShorts3.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts3[i1][i2], out, version );
+			NifStream( unknownClodShorts3[i1][i2], out, info );
 		};
 	};
 }
@@ -13193,8 +13193,8 @@ std::string NiClodData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClodData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiClodData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClodData::InternalGetRefs() const {
@@ -13203,21 +13203,21 @@ std::list<NiObjectRef> NiClodData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiUVController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiUVController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
+void NiUVController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiUVController::InternalAsString( bool verbose ) const {
@@ -13229,9 +13229,9 @@ std::string NiUVController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiUVData>( objects, link_stack, version );
+void NiUVController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiUVData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiUVController::InternalGetRefs() const {
@@ -13242,30 +13242,30 @@ std::list<NiObjectRef> NiUVController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiUVData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiUVData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( uvGroups[i1].numKeys, in, version );
+		NifStream( uvGroups[i1].numKeys, in, info );
 		if ( (uvGroups[i1].numKeys != 0) ) {
-			NifStream( uvGroups[i1].interpolation, in, version );
+			NifStream( uvGroups[i1].interpolation, in, info );
 		};
 		uvGroups[i1].keys.resize(uvGroups[i1].numKeys);
 		for (unsigned int i2 = 0; i2 < uvGroups[i1].keys.size(); i2++) {
-			NifStream( uvGroups[i1].keys[i2], in, version, uvGroups[i1].interpolation );
+			NifStream( uvGroups[i1].keys[i2], in, info, uvGroups[i1].interpolation );
 		};
 	};
 }
 
-void NiUVData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiUVData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
 		uvGroups[i1].numKeys = (unsigned int)(uvGroups[i1].keys.size());
-		NifStream( uvGroups[i1].numKeys, out, version );
+		NifStream( uvGroups[i1].numKeys, out, info );
 		if ( (uvGroups[i1].numKeys != 0) ) {
-			NifStream( uvGroups[i1].interpolation, out, version );
+			NifStream( uvGroups[i1].interpolation, out, info );
 		};
 		for (unsigned int i2 = 0; i2 < uvGroups[i1].keys.size(); i2++) {
-			NifStream( uvGroups[i1].keys[i2], out, version, uvGroups[i1].interpolation );
+			NifStream( uvGroups[i1].keys[i2], out, info, uvGroups[i1].interpolation );
 		};
 	};
 }
@@ -13301,8 +13301,8 @@ std::string NiUVData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiUVData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiUVData::InternalGetRefs() const {
@@ -13311,16 +13311,16 @@ std::list<NiObjectRef> NiUVData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVectorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( vectorData, in, version );
-	NifStream( unknownFloat, in, version );
+void NiVectorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( vectorData, in, info );
+	NifStream( unknownFloat, in, info );
 }
 
-void NiVectorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( vectorData, out, version );
-	NifStream( unknownFloat, out, version );
+void NiVectorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( vectorData, out, info );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
@@ -13332,8 +13332,8 @@ std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVectorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiVectorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVectorExtraData::InternalGetRefs() const {
@@ -13342,18 +13342,18 @@ std::list<NiObjectRef> NiVectorExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVertexColorProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( vertexMode, in, version );
-	NifStream( lightingMode, in, version );
+void NiVertexColorProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( vertexMode, in, info );
+	NifStream( lightingMode, in, info );
 }
 
-void NiVertexColorProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( vertexMode, out, version );
-	NifStream( lightingMode, out, version );
+void NiVertexColorProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( vertexMode, out, info );
+	NifStream( lightingMode, out, info );
 }
 
 std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
@@ -13366,8 +13366,8 @@ std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertexColorProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiVertexColorProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVertexColorProperty::InternalGetRefs() const {
@@ -13376,23 +13376,23 @@ std::list<NiObjectRef> NiVertexColorProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVertWeightsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numBytes, in, version );
-	NifStream( numVertices, in, version );
+void NiVertWeightsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numBytes, in, info );
+	NifStream( numVertices, in, info );
 	weight.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < weight.size(); i1++) {
-		NifStream( weight[i1], in, version );
+		NifStream( weight[i1], in, info );
 	};
 }
 
-void NiVertWeightsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiVertWeightsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numVertices = (unsigned short)(weight.size());
-	NifStream( numBytes, out, version );
-	NifStream( numVertices, out, version );
+	NifStream( numBytes, out, info );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < weight.size(); i1++) {
-		NifStream( weight[i1], out, version );
+		NifStream( weight[i1], out, info );
 	};
 }
 
@@ -13418,8 +13418,8 @@ std::string NiVertWeightsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertWeightsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiVertWeightsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVertWeightsExtraData::InternalGetRefs() const {
@@ -13428,22 +13428,22 @@ std::list<NiObjectRef> NiVertWeightsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVisController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiVisController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiVisController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -13455,10 +13455,10 @@ std::string NiVisController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiVisData>( objects, link_stack, version );
+void NiVisController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiVisData>( objects, link_stack, info );
 	};
 }
 
@@ -13470,21 +13470,21 @@ std::list<NiObjectRef> NiVisController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVisData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( numVisKeys, in, version );
+void NiVisData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( numVisKeys, in, info );
 	visKeys.resize(numVisKeys);
 	for (unsigned int i1 = 0; i1 < visKeys.size(); i1++) {
-		NifStream( visKeys[i1], in, version, 1 );
+		NifStream( visKeys[i1], in, info, 1 );
 	};
 }
 
-void NiVisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiVisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	numVisKeys = (unsigned int)(visKeys.size());
-	NifStream( numVisKeys, out, version );
+	NifStream( numVisKeys, out, info );
 	for (unsigned int i1 = 0; i1 < visKeys.size(); i1++) {
-		NifStream( visKeys[i1], out, version, 1 );
+		NifStream( visKeys[i1], out, info, 1 );
 	};
 }
 
@@ -13509,8 +13509,8 @@ std::string NiVisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiVisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVisData::InternalGetRefs() const {
@@ -13519,14 +13519,14 @@ std::list<NiObjectRef> NiVisData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiWireframeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiWireframeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiWireframeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiWireframeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
@@ -13537,8 +13537,8 @@ std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiWireframeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiWireframeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiWireframeProperty::InternalGetRefs() const {
@@ -13547,19 +13547,19 @@ std::list<NiObjectRef> NiWireframeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiZBufferProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	if ( version >= 0x0401000C ) {
-		NifStream( function, in, version );
+void NiZBufferProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	if ( info.version >= 0x0401000C ) {
+		NifStream( function, in, info );
 	};
 }
 
-void NiZBufferProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	if ( version >= 0x0401000C ) {
-		NifStream( function, out, version );
+void NiZBufferProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	if ( info.version >= 0x0401000C ) {
+		NifStream( function, out, info );
 	};
 }
 
@@ -13572,8 +13572,8 @@ std::string NiZBufferProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiZBufferProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiZBufferProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiZBufferProperty::InternalGetRefs() const {
@@ -13582,12 +13582,12 @@ std::list<NiObjectRef> NiZBufferProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void RootCollisionNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void RootCollisionNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void RootCollisionNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void RootCollisionNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string RootCollisionNode::InternalAsString( bool verbose ) const {
@@ -13597,8 +13597,8 @@ std::string RootCollisionNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void RootCollisionNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void RootCollisionNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> RootCollisionNode::InternalGetRefs() const {
diff --git a/src/niflib.cpp b/src/niflib.cpp
index 273f9a57bbec6993de50d90909d0b5ad3e6b65e3..a8592a774db6d18f59e8317ca795d813973d8513 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -128,10 +128,10 @@ unsigned int GetNifVersion( string const & file_name ) {
 	//--Read Header String--//
 
 	HeaderString header;
-	unsigned version;
-	NifStream( header, in, version );
+	NifInfo info;
+	NifStream( header, in, info );
 
-	return version;
+	return info.version;
 }
 
 vector<NiObjectRef> ReadNifList( string const & file_name, NifInfo * info ) {
@@ -148,23 +148,28 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 	//--Read Header--//
 	Header header;
 
+	//Create a new NifInfo if one isn't given.
+	bool delete_info = false;
+	if ( info == NULL ) {
+		info = new NifInfo();
+		delete_info = true;
+	}
+
 	//Read header.
-	header.Read( in );
+	*info = header.Read( in );
 
 	//If NifInfo structure is provided, fill it with info from header
-	if ( info != NULL ) {
-		info->version = header.version;
-		info->userVersion = header.userVersion;
-		info->userVersion2 = header.userVersion2;
-		if ( header.endianType == 0) {
-			info->endian = NifInfo::INFO_BIG_ENDIAN;
-		} else {
-			info->endian = NifInfo::INFO_LITTLE_ENDIAN;
-		}
-		info->creator = header.creator.str;
-		info->exportInfo1 = header.exportInfo1.str;
-		info->exportInfo2 = header.exportInfo2.str;
+	info->version = header.version;
+	info->userVersion = header.userVersion;
+	info->userVersion2 = header.userVersion2;
+	if ( header.endianType == 0) {
+		info->endian = BIG_ENDIAN;
+	} else {
+		info->endian = LITTLE_ENDIAN;
 	}
+	info->creator = header.creator.str;
+	info->exportInfo1 = header.exportInfo1.str;
+	info->exportInfo2 = header.exportInfo2.str;
 
 #ifdef DEBUG_HEADER_FOOTER
 	//Print debug output for header
@@ -305,7 +310,7 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 		}
 
 		//Read new object
-		new_obj->Read( in, link_stack, header.version, header.userVersion );
+		new_obj->Read( in, link_stack, *info );
 		objects[index] = new_obj;
 			
 #ifdef PRINT_OBJECT_CONTENTS
@@ -324,7 +329,7 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 
 	//--Read Footer--//
 	Footer footer;
-	footer.Read( in, link_stack, header.version, header.userVersion );
+	footer.Read( in, link_stack, *info );
 
 #ifdef DEBUG_HEADER_FOOTER
 	//Print footer debug output
@@ -356,12 +361,17 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 		cout << it->first << ":  " << it->second << endl;
 #endif
 		//Fix links & other pre-processing
-		it->second->FixLinks( objects, link_stack, header.version, header.userVersion );
+		it->second->FixLinks( objects, link_stack, *info );
 
 		//Add object to list
 		obj_list.push_back(it->second);
 	}
 
+	//delete info if it was dynamically allocated
+	if ( delete_info ) {
+		delete info;
+	}
+
 	//Return completed block list
 	return obj_list;
 }
@@ -437,7 +447,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
 			WriteUInt( 0, out );
 		}
 
-		objects[i]->Write( out, link_map, version, user_version );
+		objects[i]->Write( out, link_map, info );
 	}
 
 	//--Write Footer--//
@@ -461,7 +471,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
       footer.numRoots = roots.size();
       footer.roots.insert(footer.roots.end(), roots.begin(), roots.end());
    }
-	footer.Write( out, link_map, version, user_version );
+	footer.Write( out, link_map, info );
 }
 
 // Writes a valid Nif File given a file name, a pointer to the root block of a file tree
diff --git a/src/obj/ABoneLODController.cpp b/src/obj/ABoneLODController.cpp
index 3086e37f1bb136f12941586550fe40fe75e86ba8..609d6e91a0a39e26730bc7d4eae2d1a73f8b7921 100644
--- a/src/obj/ABoneLODController.cpp
+++ b/src/obj/ABoneLODController.cpp
@@ -14,20 +14,20 @@ ABoneLODController::ABoneLODController() A_BONE_L_O_D_CONTROLLER_CONSTRUCT {}
 
 ABoneLODController::~ABoneLODController() {}
 
-void ABoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void ABoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void ABoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void ABoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string ABoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void ABoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void ABoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> ABoneLODController::GetRefs() const {
diff --git a/src/obj/AKeyedData.cpp b/src/obj/AKeyedData.cpp
index b946d4e046ed4af0869cbad2b0d04d747280e6b7..d40631c0c4f33a3d6ea71bbe04a814f2505cee7f 100644
--- a/src/obj/AKeyedData.cpp
+++ b/src/obj/AKeyedData.cpp
@@ -11,20 +11,20 @@ AKeyedData::AKeyedData() A_KEYED_DATA_CONSTRUCT {}
 
 AKeyedData::~AKeyedData() {}
 
-void AKeyedData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AKeyedData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AKeyedData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AKeyedData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AKeyedData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AKeyedData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AKeyedData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AKeyedData::GetRefs() const {
diff --git a/src/obj/APSysCtlr.cpp b/src/obj/APSysCtlr.cpp
index 545e2357f44502cf8dc0924d60b076192870e4ee..492da492bbfcbb8f1ab13b689cf90445174593d0 100644
--- a/src/obj/APSysCtlr.cpp
+++ b/src/obj/APSysCtlr.cpp
@@ -11,20 +11,20 @@ APSysCtlr::APSysCtlr() A_P_SYS_CTLR_CONSTRUCT {}
 
 APSysCtlr::~APSysCtlr() {}
 
-void APSysCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void APSysCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void APSysCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void APSysCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string APSysCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void APSysCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void APSysCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> APSysCtlr::GetRefs() const {
diff --git a/src/obj/APSysData.cpp b/src/obj/APSysData.cpp
index 14fc2a24649f242952659ecf746939289c42464d..759f3ebaf1a260b9f39222f9456c9728a2017706 100644
--- a/src/obj/APSysData.cpp
+++ b/src/obj/APSysData.cpp
@@ -11,20 +11,20 @@ APSysData::APSysData() A_P_SYS_DATA_CONSTRUCT {}
 
 APSysData::~APSysData() {}
 
-void APSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void APSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void APSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void APSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string APSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void APSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void APSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> APSysData::GetRefs() const {
diff --git a/src/obj/AParticleModifier.cpp b/src/obj/AParticleModifier.cpp
index 126b0beb1fea21fc7bd2f0d6cbd4b6d85df41967..fc90e3eab9ea9ea45e26be77639e11122bcf7365 100644
--- a/src/obj/AParticleModifier.cpp
+++ b/src/obj/AParticleModifier.cpp
@@ -12,20 +12,20 @@ AParticleModifier::AParticleModifier() A_PARTICLE_MODIFIER_CONSTRUCT {}
 
 AParticleModifier::~AParticleModifier() {}
 
-void AParticleModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AParticleModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AParticleModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AParticleModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AParticleModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AParticleModifier::GetRefs() const {
diff --git a/src/obj/AbhkConstraint.cpp b/src/obj/AbhkConstraint.cpp
index 75d2c006c6d1e895940e40d205399fc2d7f5b413..ea67dcc5d4a56685d9af10a28d38b09987693983 100644
--- a/src/obj/AbhkConstraint.cpp
+++ b/src/obj/AbhkConstraint.cpp
@@ -12,20 +12,20 @@ AbhkConstraint::AbhkConstraint() ABHK_CONSTRAINT_CONSTRUCT {}
 
 AbhkConstraint::~AbhkConstraint() {}
 
-void AbhkConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkConstraint::GetRefs() const {
diff --git a/src/obj/AbhkRagdollConstraint.cpp b/src/obj/AbhkRagdollConstraint.cpp
index 8ce47f1f8abb6ff7b4d7b87112603a6beec773a7..b881c7f7d90925ef59f1f00068d74d35c4241579 100644
--- a/src/obj/AbhkRagdollConstraint.cpp
+++ b/src/obj/AbhkRagdollConstraint.cpp
@@ -11,20 +11,20 @@ AbhkRagdollConstraint::AbhkRagdollConstraint() ABHK_RAGDOLL_CONSTRAINT_CONSTRUCT
 
 AbhkRagdollConstraint::~AbhkRagdollConstraint() {}
 
-void AbhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkRagdollConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkRagdollConstraint::GetRefs() const {
diff --git a/src/obj/AbhkShapeCollection.cpp b/src/obj/AbhkShapeCollection.cpp
index 4f0427b3324785a3f55cfdb139cd1af3c86e8b96..1c022da744a3217fa93c8c22e0142430b627af1b 100644
--- a/src/obj/AbhkShapeCollection.cpp
+++ b/src/obj/AbhkShapeCollection.cpp
@@ -11,20 +11,20 @@ AbhkShapeCollection::AbhkShapeCollection() ABHK_SHAPE_COLLECTION_CONSTRUCT {}
 
 AbhkShapeCollection::~AbhkShapeCollection() {}
 
-void AbhkShapeCollection::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkShapeCollection::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkShapeCollection::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkShapeCollection::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkShapeCollection::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkShapeCollection::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkShapeCollection::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkShapeCollection::GetRefs() const {
diff --git a/src/obj/AvoidNode.cpp b/src/obj/AvoidNode.cpp
index 8ec6093e9f6315ea0cbfd0834c241285f05ade3b..fafb48821b00411a3db0b366ef4193a49e6838d1 100644
--- a/src/obj/AvoidNode.cpp
+++ b/src/obj/AvoidNode.cpp
@@ -11,20 +11,20 @@ AvoidNode::AvoidNode() AVOID_NODE_CONSTRUCT {}
 
 AvoidNode::~AvoidNode() {}
 
-void AvoidNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AvoidNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AvoidNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AvoidNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AvoidNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AvoidNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AvoidNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AvoidNode::GetRefs() const {
diff --git a/src/obj/BSBound.cpp b/src/obj/BSBound.cpp
index b1ef7599fc1abe6217aed6a2b6bf2b377c0ce5d8..585b8befa8ee185f4031435cbee4678f34cb0332 100644
--- a/src/obj/BSBound.cpp
+++ b/src/obj/BSBound.cpp
@@ -11,20 +11,20 @@ BSBound::BSBound() B_S_BOUND_CONSTRUCT {}
 
 BSBound::~BSBound() {}
 
-void BSBound::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSBound::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSBound::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSBound::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSBound::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSBound::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSBound::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSBound::GetRefs() const {
diff --git a/src/obj/BSFurnitureMarker.cpp b/src/obj/BSFurnitureMarker.cpp
index 4b9f11021bae5c9639b0ce1e1fcecb0e370ad7b5..dc1061f6e79603af257e872c60303023573a6539 100644
--- a/src/obj/BSFurnitureMarker.cpp
+++ b/src/obj/BSFurnitureMarker.cpp
@@ -12,20 +12,20 @@ BSFurnitureMarker::BSFurnitureMarker() B_S_FURNITURE_MARKER_CONSTRUCT {}
 
 BSFurnitureMarker::~BSFurnitureMarker() {}
 
-void BSFurnitureMarker::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSFurnitureMarker::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSFurnitureMarker::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSFurnitureMarker::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSFurnitureMarker::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSFurnitureMarker::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSFurnitureMarker::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSFurnitureMarker::GetRefs() const {
diff --git a/src/obj/BSKeyframeController.cpp b/src/obj/BSKeyframeController.cpp
index 73b73db9566ef9133ac37433521c29d7b9c72c93..3fab29c7929f4ae952872c485671548d32bc7924 100644
--- a/src/obj/BSKeyframeController.cpp
+++ b/src/obj/BSKeyframeController.cpp
@@ -12,20 +12,20 @@ BSKeyframeController::BSKeyframeController() B_S_KEYFRAME_CONTROLLER_CONSTRUCT {
 
 BSKeyframeController::~BSKeyframeController() {}
 
-void BSKeyframeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSKeyframeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSKeyframeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSKeyframeController::GetRefs() const {
diff --git a/src/obj/BSPSysArrayEmitter.cpp b/src/obj/BSPSysArrayEmitter.cpp
index 2a3ec5bbe12fcb64926af21aa5fc47d8da9919d9..a50cc5003b088373e50a7bc5ce8f38ddca077156 100644
--- a/src/obj/BSPSysArrayEmitter.cpp
+++ b/src/obj/BSPSysArrayEmitter.cpp
@@ -11,20 +11,20 @@ BSPSysArrayEmitter::BSPSysArrayEmitter() B_S_P_SYS_ARRAY_EMITTER_CONSTRUCT {}
 
 BSPSysArrayEmitter::~BSPSysArrayEmitter() {}
 
-void BSPSysArrayEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSPSysArrayEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSPSysArrayEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSPSysArrayEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSPSysArrayEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSPSysArrayEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSPSysArrayEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSPSysArrayEmitter::GetRefs() const {
diff --git a/src/obj/BSParentVelocityModifier.cpp b/src/obj/BSParentVelocityModifier.cpp
index 455bc531d62a59e409442872c0af8293407d5efb..159d07d7c4041d0d8157ca01c498184f792000ef 100644
--- a/src/obj/BSParentVelocityModifier.cpp
+++ b/src/obj/BSParentVelocityModifier.cpp
@@ -11,20 +11,20 @@ BSParentVelocityModifier::BSParentVelocityModifier() B_S_PARENT_VELOCITY_MODIFIE
 
 BSParentVelocityModifier::~BSParentVelocityModifier() {}
 
-void BSParentVelocityModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSParentVelocityModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSParentVelocityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSParentVelocityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSParentVelocityModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSParentVelocityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSParentVelocityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSParentVelocityModifier::GetRefs() const {
diff --git a/src/obj/BSXFlags.cpp b/src/obj/BSXFlags.cpp
index 7efe42b6fcc5b1197f1eff093878c84ba6addf17..6cb205b4b6a329f8df3cdfde0a1028b1a9c5be4d 100644
--- a/src/obj/BSXFlags.cpp
+++ b/src/obj/BSXFlags.cpp
@@ -11,20 +11,20 @@ BSXFlags::BSXFlags() B_S_X_FLAGS_CONSTRUCT {}
 
 BSXFlags::~BSXFlags() {}
 
-void BSXFlags::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSXFlags::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSXFlags::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSXFlags::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSXFlags::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSXFlags::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSXFlags::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSXFlags::GetRefs() const {
diff --git a/src/obj/FxButton.cpp b/src/obj/FxButton.cpp
index 5ee656e24df20f6525d5c2d3aba12cdcf1005406..45956020b135e66f68fb31ecb42e4fd06afaa8bb 100644
--- a/src/obj/FxButton.cpp
+++ b/src/obj/FxButton.cpp
@@ -11,20 +11,20 @@ FxButton::FxButton() FX_BUTTON_CONSTRUCT {}
 
 FxButton::~FxButton() {}
 
-void FxButton::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxButton::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxButton::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxButton::GetRefs() const {
diff --git a/src/obj/FxRadioButton.cpp b/src/obj/FxRadioButton.cpp
index 1d26f79782f49e72f626982a00fd069484c8b37e..c9cd295f5b9c0dd4f8e3c88871977d24a05b2f90 100644
--- a/src/obj/FxRadioButton.cpp
+++ b/src/obj/FxRadioButton.cpp
@@ -12,20 +12,20 @@ FxRadioButton::FxRadioButton() FX_RADIO_BUTTON_CONSTRUCT {}
 
 FxRadioButton::~FxRadioButton() {}
 
-void FxRadioButton::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxRadioButton::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxRadioButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxRadioButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxRadioButton::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxRadioButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxRadioButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxRadioButton::GetRefs() const {
diff --git a/src/obj/FxWidget.cpp b/src/obj/FxWidget.cpp
index 6788a70789711efc0504e1beade2278ef5df5510..9f92fd4e6193cc97af0c993bd02d72da190ede59 100644
--- a/src/obj/FxWidget.cpp
+++ b/src/obj/FxWidget.cpp
@@ -11,20 +11,20 @@ FxWidget::FxWidget() FX_WIDGET_CONSTRUCT {}
 
 FxWidget::~FxWidget() {}
 
-void FxWidget::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxWidget::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxWidget::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxWidget::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxWidget::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxWidget::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxWidget::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxWidget::GetRefs() const {
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index bf4ef18572c7e59947e988d3ebb9bc3e3240b276..3619ff4f6211db45eafefbaa63c48e17910452c0 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -25,20 +25,20 @@ NiAVObject::~NiAVObject() {
 	ClearProperties();
 }
 
-void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAVObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAVObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAVObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAVObject::GetRefs() const {
diff --git a/src/obj/NiAlphaController.cpp b/src/obj/NiAlphaController.cpp
index f52b8440ff649524b0572034bbd00dcfc42ac2e6..41d8783cf57d2ec25a055a8d9b842e32f9ae45d1 100644
--- a/src/obj/NiAlphaController.cpp
+++ b/src/obj/NiAlphaController.cpp
@@ -12,20 +12,20 @@ NiAlphaController::NiAlphaController() NI_ALPHA_CONTROLLER_CONSTRUCT {}
 
 NiAlphaController::~NiAlphaController() {}
 
-void NiAlphaController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAlphaController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAlphaController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAlphaController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAlphaController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAlphaController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAlphaController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAlphaController::GetRefs() const {
diff --git a/src/obj/NiAlphaProperty.cpp b/src/obj/NiAlphaProperty.cpp
index 732b787845a97da7505120e5ba173949cf49eb67..d7c35ec04fa380859887ef69aabffff97730afc5 100644
--- a/src/obj/NiAlphaProperty.cpp
+++ b/src/obj/NiAlphaProperty.cpp
@@ -11,20 +11,20 @@ NiAlphaProperty::NiAlphaProperty() NI_ALPHA_PROPERTY_CONSTRUCT {}
 
 NiAlphaProperty::~NiAlphaProperty() {}
 
-void NiAlphaProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAlphaProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAlphaProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAlphaProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAlphaProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAlphaProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAlphaProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAlphaProperty::GetRefs() const {
diff --git a/src/obj/NiAmbientLight.cpp b/src/obj/NiAmbientLight.cpp
index d41a5efec2307eba1affc73551d515f057e4edf1..c78414ca59e9b0af7cc33ab44f2c7c880bd6f633 100644
--- a/src/obj/NiAmbientLight.cpp
+++ b/src/obj/NiAmbientLight.cpp
@@ -11,20 +11,20 @@ NiAmbientLight::NiAmbientLight() NI_AMBIENT_LIGHT_CONSTRUCT {}
 
 NiAmbientLight::~NiAmbientLight() {}
 
-void NiAmbientLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAmbientLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAmbientLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAmbientLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAmbientLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAmbientLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAmbientLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAmbientLight::GetRefs() const {
diff --git a/src/obj/NiAutoNormalParticles.cpp b/src/obj/NiAutoNormalParticles.cpp
index c14421dc7f8643d3a455f0546e00f3b91e057843..a855b16eb174ed06d0658cabe9f143284f31957b 100644
--- a/src/obj/NiAutoNormalParticles.cpp
+++ b/src/obj/NiAutoNormalParticles.cpp
@@ -11,20 +11,20 @@ NiAutoNormalParticles::NiAutoNormalParticles() NI_AUTO_NORMAL_PARTICLES_CONSTRUC
 
 NiAutoNormalParticles::~NiAutoNormalParticles() {}
 
-void NiAutoNormalParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAutoNormalParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAutoNormalParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAutoNormalParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAutoNormalParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAutoNormalParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAutoNormalParticles::GetRefs() const {
diff --git a/src/obj/NiAutoNormalParticlesData.cpp b/src/obj/NiAutoNormalParticlesData.cpp
index 0e62336fd043fb9524f41bf2b0045acb86f736fd..494d5d2ec1fbd2fa63fdb2c5bd58eaa0f8429858 100644
--- a/src/obj/NiAutoNormalParticlesData.cpp
+++ b/src/obj/NiAutoNormalParticlesData.cpp
@@ -11,20 +11,20 @@ NiAutoNormalParticlesData::NiAutoNormalParticlesData() NI_AUTO_NORMAL_PARTICLES_
 
 NiAutoNormalParticlesData::~NiAutoNormalParticlesData() {}
 
-void NiAutoNormalParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAutoNormalParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAutoNormalParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAutoNormalParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAutoNormalParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAutoNormalParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAutoNormalParticlesData::GetRefs() const {
diff --git a/src/obj/NiBSAnimationNode.cpp b/src/obj/NiBSAnimationNode.cpp
index 9966bd08ea2e9fdd8f500550ef133dfece86e01b..6e841316ed9947572893e6cf899877fe2219a0c6 100644
--- a/src/obj/NiBSAnimationNode.cpp
+++ b/src/obj/NiBSAnimationNode.cpp
@@ -11,20 +11,20 @@ NiBSAnimationNode::NiBSAnimationNode() NI_B_S_ANIMATION_NODE_CONSTRUCT {}
 
 NiBSAnimationNode::~NiBSAnimationNode() {}
 
-void NiBSAnimationNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSAnimationNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSAnimationNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSAnimationNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSAnimationNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSAnimationNode::GetRefs() const {
diff --git a/src/obj/NiBSBoneLODController.cpp b/src/obj/NiBSBoneLODController.cpp
index 762fd4c1b63500ba516f5a789a229feec08773c4..7a455928ec3f0298320a64a4ce0723a6bee9af9c 100644
--- a/src/obj/NiBSBoneLODController.cpp
+++ b/src/obj/NiBSBoneLODController.cpp
@@ -11,20 +11,20 @@ NiBSBoneLODController::NiBSBoneLODController() NI_B_S_BONE_L_O_D_CONTROLLER_CONS
 
 NiBSBoneLODController::~NiBSBoneLODController() {}
 
-void NiBSBoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSBoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSBoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSBoneLODController::GetRefs() const {
diff --git a/src/obj/NiBSPArrayController.cpp b/src/obj/NiBSPArrayController.cpp
index 0a0c3ce804a02f8972eeed758faec546669a1d19..b07e561ab112f9c291d6e42d7b669252f0113d78 100644
--- a/src/obj/NiBSPArrayController.cpp
+++ b/src/obj/NiBSPArrayController.cpp
@@ -11,20 +11,20 @@ NiBSPArrayController::NiBSPArrayController() NI_B_S_P_ARRAY_CONTROLLER_CONSTRUCT
 
 NiBSPArrayController::~NiBSPArrayController() {}
 
-void NiBSPArrayController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSPArrayController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSPArrayController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSPArrayController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSPArrayController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSPArrayController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSPArrayController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSPArrayController::GetRefs() const {
diff --git a/src/obj/NiBSParticleNode.cpp b/src/obj/NiBSParticleNode.cpp
index 0ddcc6fc75648cda5e5c5993d383a5c1ee6ce913..84c93f9e0d57f5a8f19e2705fa93cd68426f2ec9 100644
--- a/src/obj/NiBSParticleNode.cpp
+++ b/src/obj/NiBSParticleNode.cpp
@@ -11,20 +11,20 @@ NiBSParticleNode::NiBSParticleNode() NI_B_S_PARTICLE_NODE_CONSTRUCT {}
 
 NiBSParticleNode::~NiBSParticleNode() {}
 
-void NiBSParticleNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSParticleNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSParticleNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSParticleNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSParticleNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSParticleNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSParticleNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSParticleNode::GetRefs() const {
diff --git a/src/obj/NiBSplineBasisData.cpp b/src/obj/NiBSplineBasisData.cpp
index 67a085951848d3e0def250ee70d00acb7a27102c..24f010f1e7699c7815be942bd625aa5e3394d947 100644
--- a/src/obj/NiBSplineBasisData.cpp
+++ b/src/obj/NiBSplineBasisData.cpp
@@ -11,20 +11,20 @@ NiBSplineBasisData::NiBSplineBasisData() NI_B_SPLINE_BASIS_DATA_CONSTRUCT {}
 
 NiBSplineBasisData::~NiBSplineBasisData() {}
 
-void NiBSplineBasisData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineBasisData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineBasisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineBasisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineBasisData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineBasisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineBasisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineBasisData::GetRefs() const {
diff --git a/src/obj/NiBSplineCompFloatInterpolator.cpp b/src/obj/NiBSplineCompFloatInterpolator.cpp
index f86694a63c236012502ff5bb8c950aa41e34c64f..b05bb04c5317068baf2e045894a2b03042964774 100644
--- a/src/obj/NiBSplineCompFloatInterpolator.cpp
+++ b/src/obj/NiBSplineCompFloatInterpolator.cpp
@@ -11,20 +11,20 @@ NiBSplineCompFloatInterpolator::NiBSplineCompFloatInterpolator() NI_B_SPLINE_COM
 
 NiBSplineCompFloatInterpolator::~NiBSplineCompFloatInterpolator() {}
 
-void NiBSplineCompFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineCompPoint3Interpolator.cpp b/src/obj/NiBSplineCompPoint3Interpolator.cpp
index a21155ff03b304286b75baeac53118e3ca7657fa..73f988ce1900ba61acb257c28e0410b14840c2e3 100644
--- a/src/obj/NiBSplineCompPoint3Interpolator.cpp
+++ b/src/obj/NiBSplineCompPoint3Interpolator.cpp
@@ -11,20 +11,20 @@ NiBSplineCompPoint3Interpolator::NiBSplineCompPoint3Interpolator() NI_B_SPLINE_C
 
 NiBSplineCompPoint3Interpolator::~NiBSplineCompPoint3Interpolator() {}
 
-void NiBSplineCompPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineCompTransformInterpolator.cpp b/src/obj/NiBSplineCompTransformInterpolator.cpp
index a05f47e6404150e682251a6cf1875345dec69b91..9fa3e06444366ea71b3db06bd97a20dc9333611c 100644
--- a/src/obj/NiBSplineCompTransformInterpolator.cpp
+++ b/src/obj/NiBSplineCompTransformInterpolator.cpp
@@ -17,20 +17,20 @@ NiBSplineCompTransformInterpolator::NiBSplineCompTransformInterpolator() NI_B_SP
 
 NiBSplineCompTransformInterpolator::~NiBSplineCompTransformInterpolator() {}
 
-void NiBSplineCompTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineData.cpp b/src/obj/NiBSplineData.cpp
index c8705851504933e3c4dab89de273c3a725873846..65b133fbc9e470c1e0cf6d1ee50c0b5869a8920b 100644
--- a/src/obj/NiBSplineData.cpp
+++ b/src/obj/NiBSplineData.cpp
@@ -11,20 +11,20 @@ NiBSplineData::NiBSplineData() NI_B_SPLINE_DATA_CONSTRUCT {}
 
 NiBSplineData::~NiBSplineData() {}
 
-void NiBSplineData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineData::GetRefs() const {
diff --git a/src/obj/NiBSplineInterpolator.cpp b/src/obj/NiBSplineInterpolator.cpp
index c5add90a1a0aedd91a4f1e11bccae79c5936b52d..1cab9aa3098e8a6d46cbabcadebb33aa0db20815 100644
--- a/src/obj/NiBSplineInterpolator.cpp
+++ b/src/obj/NiBSplineInterpolator.cpp
@@ -13,20 +13,20 @@ NiBSplineInterpolator::NiBSplineInterpolator() NI_B_SPLINE_INTERPOLATOR_CONSTRUC
 
 NiBSplineInterpolator::~NiBSplineInterpolator() {}
 
-void NiBSplineInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineInterpolator::GetRefs() const {
diff --git a/src/obj/NiBillboardNode.cpp b/src/obj/NiBillboardNode.cpp
index 91d14827ba5348c68620f69e60e8c5227e9dc6cd..10a784f5c81a6b38dd711958e81f5bfdf4723117 100644
--- a/src/obj/NiBillboardNode.cpp
+++ b/src/obj/NiBillboardNode.cpp
@@ -11,20 +11,20 @@ NiBillboardNode::NiBillboardNode() NI_BILLBOARD_NODE_CONSTRUCT {}
 
 NiBillboardNode::~NiBillboardNode() {}
 
-void NiBillboardNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBillboardNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBillboardNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBillboardNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBillboardNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBillboardNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBillboardNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBillboardNode::GetRefs() const {
diff --git a/src/obj/NiBinaryExtraData.cpp b/src/obj/NiBinaryExtraData.cpp
index 1af6f3e0d0e6e64514246b176b43d4bf7796d566..7a129593360791fb292ca08ae2763f13718ed697 100644
--- a/src/obj/NiBinaryExtraData.cpp
+++ b/src/obj/NiBinaryExtraData.cpp
@@ -12,20 +12,20 @@ NiBinaryExtraData::NiBinaryExtraData() NI_BINARY_EXTRA_DATA_CONSTRUCT {}
 
 NiBinaryExtraData::~NiBinaryExtraData() {}
 
-void NiBinaryExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBinaryExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBinaryExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBinaryExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBinaryExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBinaryExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBinaryExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBinaryExtraData::GetRefs() const {
diff --git a/src/obj/NiBlendBoolInterpolator.cpp b/src/obj/NiBlendBoolInterpolator.cpp
index 2a3d63cd2cea880f1bfb67193cb1fc063bd2306d..51b4975dfe0143bdc62adb695e806fabc40c0e70 100644
--- a/src/obj/NiBlendBoolInterpolator.cpp
+++ b/src/obj/NiBlendBoolInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendBoolInterpolator::NiBlendBoolInterpolator() NI_BLEND_BOOL_INTERPOLATOR_CO
 
 NiBlendBoolInterpolator::~NiBlendBoolInterpolator() {}
 
-void NiBlendBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendBoolInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendBoolInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendFloatInterpolator.cpp b/src/obj/NiBlendFloatInterpolator.cpp
index 6a2fc8ed6ae2cc7ff80b5f99ca06b517f740dd09..2b608a281bad79e42ad5af416090e87260058470 100644
--- a/src/obj/NiBlendFloatInterpolator.cpp
+++ b/src/obj/NiBlendFloatInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendFloatInterpolator::NiBlendFloatInterpolator() NI_BLEND_FLOAT_INTERPOLATOR
 
 NiBlendFloatInterpolator::~NiBlendFloatInterpolator() {}
 
-void NiBlendFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendInterpolator.cpp b/src/obj/NiBlendInterpolator.cpp
index c36e5fd27f036276c0f688dcc1fc843c32e9aa67..7db942c4da3a4bcfca00771d516a6bd96ab69754 100644
--- a/src/obj/NiBlendInterpolator.cpp
+++ b/src/obj/NiBlendInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendInterpolator::NiBlendInterpolator() NI_BLEND_INTERPOLATOR_CONSTRUCT {}
 
 NiBlendInterpolator::~NiBlendInterpolator() {}
 
-void NiBlendInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendPoint3Interpolator.cpp b/src/obj/NiBlendPoint3Interpolator.cpp
index 656f97fb02db47574867fbfc7474166e41a0e232..39002a95beeb036ee8ce6b15ede3194619c6a08d 100644
--- a/src/obj/NiBlendPoint3Interpolator.cpp
+++ b/src/obj/NiBlendPoint3Interpolator.cpp
@@ -11,20 +11,20 @@ NiBlendPoint3Interpolator::NiBlendPoint3Interpolator() NI_BLEND_POINT3_INTERPOLA
 
 NiBlendPoint3Interpolator::~NiBlendPoint3Interpolator() {}
 
-void NiBlendPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiBlendTransformInterpolator.cpp b/src/obj/NiBlendTransformInterpolator.cpp
index 69834626e025d7cbb979699c80a05261fea87945..9593c6e60b4c55104f2fb19ef25742b2da8d1127 100644
--- a/src/obj/NiBlendTransformInterpolator.cpp
+++ b/src/obj/NiBlendTransformInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendTransformInterpolator::NiBlendTransformInterpolator() NI_BLEND_TRANSFORM_
 
 NiBlendTransformInterpolator::~NiBlendTransformInterpolator() {}
 
-void NiBlendTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiBoneLODController.cpp b/src/obj/NiBoneLODController.cpp
index 00a31a0a3a3d5f5e4103f47e1fcf8e12b084652f..7b07d74637e1c4f757883427e1d017d464039c1a 100644
--- a/src/obj/NiBoneLODController.cpp
+++ b/src/obj/NiBoneLODController.cpp
@@ -15,20 +15,20 @@ NiBoneLODController::NiBoneLODController() NI_BONE_L_O_D_CONTROLLER_CONSTRUCT {}
 
 NiBoneLODController::~NiBoneLODController() {}
 
-void NiBoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoneLODController::GetRefs() const {
diff --git a/src/obj/NiBoolData.cpp b/src/obj/NiBoolData.cpp
index 83ae9ca61d498a47bae3b6bdec95a6f8647f1984..35b6c7ce498d0b143db99ff2d5c11254e34ffd11 100644
--- a/src/obj/NiBoolData.cpp
+++ b/src/obj/NiBoolData.cpp
@@ -12,20 +12,20 @@ NiBoolData::NiBoolData() NI_BOOL_DATA_CONSTRUCT {}
 
 NiBoolData::~NiBoolData() {}
 
-void NiBoolData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolData::GetRefs() const {
diff --git a/src/obj/NiBoolInterpolator.cpp b/src/obj/NiBoolInterpolator.cpp
index 39e045f5c993a76a0ca4913d3582d56529d06efb..abdaa442f041355e7ec0031de90db681c027d828 100644
--- a/src/obj/NiBoolInterpolator.cpp
+++ b/src/obj/NiBoolInterpolator.cpp
@@ -12,20 +12,20 @@ NiBoolInterpolator::NiBoolInterpolator() NI_BOOL_INTERPOLATOR_CONSTRUCT {}
 
 NiBoolInterpolator::~NiBoolInterpolator() {}
 
-void NiBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolInterpolator::GetRefs() const {
diff --git a/src/obj/NiBoolTimelineInterpolator.cpp b/src/obj/NiBoolTimelineInterpolator.cpp
index 12d7655d622d10625289fef7af423fa0fdab37e4..1e931204a7e170b1a45491917258c820cc72ae83 100644
--- a/src/obj/NiBoolTimelineInterpolator.cpp
+++ b/src/obj/NiBoolTimelineInterpolator.cpp
@@ -12,20 +12,20 @@ NiBoolTimelineInterpolator::NiBoolTimelineInterpolator() NI_BOOL_TIMELINE_INTERP
 
 NiBoolTimelineInterpolator::~NiBoolTimelineInterpolator() {}
 
-void NiBoolTimelineInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolTimelineInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolTimelineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolTimelineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolTimelineInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolTimelineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolTimelineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolTimelineInterpolator::GetRefs() const {
diff --git a/src/obj/NiBooleanExtraData.cpp b/src/obj/NiBooleanExtraData.cpp
index e7e735ee9cd602c7e964389100d16ba14b1e7d7b..66115c9238850e21515f2c760730c9a78c6ac490 100644
--- a/src/obj/NiBooleanExtraData.cpp
+++ b/src/obj/NiBooleanExtraData.cpp
@@ -11,20 +11,20 @@ NiBooleanExtraData::NiBooleanExtraData() NI_BOOLEAN_EXTRA_DATA_CONSTRUCT {}
 
 NiBooleanExtraData::~NiBooleanExtraData() {}
 
-void NiBooleanExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBooleanExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBooleanExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBooleanExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBooleanExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBooleanExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBooleanExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBooleanExtraData::GetRefs() const {
diff --git a/src/obj/NiCamera.cpp b/src/obj/NiCamera.cpp
index 9436876e542350484cedebecd786c4a6fa4b843c..fabc19ed404235c5333fcb905143dad60a957088 100644
--- a/src/obj/NiCamera.cpp
+++ b/src/obj/NiCamera.cpp
@@ -12,20 +12,20 @@ NiCamera::NiCamera() NI_CAMERA_CONSTRUCT {}
 
 NiCamera::~NiCamera() {}
 
-void NiCamera::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCamera::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCamera::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCamera::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCamera::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCamera::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCamera::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCamera::GetRefs() const {
diff --git a/src/obj/NiClod.cpp b/src/obj/NiClod.cpp
index 4d6f7ab7287fab9fb8ae42fa89364a0e308d9011..b298d99a9136007fce65186148da856a6b753c7a 100644
--- a/src/obj/NiClod.cpp
+++ b/src/obj/NiClod.cpp
@@ -11,20 +11,20 @@ NiClod::NiClod() NI_CLOD_CONSTRUCT {}
 
 NiClod::~NiClod() {}
 
-void NiClod::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClod::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClod::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClod::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClod::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClod::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClod::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClod::GetRefs() const {
diff --git a/src/obj/NiClodData.cpp b/src/obj/NiClodData.cpp
index 0744ebfe51add658a725b080e46663dcc080d555..dac526276ce32df593ec5f78ffb1683c98730bbb 100644
--- a/src/obj/NiClodData.cpp
+++ b/src/obj/NiClodData.cpp
@@ -11,20 +11,20 @@ NiClodData::NiClodData() NI_CLOD_DATA_CONSTRUCT {}
 
 NiClodData::~NiClodData() {}
 
-void NiClodData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClodData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClodData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClodData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClodData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClodData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClodData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClodData::GetRefs() const {
diff --git a/src/obj/NiClodSkinInstance.cpp b/src/obj/NiClodSkinInstance.cpp
index 6ca8fa7dd9424df05b23dea5c5ea4fdf527b640d..2664fbc45cdfd10841625030bbf23aae3b12d731 100644
--- a/src/obj/NiClodSkinInstance.cpp
+++ b/src/obj/NiClodSkinInstance.cpp
@@ -11,20 +11,20 @@ NiClodSkinInstance::NiClodSkinInstance() NI_CLOD_SKIN_INSTANCE_CONSTRUCT {}
 
 NiClodSkinInstance::~NiClodSkinInstance() {}
 
-void NiClodSkinInstance::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClodSkinInstance::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClodSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClodSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClodSkinInstance::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClodSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClodSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClodSkinInstance::GetRefs() const {
diff --git a/src/obj/NiCollisionData.cpp b/src/obj/NiCollisionData.cpp
index 677b6c2e04297f4d5eb693e002e18cae14efcc8f..c688d30652eb25810dadc527c32884d282234251 100644
--- a/src/obj/NiCollisionData.cpp
+++ b/src/obj/NiCollisionData.cpp
@@ -12,20 +12,20 @@ NiCollisionData::NiCollisionData() NI_COLLISION_DATA_CONSTRUCT {}
 
 NiCollisionData::~NiCollisionData() {}
 
-void NiCollisionData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCollisionData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCollisionData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCollisionData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCollisionData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCollisionData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCollisionData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCollisionData::GetRefs() const {
diff --git a/src/obj/NiCollisionObject.cpp b/src/obj/NiCollisionObject.cpp
index 38918ab11e73f298e17351778769c974e6ded576..bf0608a6ac02019f82b00fa04fd7ba64f029f5f6 100644
--- a/src/obj/NiCollisionObject.cpp
+++ b/src/obj/NiCollisionObject.cpp
@@ -13,20 +13,20 @@ NiCollisionObject::NiCollisionObject() NI_COLLISION_OBJECT_CONSTRUCT {}
 
 NiCollisionObject::~NiCollisionObject() {}
 
-void NiCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCollisionObject::GetRefs() const {
diff --git a/src/obj/NiColorData.cpp b/src/obj/NiColorData.cpp
index 938600234c64ec5bb27832cdacd0844a2ff72c14..33d623723a62ebb429ad40695eec148b6484f358 100644
--- a/src/obj/NiColorData.cpp
+++ b/src/obj/NiColorData.cpp
@@ -12,20 +12,20 @@ NiColorData::NiColorData() NI_COLOR_DATA_CONSTRUCT {}
 
 NiColorData::~NiColorData() {}
 
-void NiColorData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiColorData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiColorData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiColorData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiColorData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiColorData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiColorData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiColorData::GetRefs() const {
diff --git a/src/obj/NiColorExtraData.cpp b/src/obj/NiColorExtraData.cpp
index 83f963064234fb298488bc56191778f4a6f8be5d..71d808c76631d5243002ab4f364482c46d00cb19 100644
--- a/src/obj/NiColorExtraData.cpp
+++ b/src/obj/NiColorExtraData.cpp
@@ -11,20 +11,20 @@ NiColorExtraData::NiColorExtraData() NI_COLOR_EXTRA_DATA_CONSTRUCT {}
 
 NiColorExtraData::~NiColorExtraData() {}
 
-void NiColorExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiColorExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiColorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiColorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiColorExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiColorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiColorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiColorExtraData::GetRefs() const {
diff --git a/src/obj/NiControllerManager.cpp b/src/obj/NiControllerManager.cpp
index 9dab28b070a9a628965e1cf35b7020e6ff1f1a17..57dbf33fb50de21ca9a111c23a6ec99760516196 100644
--- a/src/obj/NiControllerManager.cpp
+++ b/src/obj/NiControllerManager.cpp
@@ -14,20 +14,20 @@ NiControllerManager::NiControllerManager() NI_CONTROLLER_MANAGER_CONSTRUCT {}
 
 NiControllerManager::~NiControllerManager() {}
 
-void NiControllerManager::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiControllerManager::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiControllerManager::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiControllerManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiControllerManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiControllerManager::GetRefs() const {
diff --git a/src/obj/NiControllerSequence.cpp b/src/obj/NiControllerSequence.cpp
index 9f28f159f10c1a66b453ab1a2586f301317b3e83..9cfda479f1256b18af3e028631e6bddfe2e70945 100644
--- a/src/obj/NiControllerSequence.cpp
+++ b/src/obj/NiControllerSequence.cpp
@@ -23,20 +23,20 @@ NiControllerSequence::NiControllerSequence() NI_CONTROLLER_SEQUENCE_CONSTRUCT {}
 
 NiControllerSequence::~NiControllerSequence() {}
 
-void NiControllerSequence::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiControllerSequence::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiControllerSequence::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiControllerSequence::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiControllerSequence::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiControllerSequence::GetRefs() const {
diff --git a/src/obj/NiDefaultAVObjectPalette.cpp b/src/obj/NiDefaultAVObjectPalette.cpp
index 37d3b5d45d283e3278a76eaa1b65c9418e1875f2..1b8ede42de473910c834ad80201ff722fa86539e 100644
--- a/src/obj/NiDefaultAVObjectPalette.cpp
+++ b/src/obj/NiDefaultAVObjectPalette.cpp
@@ -13,20 +13,20 @@ NiDefaultAVObjectPalette::NiDefaultAVObjectPalette() NI_DEFAULT_A_V_OBJECT_PALET
 
 NiDefaultAVObjectPalette::~NiDefaultAVObjectPalette() {}
 
-void NiDefaultAVObjectPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDefaultAVObjectPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDefaultAVObjectPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDefaultAVObjectPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDefaultAVObjectPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDefaultAVObjectPalette::GetRefs() const {
diff --git a/src/obj/NiDirectionalLight.cpp b/src/obj/NiDirectionalLight.cpp
index 33dca533a968a5c7b22d9f5aa100520a9d875dd5..fb60079d00323ec920736a6c262de9ed48fd81f0 100644
--- a/src/obj/NiDirectionalLight.cpp
+++ b/src/obj/NiDirectionalLight.cpp
@@ -11,20 +11,20 @@ NiDirectionalLight::NiDirectionalLight() NI_DIRECTIONAL_LIGHT_CONSTRUCT {}
 
 NiDirectionalLight::~NiDirectionalLight() {}
 
-void NiDirectionalLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDirectionalLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDirectionalLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDirectionalLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDirectionalLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDirectionalLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDirectionalLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDirectionalLight::GetRefs() const {
diff --git a/src/obj/NiDitherProperty.cpp b/src/obj/NiDitherProperty.cpp
index f4c346e72d8db623d51dd18fb539287ebee199b9..02011a99b84bb3de505855f172eb2d01bd9d8de4 100644
--- a/src/obj/NiDitherProperty.cpp
+++ b/src/obj/NiDitherProperty.cpp
@@ -11,20 +11,20 @@ NiDitherProperty::NiDitherProperty() NI_DITHER_PROPERTY_CONSTRUCT {}
 
 NiDitherProperty::~NiDitherProperty() {}
 
-void NiDitherProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDitherProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDitherProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDitherProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDitherProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDitherProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDitherProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDitherProperty::GetRefs() const {
diff --git a/src/obj/NiDynamicEffect.cpp b/src/obj/NiDynamicEffect.cpp
index 20ec572694ed3982a6c959af5f7854bcda6ac7ec..d8ba154fffed97d7685bf5eee637a5cff7c4180d 100644
--- a/src/obj/NiDynamicEffect.cpp
+++ b/src/obj/NiDynamicEffect.cpp
@@ -12,20 +12,20 @@ NiDynamicEffect::NiDynamicEffect() NI_DYNAMIC_EFFECT_CONSTRUCT {}
 
 NiDynamicEffect::~NiDynamicEffect() {}
 
-void NiDynamicEffect::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDynamicEffect::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDynamicEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDynamicEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDynamicEffect::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDynamicEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDynamicEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDynamicEffect::GetRefs() const {
diff --git a/src/obj/NiExtraData.cpp b/src/obj/NiExtraData.cpp
index c8fabd53f592885ec2e0287f017388582c42de29..838be7f66450ed0055367f9099a2f3ebbf51edc8 100644
--- a/src/obj/NiExtraData.cpp
+++ b/src/obj/NiExtraData.cpp
@@ -11,20 +11,20 @@ NiExtraData::NiExtraData() NI_EXTRA_DATA_CONSTRUCT {}
 
 NiExtraData::~NiExtraData() {}
 
-void NiExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiExtraData::GetRefs() const {
diff --git a/src/obj/NiFlipController.cpp b/src/obj/NiFlipController.cpp
index e725de7db7257180590b8aff66b46e405bf58600..c679abe99e0010f079435e34377d2aac7f4af09d 100644
--- a/src/obj/NiFlipController.cpp
+++ b/src/obj/NiFlipController.cpp
@@ -12,20 +12,20 @@ NiFlipController::NiFlipController() NI_FLIP_CONTROLLER_CONSTRUCT {}
 
 NiFlipController::~NiFlipController() {}
 
-void NiFlipController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFlipController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFlipController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFlipController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFlipController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFlipController::GetRefs() const {
diff --git a/src/obj/NiFloatData.cpp b/src/obj/NiFloatData.cpp
index 5be2aac6b1e64efb6bc34bead34386bbd847c1d7..4caf8a97dec8b6148b3045d34320ac55c81c81ec 100644
--- a/src/obj/NiFloatData.cpp
+++ b/src/obj/NiFloatData.cpp
@@ -12,20 +12,20 @@ NiFloatData::NiFloatData() NI_FLOAT_DATA_CONSTRUCT {}
 
 NiFloatData::~NiFloatData() {}
 
-void NiFloatData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatData::GetRefs() const {
diff --git a/src/obj/NiFloatExtraData.cpp b/src/obj/NiFloatExtraData.cpp
index e6131588c4afd74274cf1c5e926693f4920c044f..4500b9f16f8a461ca163e8e6a46bf7db5330b573 100644
--- a/src/obj/NiFloatExtraData.cpp
+++ b/src/obj/NiFloatExtraData.cpp
@@ -11,20 +11,20 @@ NiFloatExtraData::NiFloatExtraData() NI_FLOAT_EXTRA_DATA_CONSTRUCT {}
 
 NiFloatExtraData::~NiFloatExtraData() {}
 
-void NiFloatExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatExtraData::GetRefs() const {
diff --git a/src/obj/NiFloatExtraDataController.cpp b/src/obj/NiFloatExtraDataController.cpp
index c189f17997210cf8e6e803ffae475c6225d98bde..d0fd9c0f0ecaa69fa9d3c73aae21bee470668ac6 100644
--- a/src/obj/NiFloatExtraDataController.cpp
+++ b/src/obj/NiFloatExtraDataController.cpp
@@ -12,20 +12,20 @@ NiFloatExtraDataController::NiFloatExtraDataController() NI_FLOAT_EXTRA_DATA_CON
 
 NiFloatExtraDataController::~NiFloatExtraDataController() {}
 
-void NiFloatExtraDataController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatExtraDataController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatExtraDataController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatExtraDataController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatExtraDataController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatExtraDataController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraDataController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatExtraDataController::GetRefs() const {
diff --git a/src/obj/NiFloatInterpolator.cpp b/src/obj/NiFloatInterpolator.cpp
index 1df915f49c30f1363cce9cb48462488665e6a6a3..45f7ab85ff1642f9ee9afa5632e5bd18adcef42c 100644
--- a/src/obj/NiFloatInterpolator.cpp
+++ b/src/obj/NiFloatInterpolator.cpp
@@ -12,20 +12,20 @@ NiFloatInterpolator::NiFloatInterpolator() NI_FLOAT_INTERPOLATOR_CONSTRUCT {}
 
 NiFloatInterpolator::~NiFloatInterpolator() {}
 
-void NiFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiFloatsExtraData.cpp b/src/obj/NiFloatsExtraData.cpp
index a3709643588884dfbddcff74cc54031af44c283f..9dfae4209dcb16893cbfa65c9d56c8efb4e8f6ba 100644
--- a/src/obj/NiFloatsExtraData.cpp
+++ b/src/obj/NiFloatsExtraData.cpp
@@ -11,20 +11,20 @@ NiFloatsExtraData::NiFloatsExtraData() NI_FLOATS_EXTRA_DATA_CONSTRUCT {}
 
 NiFloatsExtraData::~NiFloatsExtraData() {}
 
-void NiFloatsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatsExtraData::GetRefs() const {
diff --git a/src/obj/NiFogProperty.cpp b/src/obj/NiFogProperty.cpp
index 30d539f97a1a0a841fb5d57c0f740dd9f46548d6..4692fe31e90398624bb2d00a6f90b94d772029da 100644
--- a/src/obj/NiFogProperty.cpp
+++ b/src/obj/NiFogProperty.cpp
@@ -11,20 +11,20 @@ NiFogProperty::NiFogProperty() NI_FOG_PROPERTY_CONSTRUCT {}
 
 NiFogProperty::~NiFogProperty() {}
 
-void NiFogProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFogProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFogProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFogProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFogProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFogProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFogProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFogProperty::GetRefs() const {
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index 61ad9ee0d431ad583ab9df99e3c247bf26653bb5..0c3ae6d7c5198560745579513f168e01e88fbfad 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -13,20 +13,20 @@ NiGeomMorpherController::NiGeomMorpherController() NI_GEOM_MORPHER_CONTROLLER_CO
 
 NiGeomMorpherController::~NiGeomMorpherController() {}
 
-void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeomMorpherController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeomMorpherController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeomMorpherController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeomMorpherController::GetRefs() const {
diff --git a/src/obj/NiGeometry.cpp b/src/obj/NiGeometry.cpp
index 9a73c44be24feefaf24f364b1a3ec94011a66358..b01cc8d82e4650d7ffe8feb153cb19df29e24a75 100644
--- a/src/obj/NiGeometry.cpp
+++ b/src/obj/NiGeometry.cpp
@@ -16,20 +16,20 @@ NiGeometry::NiGeometry() NI_GEOMETRY_CONSTRUCT {}
 
 NiGeometry::~NiGeometry() {}
 
-void NiGeometry::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeometry::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeometry::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeometry::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeometry::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeometry::GetRefs() const {
diff --git a/src/obj/NiGeometryData.cpp b/src/obj/NiGeometryData.cpp
index 793e4906bb456771299339bc893eb9a4b5c612b4..db00a5822bd83dde1a914d3d7ccb0adfe7ef5ae6 100644
--- a/src/obj/NiGeometryData.cpp
+++ b/src/obj/NiGeometryData.cpp
@@ -12,20 +12,20 @@ NiGeometryData::NiGeometryData() NI_GEOMETRY_DATA_CONSTRUCT {}
 
 NiGeometryData::~NiGeometryData() {}
 
-void NiGeometryData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeometryData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeometryData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeometryData::GetRefs() const {
diff --git a/src/obj/NiGravity.cpp b/src/obj/NiGravity.cpp
index 4667eaa8ee687d59176495b463301062b9741b25..6bb76d425abc79874c35fef3486504ad6ad4576a 100644
--- a/src/obj/NiGravity.cpp
+++ b/src/obj/NiGravity.cpp
@@ -11,20 +11,20 @@ NiGravity::NiGravity() NI_GRAVITY_CONSTRUCT {}
 
 NiGravity::~NiGravity() {}
 
-void NiGravity::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGravity::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGravity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGravity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGravity::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGravity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGravity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGravity::GetRefs() const {
diff --git a/src/obj/NiImage.cpp b/src/obj/NiImage.cpp
index 8bfcf95afdfa5adda652f6e58ee9b9bb6e402758..ee9f0ce790db544853e761f33e58de4a7b927490 100644
--- a/src/obj/NiImage.cpp
+++ b/src/obj/NiImage.cpp
@@ -11,20 +11,20 @@ NiImage::NiImage() NI_IMAGE_CONSTRUCT {}
 
 NiImage::~NiImage() {}
 
-void NiImage::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiImage::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiImage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiImage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiImage::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiImage::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiImage::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiImage::GetRefs() const {
diff --git a/src/obj/NiIntegerExtraData.cpp b/src/obj/NiIntegerExtraData.cpp
index 4b6a10599b1b7ad55fd62447c99ef12d752591e1..d94fbe8a15865b7a219ee72c8bb87fe64d2368e1 100644
--- a/src/obj/NiIntegerExtraData.cpp
+++ b/src/obj/NiIntegerExtraData.cpp
@@ -11,20 +11,20 @@ NiIntegerExtraData::NiIntegerExtraData() NI_INTEGER_EXTRA_DATA_CONSTRUCT {}
 
 NiIntegerExtraData::~NiIntegerExtraData() {}
 
-void NiIntegerExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiIntegerExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiIntegerExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiIntegerExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiIntegerExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiIntegerExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiIntegerExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiIntegerExtraData::GetRefs() const {
diff --git a/src/obj/NiIntegersExtraData.cpp b/src/obj/NiIntegersExtraData.cpp
index 49d97871da7ee9fcffeeebc29faa924a75b6995f..79804cc47a9ee2a7703c7af5857487a571e3657d 100644
--- a/src/obj/NiIntegersExtraData.cpp
+++ b/src/obj/NiIntegersExtraData.cpp
@@ -11,20 +11,20 @@ NiIntegersExtraData::NiIntegersExtraData() NI_INTEGERS_EXTRA_DATA_CONSTRUCT {}
 
 NiIntegersExtraData::~NiIntegersExtraData() {}
 
-void NiIntegersExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiIntegersExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiIntegersExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiIntegersExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiIntegersExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiIntegersExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiIntegersExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiIntegersExtraData::GetRefs() const {
diff --git a/src/obj/NiInterpolator.cpp b/src/obj/NiInterpolator.cpp
index 152e00c585026265070f4925c7ba9fd47b0e9a81..94fd4029b2329163022b76cde0a40f0ca2bd088c 100644
--- a/src/obj/NiInterpolator.cpp
+++ b/src/obj/NiInterpolator.cpp
@@ -11,20 +11,20 @@ NiInterpolator::NiInterpolator() NI_INTERPOLATOR_CONSTRUCT {}
 
 NiInterpolator::~NiInterpolator() {}
 
-void NiInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiInterpolator::GetRefs() const {
diff --git a/src/obj/NiKeyframeController.cpp b/src/obj/NiKeyframeController.cpp
index df491135b51ad81bf15ed45e1bdab22bb3581007..c2327e2bb7f2531c1ba54182029c63be4746b513 100644
--- a/src/obj/NiKeyframeController.cpp
+++ b/src/obj/NiKeyframeController.cpp
@@ -12,20 +12,20 @@ NiKeyframeController::NiKeyframeController() NI_KEYFRAME_CONTROLLER_CONSTRUCT {}
 
 NiKeyframeController::~NiKeyframeController() {}
 
-void NiKeyframeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiKeyframeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiKeyframeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiKeyframeController::GetRefs() const {
diff --git a/src/obj/NiKeyframeData.cpp b/src/obj/NiKeyframeData.cpp
index 5b9b62a90bebb6dd8575242662f278ad32f3afd3..d6348b3ab05d3ce6ab893fc48875fe657e6ef2d5 100644
--- a/src/obj/NiKeyframeData.cpp
+++ b/src/obj/NiKeyframeData.cpp
@@ -12,20 +12,20 @@ NiKeyframeData::NiKeyframeData() NI_KEYFRAME_DATA_CONSTRUCT {}
 
 NiKeyframeData::~NiKeyframeData() {}
 
-void NiKeyframeData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiKeyframeData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiKeyframeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiKeyframeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiKeyframeData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiKeyframeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiKeyframeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiKeyframeData::GetRefs() const {
diff --git a/src/obj/NiLODData.cpp b/src/obj/NiLODData.cpp
index 6ec65c56f7ab45cd5194bda1356f50c6a15d8d77..6e0b6a7614e61ad823b7d1ad996fd39bbb0faff4 100644
--- a/src/obj/NiLODData.cpp
+++ b/src/obj/NiLODData.cpp
@@ -11,20 +11,20 @@ NiLODData::NiLODData() NI_L_O_D_DATA_CONSTRUCT {}
 
 NiLODData::~NiLODData() {}
 
-void NiLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLODData::GetRefs() const {
diff --git a/src/obj/NiLODNode.cpp b/src/obj/NiLODNode.cpp
index 95d1ef23626fdc1c981a4000bd7c73156272d7e0..a8a0f0c669c587484d0ac1d56dd97190f37a5d26 100644
--- a/src/obj/NiLODNode.cpp
+++ b/src/obj/NiLODNode.cpp
@@ -13,20 +13,20 @@ NiLODNode::NiLODNode() NI_L_O_D_NODE_CONSTRUCT {}
 
 NiLODNode::~NiLODNode() {}
 
-void NiLODNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLODNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLODNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLODNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLODNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLODNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLODNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLODNode::GetRefs() const {
diff --git a/src/obj/NiLight.cpp b/src/obj/NiLight.cpp
index 7f140138301368189df9ab0223db61177751e0a7..1321e2aee1f2a1cd134319bd6b86bfaf293c3b3d 100644
--- a/src/obj/NiLight.cpp
+++ b/src/obj/NiLight.cpp
@@ -11,20 +11,20 @@ NiLight::NiLight() NI_LIGHT_CONSTRUCT {}
 
 NiLight::~NiLight() {}
 
-void NiLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLight::GetRefs() const {
diff --git a/src/obj/NiLightColorController.cpp b/src/obj/NiLightColorController.cpp
index b8b00780c0a6ca1859326dcc6e0da193450e6234..d208509c64bce0e0dd0a2fcfdb8d026d9346eded 100644
--- a/src/obj/NiLightColorController.cpp
+++ b/src/obj/NiLightColorController.cpp
@@ -13,20 +13,20 @@ NiLightColorController::NiLightColorController() NI_LIGHT_COLOR_CONTROLLER_CONST
 
 NiLightColorController::~NiLightColorController() {}
 
-void NiLightColorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLightColorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLightColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLightColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLightColorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLightColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLightColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLightColorController::GetRefs() const {
diff --git a/src/obj/NiLightDimmerController.cpp b/src/obj/NiLightDimmerController.cpp
index bd8a6680fc8f167de5c07ddb78369a4ba1328be0..2e021680d93266e87110c56845374477a0387843 100644
--- a/src/obj/NiLightDimmerController.cpp
+++ b/src/obj/NiLightDimmerController.cpp
@@ -12,20 +12,20 @@ NiLightDimmerController::NiLightDimmerController() NI_LIGHT_DIMMER_CONTROLLER_CO
 
 NiLightDimmerController::~NiLightDimmerController() {}
 
-void NiLightDimmerController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLightDimmerController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLightDimmerController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLightDimmerController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLightDimmerController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLightDimmerController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLightDimmerController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLightDimmerController::GetRefs() const {
diff --git a/src/obj/NiLookAtController.cpp b/src/obj/NiLookAtController.cpp
index 410081037ec0a3c0695be4607b243655083cacb1..807c8ba814542eee95378d323bd9410a9d7863dd 100644
--- a/src/obj/NiLookAtController.cpp
+++ b/src/obj/NiLookAtController.cpp
@@ -12,20 +12,20 @@ NiLookAtController::NiLookAtController() NI_LOOK_AT_CONTROLLER_CONSTRUCT {}
 
 NiLookAtController::~NiLookAtController() {}
 
-void NiLookAtController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLookAtController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLookAtController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLookAtController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLookAtController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLookAtController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLookAtController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLookAtController::GetRefs() const {
diff --git a/src/obj/NiLookAtInterpolator.cpp b/src/obj/NiLookAtInterpolator.cpp
index 2058651e322856151f88b6d4d83c2c2cb6b2f304..38000646e4f4fe7536e7c6b4bfd3edd60b588075 100644
--- a/src/obj/NiLookAtInterpolator.cpp
+++ b/src/obj/NiLookAtInterpolator.cpp
@@ -14,20 +14,20 @@ NiLookAtInterpolator::NiLookAtInterpolator() NI_LOOK_AT_INTERPOLATOR_CONSTRUCT {
 
 NiLookAtInterpolator::~NiLookAtInterpolator() {}
 
-void NiLookAtInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLookAtInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLookAtInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLookAtInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLookAtInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLookAtInterpolator::GetRefs() const {
diff --git a/src/obj/NiMaterialColorController.cpp b/src/obj/NiMaterialColorController.cpp
index 0f8cd03c707498a8ce3c2b2ac609ef707ae8c436..9261c5c5f2adcfd37445c983471c9b0f64d65440 100644
--- a/src/obj/NiMaterialColorController.cpp
+++ b/src/obj/NiMaterialColorController.cpp
@@ -12,20 +12,20 @@ NiMaterialColorController::NiMaterialColorController() NI_MATERIAL_COLOR_CONTROL
 
 NiMaterialColorController::~NiMaterialColorController() {}
 
-void NiMaterialColorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMaterialColorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMaterialColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMaterialColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMaterialColorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMaterialColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMaterialColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMaterialColorController::GetRefs() const {
diff --git a/src/obj/NiMaterialProperty.cpp b/src/obj/NiMaterialProperty.cpp
index ebf7686acdabfc1ec97462bd04eaa585c54d969d..2157e8fafac0296cbf521c9131d9e04de0bde1ef 100644
--- a/src/obj/NiMaterialProperty.cpp
+++ b/src/obj/NiMaterialProperty.cpp
@@ -11,20 +11,20 @@ NiMaterialProperty::NiMaterialProperty() NI_MATERIAL_PROPERTY_CONSTRUCT {}
 
 NiMaterialProperty::~NiMaterialProperty() {}
 
-void NiMaterialProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMaterialProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMaterialProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMaterialProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMaterialProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMaterialProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMaterialProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMaterialProperty::GetRefs() const {
diff --git a/src/obj/NiMeshPSysData.cpp b/src/obj/NiMeshPSysData.cpp
index c7fb67cb789c25925f31584a98f221d6768bb0dc..613a9fe24509e17af0615d6f8bd8d4d06bb65011 100644
--- a/src/obj/NiMeshPSysData.cpp
+++ b/src/obj/NiMeshPSysData.cpp
@@ -13,20 +13,20 @@ NiMeshPSysData::NiMeshPSysData() NI_MESH_P_SYS_DATA_CONSTRUCT {}
 
 NiMeshPSysData::~NiMeshPSysData() {}
 
-void NiMeshPSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMeshPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMeshPSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMeshPSysData::GetRefs() const {
diff --git a/src/obj/NiMeshParticleSystem.cpp b/src/obj/NiMeshParticleSystem.cpp
index ae82f855b47825f99c1afe17931cd9dd04ab1776..940cad9e3db520451865eebd0c721c0950778a59 100644
--- a/src/obj/NiMeshParticleSystem.cpp
+++ b/src/obj/NiMeshParticleSystem.cpp
@@ -11,20 +11,20 @@ NiMeshParticleSystem::NiMeshParticleSystem() NI_MESH_PARTICLE_SYSTEM_CONSTRUCT {
 
 NiMeshParticleSystem::~NiMeshParticleSystem() {}
 
-void NiMeshParticleSystem::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMeshParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMeshParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMeshParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMeshParticleSystem::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMeshParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMeshParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMeshParticleSystem::GetRefs() const {
diff --git a/src/obj/NiMorphData.cpp b/src/obj/NiMorphData.cpp
index 74503f02231145458b3ee342b1c860d639943330..55b79b421c7dbcc4e87cab1fedf579da4cd82774 100644
--- a/src/obj/NiMorphData.cpp
+++ b/src/obj/NiMorphData.cpp
@@ -12,20 +12,20 @@ NiMorphData::NiMorphData() NI_MORPH_DATA_CONSTRUCT {}
 
 NiMorphData::~NiMorphData() {}
 
-void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMorphData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMorphData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMorphData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMorphData::GetRefs() const {
diff --git a/src/obj/NiMultiTargetTransformController.cpp b/src/obj/NiMultiTargetTransformController.cpp
index 8b623f7f536c56b1a85c52dd7fb58d5e9a4c7f59..bf4c08a8d5239f497a2f4b78b4a71274f75d83b8 100644
--- a/src/obj/NiMultiTargetTransformController.cpp
+++ b/src/obj/NiMultiTargetTransformController.cpp
@@ -13,20 +13,20 @@ NiMultiTargetTransformController::NiMultiTargetTransformController() NI_MULTI_TA
 
 NiMultiTargetTransformController::~NiMultiTargetTransformController() {}
 
-void NiMultiTargetTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMultiTargetTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMultiTargetTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMultiTargetTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMultiTargetTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMultiTargetTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMultiTargetTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMultiTargetTransformController::GetRefs() const {
diff --git a/src/obj/NiNode.cpp b/src/obj/NiNode.cpp
index 603cf6217cbd399cd387ed47d482b2ecaeaf2643..2641716e318675d7a71626828c45d0fad8e4be24 100644
--- a/src/obj/NiNode.cpp
+++ b/src/obj/NiNode.cpp
@@ -27,20 +27,20 @@ NiNode::~NiNode() {
 	ClearChildren();
 }
 
-void NiNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 	//Connect children to their parents and remove any NULL ones
 	for ( vector< NiAVObjectRef >::iterator it = children.begin(); it != children.end(); ) {
 		if ( *it == NULL) {
diff --git a/src/obj/NiObject.cpp b/src/obj/NiObject.cpp
index 09141bc5eb95b83bab1d3faf2517af08bcf75b09..e313757f6bab31b71b252b524994e5689d7c7285 100644
--- a/src/obj/NiObject.cpp
+++ b/src/obj/NiObject.cpp
@@ -81,13 +81,14 @@ NiObjectRef NiObject::Clone( unsigned int version, unsigned int user_version ) {
 	map<NiObjectRef,unsigned int> link_map;
 
 	//Write this object's data to the stream
-	this->Write( tmp, link_map, version, user_version );
+	NifInfo info( version, user_version );
+	this->Write( tmp, link_map, info );
 
 	//Dummy stack
 	list<unsigned int> link_stack;
 
 	//Read the data back from the stream into the clone
-	clone->Read( tmp, link_stack, version, user_version );
+	clone->Read( tmp, link_stack, info );
 
 	//We don't fix the links, causing the clone to be a copy of all
 	//data but have none of the linkage of the original.
diff --git a/src/obj/NiObjectNET.cpp b/src/obj/NiObjectNET.cpp
index 70d6d79772be345bdf667744414c3000ff0d56c3..236a6b9073263727e22602bbc3b42146801e0102 100644
--- a/src/obj/NiObjectNET.cpp
+++ b/src/obj/NiObjectNET.cpp
@@ -17,20 +17,20 @@ NiObjectNET::~NiObjectNET() {
 	ClearControllers();
 }
 
-void NiObjectNET::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiObjectNET::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiObjectNET::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiObjectNET::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiObjectNET::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiObjectNET::GetRefs() const {
diff --git a/src/obj/NiPSysAgeDeathModifier.cpp b/src/obj/NiPSysAgeDeathModifier.cpp
index 847b190620fa9cc229727a2abb981b2ba3bc60b2..79986b39748d627b533d1c6ce9e30c08967361a9 100644
--- a/src/obj/NiPSysAgeDeathModifier.cpp
+++ b/src/obj/NiPSysAgeDeathModifier.cpp
@@ -12,20 +12,20 @@ NiPSysAgeDeathModifier::NiPSysAgeDeathModifier() NI_P_SYS_AGE_DEATH_MODIFIER_CON
 
 NiPSysAgeDeathModifier::~NiPSysAgeDeathModifier() {}
 
-void NiPSysAgeDeathModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysAgeDeathModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysAgeDeathModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysAgeDeathModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysAgeDeathModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysAgeDeathModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysAgeDeathModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysAgeDeathModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBombModifier.cpp b/src/obj/NiPSysBombModifier.cpp
index e2340ceb68e84b1bd4b62820e260569ec012a329..24ed96677bcf8c28110911e9b128bf14be30c5f6 100644
--- a/src/obj/NiPSysBombModifier.cpp
+++ b/src/obj/NiPSysBombModifier.cpp
@@ -12,20 +12,20 @@ NiPSysBombModifier::NiPSysBombModifier() NI_P_SYS_BOMB_MODIFIER_CONSTRUCT {}
 
 NiPSysBombModifier::~NiPSysBombModifier() {}
 
-void NiPSysBombModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBombModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBombModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBombModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBombModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBombModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBombModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBombModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBoundUpdateModifier.cpp b/src/obj/NiPSysBoundUpdateModifier.cpp
index b1db32c1bb0f3c49f16709ee4a61a24dda94e44e..047009d18df0614f27417c3e4fe14097592cabc6 100644
--- a/src/obj/NiPSysBoundUpdateModifier.cpp
+++ b/src/obj/NiPSysBoundUpdateModifier.cpp
@@ -11,20 +11,20 @@ NiPSysBoundUpdateModifier::NiPSysBoundUpdateModifier() NI_P_SYS_BOUND_UPDATE_MOD
 
 NiPSysBoundUpdateModifier::~NiPSysBoundUpdateModifier() {}
 
-void NiPSysBoundUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBoundUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBoundUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBoundUpdateModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBoundUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBoundUpdateModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBoxEmitter.cpp b/src/obj/NiPSysBoxEmitter.cpp
index b923237d35ac6b27f808183912dcda4765bd5723..54818a3f15d2ec29c464dc338e1383a44eaded96 100644
--- a/src/obj/NiPSysBoxEmitter.cpp
+++ b/src/obj/NiPSysBoxEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysBoxEmitter::NiPSysBoxEmitter() NI_P_SYS_BOX_EMITTER_CONSTRUCT {}
 
 NiPSysBoxEmitter::~NiPSysBoxEmitter() {}
 
-void NiPSysBoxEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBoxEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBoxEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBoxEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBoxEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBoxEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBoxEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBoxEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysColliderManager.cpp b/src/obj/NiPSysColliderManager.cpp
index de77a44d85768a028c8739e12ecb38316bb93d53..fc6d35037b398c9961d232aaca4d4df57f71b426 100644
--- a/src/obj/NiPSysColliderManager.cpp
+++ b/src/obj/NiPSysColliderManager.cpp
@@ -12,20 +12,20 @@ NiPSysColliderManager::NiPSysColliderManager() NI_P_SYS_COLLIDER_MANAGER_CONSTRU
 
 NiPSysColliderManager::~NiPSysColliderManager() {}
 
-void NiPSysColliderManager::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysColliderManager::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysColliderManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysColliderManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysColliderManager::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysColliderManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysColliderManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysColliderManager::GetRefs() const {
diff --git a/src/obj/NiPSysColorModifier.cpp b/src/obj/NiPSysColorModifier.cpp
index c91218893022a5cb63e1e61c445ad7a5c9184799..4d9e2739475b278742749a5e4e63fcf4a33cb5f5 100644
--- a/src/obj/NiPSysColorModifier.cpp
+++ b/src/obj/NiPSysColorModifier.cpp
@@ -12,20 +12,20 @@ NiPSysColorModifier::NiPSysColorModifier() NI_P_SYS_COLOR_MODIFIER_CONSTRUCT {}
 
 NiPSysColorModifier::~NiPSysColorModifier() {}
 
-void NiPSysColorModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysColorModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysColorModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysColorModifier::GetRefs() const {
diff --git a/src/obj/NiPSysCylinderEmitter.cpp b/src/obj/NiPSysCylinderEmitter.cpp
index 53218e95cbf9f93ec00297366d5264758dd41f24..59629687eb02d8dfe8fd5d9157e9b26d2416c054 100644
--- a/src/obj/NiPSysCylinderEmitter.cpp
+++ b/src/obj/NiPSysCylinderEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysCylinderEmitter::NiPSysCylinderEmitter() NI_P_SYS_CYLINDER_EMITTER_CONSTRU
 
 NiPSysCylinderEmitter::~NiPSysCylinderEmitter() {}
 
-void NiPSysCylinderEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysCylinderEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysCylinderEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysCylinderEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysCylinderEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysCylinderEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysCylinderEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysCylinderEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysData.cpp b/src/obj/NiPSysData.cpp
index e1fc37f96e8ffadbec12b33ffac0d1a8fad37b51..c2726694fc5a39357f1f70a5a37ef8ae5e51fd16 100644
--- a/src/obj/NiPSysData.cpp
+++ b/src/obj/NiPSysData.cpp
@@ -11,20 +11,20 @@ NiPSysData::NiPSysData() NI_P_SYS_DATA_CONSTRUCT {}
 
 NiPSysData::~NiPSysData() {}
 
-void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysData::GetRefs() const {
diff --git a/src/obj/NiPSysDragModifier.cpp b/src/obj/NiPSysDragModifier.cpp
index df8eb8dfde7174aeb072bb39bbe7d2a3bc8d3b66..93c160298534c859ca0c54121fad11c7187be7cc 100644
--- a/src/obj/NiPSysDragModifier.cpp
+++ b/src/obj/NiPSysDragModifier.cpp
@@ -12,20 +12,20 @@ NiPSysDragModifier::NiPSysDragModifier() NI_P_SYS_DRAG_MODIFIER_CONSTRUCT {}
 
 NiPSysDragModifier::~NiPSysDragModifier() {}
 
-void NiPSysDragModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysDragModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysDragModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysDragModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysDragModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysDragModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysDragModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysDragModifier::GetRefs() const {
diff --git a/src/obj/NiPSysEmitter.cpp b/src/obj/NiPSysEmitter.cpp
index 8114fc58b53a52408448c11d22bd11fb89c541ca..96382879ee543baed413c0b17d1925b21b431d65 100644
--- a/src/obj/NiPSysEmitter.cpp
+++ b/src/obj/NiPSysEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysEmitter::NiPSysEmitter() NI_P_SYS_EMITTER_CONSTRUCT {}
 
 NiPSysEmitter::~NiPSysEmitter() {}
 
-void NiPSysEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterCtlr.cpp b/src/obj/NiPSysEmitterCtlr.cpp
index 0555ab2ac188b2a9fa396c741fbc2f942603ae6b..69af8a4ccb3c9219963ffaba67017fc6fbf03927 100644
--- a/src/obj/NiPSysEmitterCtlr.cpp
+++ b/src/obj/NiPSysEmitterCtlr.cpp
@@ -13,20 +13,20 @@ NiPSysEmitterCtlr::NiPSysEmitterCtlr() NI_P_SYS_EMITTER_CTLR_CONSTRUCT {}
 
 NiPSysEmitterCtlr::~NiPSysEmitterCtlr() {}
 
-void NiPSysEmitterCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterCtlrData.cpp b/src/obj/NiPSysEmitterCtlrData.cpp
index 78c2920b865e7f8e1b54732572e8b9ffdca26567..80a70ec7b4da5a45fdbba26dc69b79026e67abda 100644
--- a/src/obj/NiPSysEmitterCtlrData.cpp
+++ b/src/obj/NiPSysEmitterCtlrData.cpp
@@ -12,20 +12,20 @@ NiPSysEmitterCtlrData::NiPSysEmitterCtlrData() NI_P_SYS_EMITTER_CTLR_DATA_CONSTR
 
 NiPSysEmitterCtlrData::~NiPSysEmitterCtlrData() {}
 
-void NiPSysEmitterCtlrData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterCtlrData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterCtlrData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterCtlrData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterCtlrData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterCtlrData::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterDeclinationCtlr.cpp b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
index e192437137b4ba5aa699a8700f16132d6e2065ae..d29d157735ffc6f681021981544d7f07a071cc50 100644
--- a/src/obj/NiPSysEmitterDeclinationCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterDeclinationCtlr::NiPSysEmitterDeclinationCtlr() NI_P_SYS_EMITTER_DE
 
 NiPSysEmitterDeclinationCtlr::~NiPSysEmitterDeclinationCtlr() {}
 
-void NiPSysEmitterDeclinationCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterDeclinationCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterDeclinationCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterDeclinationCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
index 10c32e6d2eb345734827c57663486a09890bf115..7ce7972a601d28c7a223609f35853f3cecb5ea25 100644
--- a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterDeclinationVarCtlr::NiPSysEmitterDeclinationVarCtlr() NI_P_SYS_EMIT
 
 NiPSysEmitterDeclinationVarCtlr::~NiPSysEmitterDeclinationVarCtlr() {}
 
-void NiPSysEmitterDeclinationVarCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterDeclinationVarCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
index 43568c87d25e3d1fc0ead77fd85399c1d716eee6..9a1017df7f9c59a78bb7089dc669e7ab343a8e5f 100644
--- a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
+++ b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterInitialRadiusCtlr::NiPSysEmitterInitialRadiusCtlr() NI_P_SYS_EMITTE
 
 NiPSysEmitterInitialRadiusCtlr::~NiPSysEmitterInitialRadiusCtlr() {}
 
-void NiPSysEmitterInitialRadiusCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterInitialRadiusCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
index 6ea30cbfbe430570abf2303e5d7c0f87b57f40cd..c6687debbebf8da6cd1e459999136430b3b8c70e 100644
--- a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
+++ b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
@@ -12,20 +12,20 @@ NiPSysEmitterLifeSpanCtlr::NiPSysEmitterLifeSpanCtlr() NI_P_SYS_EMITTER_LIFE_SPA
 
 NiPSysEmitterLifeSpanCtlr::~NiPSysEmitterLifeSpanCtlr() {}
 
-void NiPSysEmitterLifeSpanCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterLifeSpanCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterLifeSpanCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterLifeSpanCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterSpeedCtlr.cpp b/src/obj/NiPSysEmitterSpeedCtlr.cpp
index 31853e7cd24e475def13187a033d3528e6804a6f..bdf1398749f9543e33c1f981eaaceca0d11969bc 100644
--- a/src/obj/NiPSysEmitterSpeedCtlr.cpp
+++ b/src/obj/NiPSysEmitterSpeedCtlr.cpp
@@ -13,20 +13,20 @@ NiPSysEmitterSpeedCtlr::NiPSysEmitterSpeedCtlr() NI_P_SYS_EMITTER_SPEED_CTLR_CON
 
 NiPSysEmitterSpeedCtlr::~NiPSysEmitterSpeedCtlr() {}
 
-void NiPSysEmitterSpeedCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterSpeedCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterSpeedCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterSpeedCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterSpeedCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterSpeedCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterSpeedCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterSpeedCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysGravityModifier.cpp b/src/obj/NiPSysGravityModifier.cpp
index 458ae1a10dc3d2bb1c9bb34e475638bc3412b980..01eb1029cbd21f96691d4528e2ce554fd86a560a 100644
--- a/src/obj/NiPSysGravityModifier.cpp
+++ b/src/obj/NiPSysGravityModifier.cpp
@@ -12,20 +12,20 @@ NiPSysGravityModifier::NiPSysGravityModifier() NI_P_SYS_GRAVITY_MODIFIER_CONSTRU
 
 NiPSysGravityModifier::~NiPSysGravityModifier() {}
 
-void NiPSysGravityModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGravityModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGravityModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGravityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGravityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGravityModifier::GetRefs() const {
diff --git a/src/obj/NiPSysGravityStrengthCtlr.cpp b/src/obj/NiPSysGravityStrengthCtlr.cpp
index ab105e6150a519214e30774bf7f7368d54052103..c9cf6253da8bf9a0d2cf9d1aa09f0b4168984871 100644
--- a/src/obj/NiPSysGravityStrengthCtlr.cpp
+++ b/src/obj/NiPSysGravityStrengthCtlr.cpp
@@ -12,20 +12,20 @@ NiPSysGravityStrengthCtlr::NiPSysGravityStrengthCtlr() NI_P_SYS_GRAVITY_STRENGTH
 
 NiPSysGravityStrengthCtlr::~NiPSysGravityStrengthCtlr() {}
 
-void NiPSysGravityStrengthCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGravityStrengthCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGravityStrengthCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGravityStrengthCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGravityStrengthCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGravityStrengthCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGravityStrengthCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGravityStrengthCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysGrowFadeModifier.cpp b/src/obj/NiPSysGrowFadeModifier.cpp
index 43f56f9e8a47a09229bbeb79b51047e68e4138b0..20de9aa6837be9d59e9e4d686560ae601b56ba81 100644
--- a/src/obj/NiPSysGrowFadeModifier.cpp
+++ b/src/obj/NiPSysGrowFadeModifier.cpp
@@ -11,20 +11,20 @@ NiPSysGrowFadeModifier::NiPSysGrowFadeModifier() NI_P_SYS_GROW_FADE_MODIFIER_CON
 
 NiPSysGrowFadeModifier::~NiPSysGrowFadeModifier() {}
 
-void NiPSysGrowFadeModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGrowFadeModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGrowFadeModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGrowFadeModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGrowFadeModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGrowFadeModifier::GetRefs() const {
diff --git a/src/obj/NiPSysMeshEmitter.cpp b/src/obj/NiPSysMeshEmitter.cpp
index fcbdd317dfac39e6773ea452c1a9528e0ee36fc2..ea1c4e2f23a5986d708ae2caa1dd53229f64ffc1 100644
--- a/src/obj/NiPSysMeshEmitter.cpp
+++ b/src/obj/NiPSysMeshEmitter.cpp
@@ -12,20 +12,20 @@ NiPSysMeshEmitter::NiPSysMeshEmitter() NI_P_SYS_MESH_EMITTER_CONSTRUCT {}
 
 NiPSysMeshEmitter::~NiPSysMeshEmitter() {}
 
-void NiPSysMeshEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysMeshEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysMeshEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysMeshEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysMeshEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysMeshEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysMeshEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysMeshUpdateModifier.cpp b/src/obj/NiPSysMeshUpdateModifier.cpp
index 8dc3809804902dfbc192657362f27f73c45a76ef..ae629ee8fc24765ac4e454c60de24c2d4c00eea0 100644
--- a/src/obj/NiPSysMeshUpdateModifier.cpp
+++ b/src/obj/NiPSysMeshUpdateModifier.cpp
@@ -12,20 +12,20 @@ NiPSysMeshUpdateModifier::NiPSysMeshUpdateModifier() NI_P_SYS_MESH_UPDATE_MODIFI
 
 NiPSysMeshUpdateModifier::~NiPSysMeshUpdateModifier() {}
 
-void NiPSysMeshUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysMeshUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysMeshUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysMeshUpdateModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysMeshUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysMeshUpdateModifier::GetRefs() const {
diff --git a/src/obj/NiPSysModifier.cpp b/src/obj/NiPSysModifier.cpp
index 15de5152e4151346344f2845f770dea7d3df2fdd..9b769d1f9c30738e72093e1e483f47a5d185f55c 100644
--- a/src/obj/NiPSysModifier.cpp
+++ b/src/obj/NiPSysModifier.cpp
@@ -12,20 +12,20 @@ NiPSysModifier::NiPSysModifier() NI_P_SYS_MODIFIER_CONSTRUCT {}
 
 NiPSysModifier::~NiPSysModifier() {}
 
-void NiPSysModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysModifier::GetRefs() const {
diff --git a/src/obj/NiPSysModifierActiveCtlr.cpp b/src/obj/NiPSysModifierActiveCtlr.cpp
index 352d75bbc2893953792dcc1125b7a7261f51fd86..cb3aa4b8e06251cb76b2b0c008d9490fbbfe23e1 100644
--- a/src/obj/NiPSysModifierActiveCtlr.cpp
+++ b/src/obj/NiPSysModifierActiveCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysModifierActiveCtlr::NiPSysModifierActiveCtlr() NI_P_SYS_MODIFIER_ACTIVE_CT
 
 NiPSysModifierActiveCtlr::~NiPSysModifierActiveCtlr() {}
 
-void NiPSysModifierActiveCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysModifierActiveCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysModifierActiveCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysModifierActiveCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysModifierActiveCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysModifierActiveCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysPlanarCollider.cpp b/src/obj/NiPSysPlanarCollider.cpp
index f931eed2981a612889fc9f2cc393f45f4221e680..0eeadf19bef58e375ff2fa54f2e14473ee53d010 100644
--- a/src/obj/NiPSysPlanarCollider.cpp
+++ b/src/obj/NiPSysPlanarCollider.cpp
@@ -14,20 +14,20 @@ NiPSysPlanarCollider::NiPSysPlanarCollider() NI_P_SYS_PLANAR_COLLIDER_CONSTRUCT
 
 NiPSysPlanarCollider::~NiPSysPlanarCollider() {}
 
-void NiPSysPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysPlanarCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysPlanarCollider::GetRefs() const {
diff --git a/src/obj/NiPSysPositionModifier.cpp b/src/obj/NiPSysPositionModifier.cpp
index b09a7913fd1a58b583e4bc45f2e85a02de2ff8db..f1c74582b8dd95bd4b7fc8108a8f61e4629d67fe 100644
--- a/src/obj/NiPSysPositionModifier.cpp
+++ b/src/obj/NiPSysPositionModifier.cpp
@@ -11,20 +11,20 @@ NiPSysPositionModifier::NiPSysPositionModifier() NI_P_SYS_POSITION_MODIFIER_CONS
 
 NiPSysPositionModifier::~NiPSysPositionModifier() {}
 
-void NiPSysPositionModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysPositionModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysPositionModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysPositionModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysPositionModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysPositionModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysPositionModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysPositionModifier::GetRefs() const {
diff --git a/src/obj/NiPSysResetOnLoopCtlr.cpp b/src/obj/NiPSysResetOnLoopCtlr.cpp
index 147e5f03b2ef19de0e4d9b2b387576c198ba1204..47eb901dc3fe64be43919deffd3b0870d25302bd 100644
--- a/src/obj/NiPSysResetOnLoopCtlr.cpp
+++ b/src/obj/NiPSysResetOnLoopCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysResetOnLoopCtlr::NiPSysResetOnLoopCtlr() NI_P_SYS_RESET_ON_LOOP_CTLR_CONST
 
 NiPSysResetOnLoopCtlr::~NiPSysResetOnLoopCtlr() {}
 
-void NiPSysResetOnLoopCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysResetOnLoopCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysResetOnLoopCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysResetOnLoopCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysResetOnLoopCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysResetOnLoopCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysRotationModifier.cpp b/src/obj/NiPSysRotationModifier.cpp
index 95fa37ab424a8f2a1276df295ff4efd24e20d2dc..2d96e2a2ce723e9219fc5ffb21b96ab65e707d33 100644
--- a/src/obj/NiPSysRotationModifier.cpp
+++ b/src/obj/NiPSysRotationModifier.cpp
@@ -11,20 +11,20 @@ NiPSysRotationModifier::NiPSysRotationModifier() NI_P_SYS_ROTATION_MODIFIER_CONS
 
 NiPSysRotationModifier::~NiPSysRotationModifier() {}
 
-void NiPSysRotationModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysRotationModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysRotationModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysRotationModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysRotationModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysRotationModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysRotationModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysRotationModifier::GetRefs() const {
diff --git a/src/obj/NiPSysSpawnModifier.cpp b/src/obj/NiPSysSpawnModifier.cpp
index c3c5251e6ce19741aefa4ad1282e78cf38bf787f..3520f2f243d242eb3d83717b84b0bfadea4e8957 100644
--- a/src/obj/NiPSysSpawnModifier.cpp
+++ b/src/obj/NiPSysSpawnModifier.cpp
@@ -11,20 +11,20 @@ NiPSysSpawnModifier::NiPSysSpawnModifier() NI_P_SYS_SPAWN_MODIFIER_CONSTRUCT {}
 
 NiPSysSpawnModifier::~NiPSysSpawnModifier() {}
 
-void NiPSysSpawnModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysSpawnModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysSpawnModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysSpawnModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysSpawnModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysSpawnModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysSpawnModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysSpawnModifier::GetRefs() const {
diff --git a/src/obj/NiPSysSphereEmitter.cpp b/src/obj/NiPSysSphereEmitter.cpp
index 1b4c8619c9b811f01b0b45ff14c97b95528fde5a..38d7a07076554ad2cc294197c643a550c82aaee2 100644
--- a/src/obj/NiPSysSphereEmitter.cpp
+++ b/src/obj/NiPSysSphereEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysSphereEmitter::NiPSysSphereEmitter() NI_P_SYS_SPHERE_EMITTER_CONSTRUCT {}
 
 NiPSysSphereEmitter::~NiPSysSphereEmitter() {}
 
-void NiPSysSphereEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysSphereEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysSphereEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysSphereEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysSphereEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysSphereEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysSphereEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysSphereEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysUpdateCtlr.cpp b/src/obj/NiPSysUpdateCtlr.cpp
index ad0980f85d9653bb0a01b5c2d1a63835e96c6e84..7fedf06a5288b1de522b3b7e9b3b36fef78f368a 100644
--- a/src/obj/NiPSysUpdateCtlr.cpp
+++ b/src/obj/NiPSysUpdateCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysUpdateCtlr::NiPSysUpdateCtlr() NI_P_SYS_UPDATE_CTLR_CONSTRUCT {}
 
 NiPSysUpdateCtlr::~NiPSysUpdateCtlr() {}
 
-void NiPSysUpdateCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysUpdateCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysUpdateCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysUpdateCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysUpdateCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysUpdateCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysUpdateCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysUpdateCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysVolumeEmitter.cpp b/src/obj/NiPSysVolumeEmitter.cpp
index 32e8dd77865379c9c3ba5eb987f7bdafc83734d5..cfaa05a832e7b8b0ce4624c919a040b97f95ad7a 100644
--- a/src/obj/NiPSysVolumeEmitter.cpp
+++ b/src/obj/NiPSysVolumeEmitter.cpp
@@ -12,20 +12,20 @@ NiPSysVolumeEmitter::NiPSysVolumeEmitter() NI_P_SYS_VOLUME_EMITTER_CONSTRUCT {}
 
 NiPSysVolumeEmitter::~NiPSysVolumeEmitter() {}
 
-void NiPSysVolumeEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysVolumeEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysVolumeEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysVolumeEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysVolumeEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysVolumeEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysVolumeEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysVolumeEmitter::GetRefs() const {
diff --git a/src/obj/NiPalette.cpp b/src/obj/NiPalette.cpp
index c3db59ee55af4c26626754d04f0f2dfc3b381253..5cc31e4a862850e2fdaffd4420e30beb1295f846 100644
--- a/src/obj/NiPalette.cpp
+++ b/src/obj/NiPalette.cpp
@@ -11,20 +11,20 @@ NiPalette::NiPalette() NI_PALETTE_CONSTRUCT {}
 
 NiPalette::~NiPalette() {}
 
-void NiPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPalette::GetRefs() const {
diff --git a/src/obj/NiParticleBomb.cpp b/src/obj/NiParticleBomb.cpp
index 70172da4daf2af5dab4bc1ba0ff81bc0caaf0fb2..aea20b394a36e8e701dd6ad38422b7fe748587c0 100644
--- a/src/obj/NiParticleBomb.cpp
+++ b/src/obj/NiParticleBomb.cpp
@@ -11,20 +11,20 @@ NiParticleBomb::NiParticleBomb() NI_PARTICLE_BOMB_CONSTRUCT {}
 
 NiParticleBomb::~NiParticleBomb() {}
 
-void NiParticleBomb::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleBomb::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleBomb::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleBomb::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleBomb::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleBomb::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleBomb::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleBomb::GetRefs() const {
diff --git a/src/obj/NiParticleColorModifier.cpp b/src/obj/NiParticleColorModifier.cpp
index 398c15469703335f8bd02a3e5e10302b9a2aa5ff..2d50f417b872a53c2bae14b7fe2067217cfc5863 100644
--- a/src/obj/NiParticleColorModifier.cpp
+++ b/src/obj/NiParticleColorModifier.cpp
@@ -12,20 +12,20 @@ NiParticleColorModifier::NiParticleColorModifier() NI_PARTICLE_COLOR_MODIFIER_CO
 
 NiParticleColorModifier::~NiParticleColorModifier() {}
 
-void NiParticleColorModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleColorModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleColorModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleColorModifier::GetRefs() const {
diff --git a/src/obj/NiParticleGrowFade.cpp b/src/obj/NiParticleGrowFade.cpp
index d803fbcf85919dca1c02ea4afbe59930fdb97912..8ac1f794f2bfce46c168e3b93c4f638a7563c612 100644
--- a/src/obj/NiParticleGrowFade.cpp
+++ b/src/obj/NiParticleGrowFade.cpp
@@ -11,20 +11,20 @@ NiParticleGrowFade::NiParticleGrowFade() NI_PARTICLE_GROW_FADE_CONSTRUCT {}
 
 NiParticleGrowFade::~NiParticleGrowFade() {}
 
-void NiParticleGrowFade::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleGrowFade::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleGrowFade::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleGrowFade::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleGrowFade::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleGrowFade::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleGrowFade::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleGrowFade::GetRefs() const {
diff --git a/src/obj/NiParticleMeshModifier.cpp b/src/obj/NiParticleMeshModifier.cpp
index c00ec9eaf9976591b716247aeb730e4469e27b6e..24812ea79d19ebbc489e945dafb74e47832134d1 100644
--- a/src/obj/NiParticleMeshModifier.cpp
+++ b/src/obj/NiParticleMeshModifier.cpp
@@ -12,20 +12,20 @@ NiParticleMeshModifier::NiParticleMeshModifier() NI_PARTICLE_MESH_MODIFIER_CONST
 
 NiParticleMeshModifier::~NiParticleMeshModifier() {}
 
-void NiParticleMeshModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshModifier::GetRefs() const {
diff --git a/src/obj/NiParticleMeshes.cpp b/src/obj/NiParticleMeshes.cpp
index b8bb43fa6e4078c37f29b9c314383e2f74afb715..dc78081a7b5a6abae041ee588dc1e084593e48aa 100644
--- a/src/obj/NiParticleMeshes.cpp
+++ b/src/obj/NiParticleMeshes.cpp
@@ -11,20 +11,20 @@ NiParticleMeshes::NiParticleMeshes() NI_PARTICLE_MESHES_CONSTRUCT {}
 
 NiParticleMeshes::~NiParticleMeshes() {}
 
-void NiParticleMeshes::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshes::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshes::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshes::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshes::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshes::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshes::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshes::GetRefs() const {
diff --git a/src/obj/NiParticleMeshesData.cpp b/src/obj/NiParticleMeshesData.cpp
index b995e5dd9c3dde8a3c1024c8b45a37e1bfe8662b..2bcb9ab5ebd4dab9357d04458ebc2a0aa9d3c104 100644
--- a/src/obj/NiParticleMeshesData.cpp
+++ b/src/obj/NiParticleMeshesData.cpp
@@ -12,20 +12,20 @@ NiParticleMeshesData::NiParticleMeshesData() NI_PARTICLE_MESHES_DATA_CONSTRUCT {
 
 NiParticleMeshesData::~NiParticleMeshesData() {}
 
-void NiParticleMeshesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshesData::GetRefs() const {
diff --git a/src/obj/NiParticleRotation.cpp b/src/obj/NiParticleRotation.cpp
index d9c51bf3962302efec2bb356ac8fa574f666a5a9..a55791a559248f33b866a224a863da8f13d042e3 100644
--- a/src/obj/NiParticleRotation.cpp
+++ b/src/obj/NiParticleRotation.cpp
@@ -11,20 +11,20 @@ NiParticleRotation::NiParticleRotation() NI_PARTICLE_ROTATION_CONSTRUCT {}
 
 NiParticleRotation::~NiParticleRotation() {}
 
-void NiParticleRotation::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleRotation::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleRotation::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleRotation::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleRotation::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleRotation::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleRotation::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleRotation::GetRefs() const {
diff --git a/src/obj/NiParticleSystem.cpp b/src/obj/NiParticleSystem.cpp
index ca1d43fcccce3bd9261bf8e640e8065f0495e3e7..2866766a2fec998cbcda7c554899969c1bedf93e 100644
--- a/src/obj/NiParticleSystem.cpp
+++ b/src/obj/NiParticleSystem.cpp
@@ -12,20 +12,20 @@ NiParticleSystem::NiParticleSystem() NI_PARTICLE_SYSTEM_CONSTRUCT {}
 
 NiParticleSystem::~NiParticleSystem() {}
 
-void NiParticleSystem::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleSystem::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleSystem::GetRefs() const {
diff --git a/src/obj/NiParticleSystemController.cpp b/src/obj/NiParticleSystemController.cpp
index 44bf011f6d2e62363747a710b66101f6b685aa15..b7ab5a10cb5a355cd51df7434b90b5be0520e5b7 100644
--- a/src/obj/NiParticleSystemController.cpp
+++ b/src/obj/NiParticleSystemController.cpp
@@ -14,20 +14,20 @@ NiParticleSystemController::NiParticleSystemController() NI_PARTICLE_SYSTEM_CONT
 
 NiParticleSystemController::~NiParticleSystemController() {}
 
-void NiParticleSystemController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleSystemController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleSystemController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleSystemController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleSystemController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleSystemController::GetRefs() const {
diff --git a/src/obj/NiParticles.cpp b/src/obj/NiParticles.cpp
index 04c31fea23e5f6323515af2dac5272ef367ad2a2..f24464e9421b8b187ab0647427489fd64de2c871 100644
--- a/src/obj/NiParticles.cpp
+++ b/src/obj/NiParticles.cpp
@@ -11,20 +11,20 @@ NiParticles::NiParticles() NI_PARTICLES_CONSTRUCT {}
 
 NiParticles::~NiParticles() {}
 
-void NiParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticles::GetRefs() const {
diff --git a/src/obj/NiParticlesData.cpp b/src/obj/NiParticlesData.cpp
index 874301adc91e17d63d55f9268a42760f1b375092..f9e315fb13e166344cf2e6bc5d2f57187c3efe84 100644
--- a/src/obj/NiParticlesData.cpp
+++ b/src/obj/NiParticlesData.cpp
@@ -11,20 +11,20 @@ NiParticlesData::NiParticlesData() NI_PARTICLES_DATA_CONSTRUCT {}
 
 NiParticlesData::~NiParticlesData() {}
 
-void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticlesData::GetRefs() const {
diff --git a/src/obj/NiPathController.cpp b/src/obj/NiPathController.cpp
index 77d90b5627908bd9c54cfd015cfd98b9c8350eda..1aa726a31dbd248015f1392b199c314341aa4137 100644
--- a/src/obj/NiPathController.cpp
+++ b/src/obj/NiPathController.cpp
@@ -13,20 +13,20 @@ NiPathController::NiPathController() NI_PATH_CONTROLLER_CONSTRUCT {}
 
 NiPathController::~NiPathController() {}
 
-void NiPathController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPathController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPathController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPathController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPathController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPathController::GetRefs() const {
diff --git a/src/obj/NiPathInterpolator.cpp b/src/obj/NiPathInterpolator.cpp
index e59456a954d596492ee6892103d2d76cbdf8e806..659178c8409d4104d3bc2fb8e29882b63a483a67 100644
--- a/src/obj/NiPathInterpolator.cpp
+++ b/src/obj/NiPathInterpolator.cpp
@@ -13,20 +13,20 @@ NiPathInterpolator::NiPathInterpolator() NI_PATH_INTERPOLATOR_CONSTRUCT {}
 
 NiPathInterpolator::~NiPathInterpolator() {}
 
-void NiPathInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPathInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPathInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPathInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPathInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPathInterpolator::GetRefs() const {
diff --git a/src/obj/NiPixelData.cpp b/src/obj/NiPixelData.cpp
index ee4c031b65ae7610670299ad25c539d1eb078c7b..7aadf9bd563fe8bb267235c4a7bad17df4b51f5b 100644
--- a/src/obj/NiPixelData.cpp
+++ b/src/obj/NiPixelData.cpp
@@ -14,20 +14,20 @@ NiPixelData::NiPixelData() NI_PIXEL_DATA_CONSTRUCT {}
 
 NiPixelData::~NiPixelData() {}
 
-void NiPixelData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPixelData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPixelData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPixelData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPixelData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPixelData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPixelData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPixelData::GetRefs() const {
diff --git a/src/obj/NiPlanarCollider.cpp b/src/obj/NiPlanarCollider.cpp
index 421e83031c2a2a2fc14b901173e05d563b18c0aa..71a96f61fe02b529dbab21d4132f9103c9afe23c 100644
--- a/src/obj/NiPlanarCollider.cpp
+++ b/src/obj/NiPlanarCollider.cpp
@@ -11,20 +11,20 @@ NiPlanarCollider::NiPlanarCollider() NI_PLANAR_COLLIDER_CONSTRUCT {}
 
 NiPlanarCollider::~NiPlanarCollider() {}
 
-void NiPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPlanarCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPlanarCollider::GetRefs() const {
diff --git a/src/obj/NiPoint3Interpolator.cpp b/src/obj/NiPoint3Interpolator.cpp
index 321a44785b66d5cd82b3017945a9b05a0867d86d..9943ab6185cccde22e021e46af7c8f6a0a28bed1 100644
--- a/src/obj/NiPoint3Interpolator.cpp
+++ b/src/obj/NiPoint3Interpolator.cpp
@@ -12,20 +12,20 @@ NiPoint3Interpolator::NiPoint3Interpolator() NI_POINT3_INTERPOLATOR_CONSTRUCT {}
 
 NiPoint3Interpolator::~NiPoint3Interpolator() {}
 
-void NiPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiPointLight.cpp b/src/obj/NiPointLight.cpp
index 7d2d571e3d78cedb2c8a8f2cf40411b195fb3a3e..fb711e77918fda105b8bd872c8e4445d24b10975 100644
--- a/src/obj/NiPointLight.cpp
+++ b/src/obj/NiPointLight.cpp
@@ -11,20 +11,20 @@ NiPointLight::NiPointLight() NI_POINT_LIGHT_CONSTRUCT {}
 
 NiPointLight::~NiPointLight() {}
 
-void NiPointLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPointLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPointLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPointLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPointLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPointLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPointLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPointLight::GetRefs() const {
diff --git a/src/obj/NiPosData.cpp b/src/obj/NiPosData.cpp
index 79de5011b25839d325725810a153b9f79559628a..33e69ab302ef3616d42670a3bd4866ea57b2c1fd 100644
--- a/src/obj/NiPosData.cpp
+++ b/src/obj/NiPosData.cpp
@@ -12,20 +12,20 @@ NiPosData::NiPosData() NI_POS_DATA_CONSTRUCT {}
 
 NiPosData::~NiPosData() {}
 
-void NiPosData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPosData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPosData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPosData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPosData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPosData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPosData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPosData::GetRefs() const {
diff --git a/src/obj/NiProperty.cpp b/src/obj/NiProperty.cpp
index cbade92fde8dcc2e103b21e10e41a58031aeea1d..e70d314db0f1c079c3aa0bfd0f4694cfe9795bc8 100644
--- a/src/obj/NiProperty.cpp
+++ b/src/obj/NiProperty.cpp
@@ -11,20 +11,20 @@ NiProperty::NiProperty() NI_PROPERTY_CONSTRUCT {}
 
 NiProperty::~NiProperty() {}
 
-void NiProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiProperty::GetRefs() const {
diff --git a/src/obj/NiRangeLODData.cpp b/src/obj/NiRangeLODData.cpp
index dcea35de68376a8e7c1f6de28a373cdce63d8a41..f2e6016c167a37218129876cccfdc48111135ae5 100644
--- a/src/obj/NiRangeLODData.cpp
+++ b/src/obj/NiRangeLODData.cpp
@@ -12,20 +12,20 @@ NiRangeLODData::NiRangeLODData() NI_RANGE_L_O_D_DATA_CONSTRUCT {}
 
 NiRangeLODData::~NiRangeLODData() {}
 
-void NiRangeLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRangeLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRangeLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRangeLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRangeLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRangeLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRangeLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRangeLODData::GetRefs() const {
diff --git a/src/obj/NiRotatingParticles.cpp b/src/obj/NiRotatingParticles.cpp
index 75fddfa4ee7be75e6a8a4f98c2f8ba9a1876508b..424d46e0b21ddd78b7bfe11f13f65e77f415fcbe 100644
--- a/src/obj/NiRotatingParticles.cpp
+++ b/src/obj/NiRotatingParticles.cpp
@@ -11,20 +11,20 @@ NiRotatingParticles::NiRotatingParticles() NI_ROTATING_PARTICLES_CONSTRUCT {}
 
 NiRotatingParticles::~NiRotatingParticles() {}
 
-void NiRotatingParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRotatingParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRotatingParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRotatingParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRotatingParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRotatingParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRotatingParticles::GetRefs() const {
diff --git a/src/obj/NiRotatingParticlesData.cpp b/src/obj/NiRotatingParticlesData.cpp
index 754ef6bd6fc04be81aed84756e0cf9a6f06c9cf6..6f4a482bdac3d31c20a9283bb4cd5d1b24fc96ae 100644
--- a/src/obj/NiRotatingParticlesData.cpp
+++ b/src/obj/NiRotatingParticlesData.cpp
@@ -11,20 +11,20 @@ NiRotatingParticlesData::NiRotatingParticlesData() NI_ROTATING_PARTICLES_DATA_CO
 
 NiRotatingParticlesData::~NiRotatingParticlesData() {}
 
-void NiRotatingParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRotatingParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRotatingParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRotatingParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRotatingParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRotatingParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRotatingParticlesData::GetRefs() const {
diff --git a/src/obj/NiScreenLODData.cpp b/src/obj/NiScreenLODData.cpp
index 5c0ac37d0e746eda48f94aec9aaa2eeb780506fc..c698240888cc1647a33343e3b80a8d33e4d0e6c6 100644
--- a/src/obj/NiScreenLODData.cpp
+++ b/src/obj/NiScreenLODData.cpp
@@ -11,20 +11,20 @@ NiScreenLODData::NiScreenLODData() NI_SCREEN_L_O_D_DATA_CONSTRUCT {}
 
 NiScreenLODData::~NiScreenLODData() {}
 
-void NiScreenLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiScreenLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiScreenLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiScreenLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiScreenLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiScreenLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiScreenLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiScreenLODData::GetRefs() const {
diff --git a/src/obj/NiSequenceStreamHelper.cpp b/src/obj/NiSequenceStreamHelper.cpp
index 93ce556361e07d39ac0a675778f1108102bff6f4..3976c0f8322d972990bf5c9f6d93bef33a7b02ee 100644
--- a/src/obj/NiSequenceStreamHelper.cpp
+++ b/src/obj/NiSequenceStreamHelper.cpp
@@ -11,20 +11,20 @@ NiSequenceStreamHelper::NiSequenceStreamHelper() NI_SEQUENCE_STREAM_HELPER_CONST
 
 NiSequenceStreamHelper::~NiSequenceStreamHelper() {}
 
-void NiSequenceStreamHelper::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSequenceStreamHelper::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSequenceStreamHelper::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSequenceStreamHelper::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSequenceStreamHelper::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSequenceStreamHelper::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSequenceStreamHelper::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSequenceStreamHelper::GetRefs() const {
diff --git a/src/obj/NiShadeProperty.cpp b/src/obj/NiShadeProperty.cpp
index e9397a2c155db9a46d58b48b41aac1e622c80ddd..aa95e9cf00f6bbf8332eb90752ce30a7e582f68c 100644
--- a/src/obj/NiShadeProperty.cpp
+++ b/src/obj/NiShadeProperty.cpp
@@ -11,20 +11,20 @@ NiShadeProperty::NiShadeProperty() NI_SHADE_PROPERTY_CONSTRUCT {}
 
 NiShadeProperty::~NiShadeProperty() {}
 
-void NiShadeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiShadeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiShadeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiShadeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiShadeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiShadeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiShadeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiShadeProperty::GetRefs() const {
diff --git a/src/obj/NiSingleInterpolatorController.cpp b/src/obj/NiSingleInterpolatorController.cpp
index 036f2e655cf9e95349367641b6fea5bce6f3ef89..95a9a1dcf039be2320f231f8f853457fbf120710 100644
--- a/src/obj/NiSingleInterpolatorController.cpp
+++ b/src/obj/NiSingleInterpolatorController.cpp
@@ -12,20 +12,20 @@ NiSingleInterpolatorController::NiSingleInterpolatorController() NI_SINGLE_INTER
 
 NiSingleInterpolatorController::~NiSingleInterpolatorController() {}
 
-void NiSingleInterpolatorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSingleInterpolatorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSingleInterpolatorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSingleInterpolatorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSingleInterpolatorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSingleInterpolatorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSingleInterpolatorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSingleInterpolatorController::GetRefs() const {
diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp
index df8924edd23ce29869d32cd8bf6de72009a81625..448428fd8ed0e20a4a611141278cd7e8a17e8a62 100644
--- a/src/obj/NiSkinData.cpp
+++ b/src/obj/NiSkinData.cpp
@@ -17,20 +17,20 @@ NiSkinData::NiSkinData() NI_SKIN_DATA_CONSTRUCT {}
 
 NiSkinData::~NiSkinData() {}
 
-void NiSkinData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSkinData::GetRefs() const {
diff --git a/src/obj/NiSkinInstance.cpp b/src/obj/NiSkinInstance.cpp
index 694537de75eebc4b0018d8e59808595d9ac078f1..6794b7619e85061308e4dd89eb82835ba9b2de88 100644
--- a/src/obj/NiSkinInstance.cpp
+++ b/src/obj/NiSkinInstance.cpp
@@ -59,20 +59,20 @@ NiSkinInstance::~NiSkinInstance() {
 	}
 }
 
-void NiSkinInstance::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinInstance::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinInstance::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 
 	//Inform newly fixed skeleton root of attachment
 	if ( skeletonRoot != NULL ) {
diff --git a/src/obj/NiSkinPartition.cpp b/src/obj/NiSkinPartition.cpp
index 93cae0310c7189f764f09283056d613d26c87310..6f9291fed8107eec624523768a7687ceec03a400 100644
--- a/src/obj/NiSkinPartition.cpp
+++ b/src/obj/NiSkinPartition.cpp
@@ -31,20 +31,20 @@ NiSkinPartition::NiSkinPartition() NI_SKIN_PARTITION_CONSTRUCT {}
 
 NiSkinPartition::~NiSkinPartition() {}
 
-void NiSkinPartition::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinPartition::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinPartition::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinPartition::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinPartition::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinPartition::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinPartition::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSkinPartition::GetRefs() const {
diff --git a/src/obj/NiSourceTexture.cpp b/src/obj/NiSourceTexture.cpp
index 46114bb0a8ebd007e8627c6f7eb9a6e314af3ba6..ddf2773d9d0dc107f3881e79982f97865d18cd5b 100644
--- a/src/obj/NiSourceTexture.cpp
+++ b/src/obj/NiSourceTexture.cpp
@@ -13,20 +13,20 @@ NiSourceTexture::NiSourceTexture() NI_SOURCE_TEXTURE_CONSTRUCT {}
 
 NiSourceTexture::~NiSourceTexture() {}
 
-void NiSourceTexture::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSourceTexture::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSourceTexture::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSourceTexture::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSourceTexture::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSourceTexture::GetRefs() const {
diff --git a/src/obj/NiSpecularProperty.cpp b/src/obj/NiSpecularProperty.cpp
index 3d312b10040fbb5bf5d9ae495293346545b4c953..35e020a6057683c0b951918bf3e0ae579b1c1b23 100644
--- a/src/obj/NiSpecularProperty.cpp
+++ b/src/obj/NiSpecularProperty.cpp
@@ -11,20 +11,20 @@ NiSpecularProperty::NiSpecularProperty() NI_SPECULAR_PROPERTY_CONSTRUCT {}
 
 NiSpecularProperty::~NiSpecularProperty() {}
 
-void NiSpecularProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSpecularProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSpecularProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSpecularProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSpecularProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSpecularProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSpecularProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSpecularProperty::GetRefs() const {
diff --git a/src/obj/NiSphericalCollider.cpp b/src/obj/NiSphericalCollider.cpp
index b0d7d3891888ef2b7f7f05b17e0848c73ada3989..d9ff0066e2b52e814cad3932df19273ece86b949 100644
--- a/src/obj/NiSphericalCollider.cpp
+++ b/src/obj/NiSphericalCollider.cpp
@@ -11,20 +11,20 @@ NiSphericalCollider::NiSphericalCollider() NI_SPHERICAL_COLLIDER_CONSTRUCT {}
 
 NiSphericalCollider::~NiSphericalCollider() {}
 
-void NiSphericalCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSphericalCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSphericalCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSphericalCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSphericalCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSphericalCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSphericalCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSphericalCollider::GetRefs() const {
diff --git a/src/obj/NiSpotLight.cpp b/src/obj/NiSpotLight.cpp
index 2773c301ef9328e45bdc6bddc583b4980cbb6e8b..164b9174ad1ed0daa247112b0862cc387368c2a9 100644
--- a/src/obj/NiSpotLight.cpp
+++ b/src/obj/NiSpotLight.cpp
@@ -11,20 +11,20 @@ NiSpotLight::NiSpotLight() NI_SPOT_LIGHT_CONSTRUCT {}
 
 NiSpotLight::~NiSpotLight() {}
 
-void NiSpotLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSpotLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSpotLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSpotLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSpotLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSpotLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSpotLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSpotLight::GetRefs() const {
diff --git a/src/obj/NiStencilProperty.cpp b/src/obj/NiStencilProperty.cpp
index a78e2c35829906b0abd3d6e8b067a3d2e2ee417c..08b968cf6e883f373061b243437e15a215f97713 100644
--- a/src/obj/NiStencilProperty.cpp
+++ b/src/obj/NiStencilProperty.cpp
@@ -11,20 +11,20 @@ NiStencilProperty::NiStencilProperty() NI_STENCIL_PROPERTY_CONSTRUCT {}
 
 NiStencilProperty::~NiStencilProperty() {}
 
-void NiStencilProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStencilProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStencilProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStencilProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStencilProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStencilProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStencilProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStencilProperty::GetRefs() const {
diff --git a/src/obj/NiStringExtraData.cpp b/src/obj/NiStringExtraData.cpp
index 55a7c3717adfb40b6e04d35656150e01aa87f1c1..d26406592b6404762469162e96c8915ea2467358 100644
--- a/src/obj/NiStringExtraData.cpp
+++ b/src/obj/NiStringExtraData.cpp
@@ -11,20 +11,20 @@ NiStringExtraData::NiStringExtraData() NI_STRING_EXTRA_DATA_CONSTRUCT {}
 
 NiStringExtraData::~NiStringExtraData() {}
 
-void NiStringExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringExtraData::GetRefs() const {
diff --git a/src/obj/NiStringPalette.cpp b/src/obj/NiStringPalette.cpp
index 9a4f7d6df73e481b5a58f779c0ed3a2e29d7846b..a513746fae0309ebc1a2b842243f5100136438ab 100644
--- a/src/obj/NiStringPalette.cpp
+++ b/src/obj/NiStringPalette.cpp
@@ -12,20 +12,20 @@ NiStringPalette::NiStringPalette() NI_STRING_PALETTE_CONSTRUCT {}
 
 NiStringPalette::~NiStringPalette() {}
 
-void NiStringPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringPalette::GetRefs() const {
diff --git a/src/obj/NiStringsExtraData.cpp b/src/obj/NiStringsExtraData.cpp
index 20c3ee3fdb313c34185d4aaa8dbf262671fef170..4581ef56eb85cd5f8f5f3ccce7d5679e07744a65 100644
--- a/src/obj/NiStringsExtraData.cpp
+++ b/src/obj/NiStringsExtraData.cpp
@@ -11,20 +11,20 @@ NiStringsExtraData::NiStringsExtraData() NI_STRINGS_EXTRA_DATA_CONSTRUCT {}
 
 NiStringsExtraData::~NiStringsExtraData() {}
 
-void NiStringsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringsExtraData::GetRefs() const {
diff --git a/src/obj/NiTextKeyExtraData.cpp b/src/obj/NiTextKeyExtraData.cpp
index 0965b1f15af6ebb8b860d6499c06a164c1531ef1..7a3aefe778a7270d5ab36b0b733d3f830987581b 100644
--- a/src/obj/NiTextKeyExtraData.cpp
+++ b/src/obj/NiTextKeyExtraData.cpp
@@ -11,20 +11,20 @@ NiTextKeyExtraData::NiTextKeyExtraData() NI_TEXT_KEY_EXTRA_DATA_CONSTRUCT {}
 
 NiTextKeyExtraData::~NiTextKeyExtraData() {}
 
-void NiTextKeyExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextKeyExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextKeyExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextKeyExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextKeyExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextKeyExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextKeyExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextKeyExtraData::GetRefs() const {
diff --git a/src/obj/NiTextureEffect.cpp b/src/obj/NiTextureEffect.cpp
index 820999c464922bddcfa0e062071a1ebb661ac64d..835563397704171b0251d8465c256edf215207ea 100644
--- a/src/obj/NiTextureEffect.cpp
+++ b/src/obj/NiTextureEffect.cpp
@@ -12,20 +12,20 @@ NiTextureEffect::NiTextureEffect() NI_TEXTURE_EFFECT_CONSTRUCT {}
 
 NiTextureEffect::~NiTextureEffect() {}
 
-void NiTextureEffect::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureEffect::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureEffect::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureEffect::GetRefs() const {
diff --git a/src/obj/NiTextureModeProperty.cpp b/src/obj/NiTextureModeProperty.cpp
index 4010601b9431886bd70f2510651a41e744891802..77b098cedf085d705bec6e3e1e9c739388b46a60 100644
--- a/src/obj/NiTextureModeProperty.cpp
+++ b/src/obj/NiTextureModeProperty.cpp
@@ -11,20 +11,20 @@ NiTextureModeProperty::NiTextureModeProperty() NI_TEXTURE_MODE_PROPERTY_CONSTRUC
 
 NiTextureModeProperty::~NiTextureModeProperty() {}
 
-void NiTextureModeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureModeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureModeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureModeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureModeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureModeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureModeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureModeProperty::GetRefs() const {
diff --git a/src/obj/NiTextureProperty.cpp b/src/obj/NiTextureProperty.cpp
index e3aae4862bf0128409611c7bc58bbce035aaaed0..d72815079d1af2e633ee4962ae82619f241e48d6 100644
--- a/src/obj/NiTextureProperty.cpp
+++ b/src/obj/NiTextureProperty.cpp
@@ -12,20 +12,20 @@ NiTextureProperty::NiTextureProperty() NI_TEXTURE_PROPERTY_CONSTRUCT {}
 
 NiTextureProperty::~NiTextureProperty() {}
 
-void NiTextureProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureProperty::GetRefs() const {
diff --git a/src/obj/NiTextureTransformController.cpp b/src/obj/NiTextureTransformController.cpp
index 3d079c30d4c0348db2b8c0920448f01556e6dad9..fd4382db68d41065f49b1c8e90055e82bb297e80 100644
--- a/src/obj/NiTextureTransformController.cpp
+++ b/src/obj/NiTextureTransformController.cpp
@@ -12,20 +12,20 @@ NiTextureTransformController::NiTextureTransformController() NI_TEXTURE_TRANSFOR
 
 NiTextureTransformController::~NiTextureTransformController() {}
 
-void NiTextureTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureTransformController::GetRefs() const {
diff --git a/src/obj/NiTexturingProperty.cpp b/src/obj/NiTexturingProperty.cpp
index 007424546964dabcd2cbf5078a1a17c235d16a7b..a8a588b17998eccbd248b31e8e588c0837821baa 100644
--- a/src/obj/NiTexturingProperty.cpp
+++ b/src/obj/NiTexturingProperty.cpp
@@ -13,20 +13,20 @@ NiTexturingProperty::NiTexturingProperty() NI_TEXTURING_PROPERTY_CONSTRUCT {}
 
 NiTexturingProperty::~NiTexturingProperty() {}
 
-void NiTexturingProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTexturingProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTexturingProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTexturingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTexturingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTexturingProperty::GetRefs() const {
diff --git a/src/obj/NiTimeController.cpp b/src/obj/NiTimeController.cpp
index c583566d5d5ed52f8230486c0ec56222d6303962..5d580c2fd4e6e37e5e83d23697e7360e906b9f28 100644
--- a/src/obj/NiTimeController.cpp
+++ b/src/obj/NiTimeController.cpp
@@ -12,20 +12,20 @@ NiTimeController::NiTimeController() NI_TIME_CONTROLLER_CONSTRUCT {}
 
 NiTimeController::~NiTimeController() {}
 
-void NiTimeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTimeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTimeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTimeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTimeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTimeController::GetRefs() const {
diff --git a/src/obj/NiTransformController.cpp b/src/obj/NiTransformController.cpp
index 9f936a2fee0f705a7a9a71e5ebb81b2ea7fffd88..742b31d1365613598478027c6d2a9a287a5e8b0a 100644
--- a/src/obj/NiTransformController.cpp
+++ b/src/obj/NiTransformController.cpp
@@ -11,20 +11,20 @@ NiTransformController::NiTransformController() NI_TRANSFORM_CONTROLLER_CONSTRUCT
 
 NiTransformController::~NiTransformController() {}
 
-void NiTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformController::GetRefs() const {
diff --git a/src/obj/NiTransformData.cpp b/src/obj/NiTransformData.cpp
index db46591f5e4d72fa0319aa26e94efaf9a0b28c81..e6f56314097b84e7add9f8ddd963eba563474b86 100644
--- a/src/obj/NiTransformData.cpp
+++ b/src/obj/NiTransformData.cpp
@@ -11,20 +11,20 @@ NiTransformData::NiTransformData() NI_TRANSFORM_DATA_CONSTRUCT {}
 
 NiTransformData::~NiTransformData() {}
 
-void NiTransformData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformData::GetRefs() const {
diff --git a/src/obj/NiTransformInterpolator.cpp b/src/obj/NiTransformInterpolator.cpp
index b26e9ae5eb4d275129e4cec5b23c7cee141a42c2..467e5eebaa0831c3810c4cce1c5938a79b8a252d 100644
--- a/src/obj/NiTransformInterpolator.cpp
+++ b/src/obj/NiTransformInterpolator.cpp
@@ -12,20 +12,20 @@ NiTransformInterpolator::NiTransformInterpolator() NI_TRANSFORM_INTERPOLATOR_CON
 
 NiTransformInterpolator::~NiTransformInterpolator() {}
 
-void NiTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp
index a65bd465698d901d4f37d684f96bb31dd03c8414..be255c05b57539766054b5853aa3e8e45af8a0cc 100644
--- a/src/obj/NiTriBasedGeom.cpp
+++ b/src/obj/NiTriBasedGeom.cpp
@@ -18,20 +18,20 @@ NiTriBasedGeom::NiTriBasedGeom() NI_TRI_BASED_GEOM_CONSTRUCT {}
 
 NiTriBasedGeom::~NiTriBasedGeom() {}
 
-void NiTriBasedGeom::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriBasedGeom::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriBasedGeom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriBasedGeom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriBasedGeom::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriBasedGeom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriBasedGeom::GetRefs() const {
diff --git a/src/obj/NiTriBasedGeomData.cpp b/src/obj/NiTriBasedGeomData.cpp
index 148222b4e93cda6682c4b627d32d170d6239d4f7..adc97de9eff9d8d4a57f6abf7929d06ae26a2cb0 100644
--- a/src/obj/NiTriBasedGeomData.cpp
+++ b/src/obj/NiTriBasedGeomData.cpp
@@ -12,20 +12,20 @@ NiTriBasedGeomData::NiTriBasedGeomData() NI_TRI_BASED_GEOM_DATA_CONSTRUCT {}
 
 NiTriBasedGeomData::~NiTriBasedGeomData() {}
 
-void NiTriBasedGeomData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriBasedGeomData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriBasedGeomData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriBasedGeomData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriBasedGeomData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriBasedGeomData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeomData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriBasedGeomData::GetRefs() const {
diff --git a/src/obj/NiTriShape.cpp b/src/obj/NiTriShape.cpp
index b52bada72864ecdd959a132f3cc8997d2c2f3ccf..42744c1a361b063c0bfe88231d1d0cb3803414bb 100644
--- a/src/obj/NiTriShape.cpp
+++ b/src/obj/NiTriShape.cpp
@@ -11,20 +11,20 @@ NiTriShape::NiTriShape() NI_TRI_SHAPE_CONSTRUCT {}
 
 NiTriShape::~NiTriShape() {}
 
-void NiTriShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriShape::GetRefs() const {
diff --git a/src/obj/NiTriShapeData.cpp b/src/obj/NiTriShapeData.cpp
index fb7c89fc242fea23a669f0d7e103391b834edc06..4cdba1d373fb926401e914de533a63ab5514c8b6 100644
--- a/src/obj/NiTriShapeData.cpp
+++ b/src/obj/NiTriShapeData.cpp
@@ -12,20 +12,20 @@ NiTriShapeData::NiTriShapeData() NI_TRI_SHAPE_DATA_CONSTRUCT {}
 
 NiTriShapeData::~NiTriShapeData() {}
 
-void NiTriShapeData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriShapeData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriShapeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriShapeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriShapeData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriShapeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriShapeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriShapeData::GetRefs() const {
diff --git a/src/obj/NiTriStrips.cpp b/src/obj/NiTriStrips.cpp
index 6131cae87f21b0aeb4260f4e9238db523918c0df..582dba1134af8786e60e15681af2e239dc1a50b7 100644
--- a/src/obj/NiTriStrips.cpp
+++ b/src/obj/NiTriStrips.cpp
@@ -11,20 +11,20 @@ NiTriStrips::NiTriStrips() NI_TRI_STRIPS_CONSTRUCT {}
 
 NiTriStrips::~NiTriStrips() {}
 
-void NiTriStrips::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriStrips::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriStrips::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriStrips::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriStrips::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriStrips::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriStrips::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriStrips::GetRefs() const {
diff --git a/src/obj/NiTriStripsData.cpp b/src/obj/NiTriStripsData.cpp
index b36ce6523660067350b2cc10dc70bc8b61db9c93..488ee3a26e5025dd580decb463b9a45648b164e2 100644
--- a/src/obj/NiTriStripsData.cpp
+++ b/src/obj/NiTriStripsData.cpp
@@ -20,20 +20,20 @@ NiTriStripsData::NiTriStripsData() NI_TRI_STRIPS_DATA_CONSTRUCT {}
 
 NiTriStripsData::~NiTriStripsData() {}
 
-void NiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriStripsData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriStripsData::GetRefs() const {
diff --git a/src/obj/NiUVController.cpp b/src/obj/NiUVController.cpp
index ffadd60ad6b4bfe46d6d7fd38349c2592f52f0ed..ae89f5e48b524baf4dd547c1af996ca83e5765c9 100644
--- a/src/obj/NiUVController.cpp
+++ b/src/obj/NiUVController.cpp
@@ -12,20 +12,20 @@ NiUVController::NiUVController() NI_U_V_CONTROLLER_CONSTRUCT {}
 
 NiUVController::~NiUVController() {}
 
-void NiUVController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiUVController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiUVController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiUVController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiUVController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiUVController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiUVController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiUVController::GetRefs() const {
diff --git a/src/obj/NiUVData.cpp b/src/obj/NiUVData.cpp
index f635dc0d10b530f27a7f0e17d639fb0b9edcc7ad..4c83a476e0ffab2c4c4e47990ba21bcb40f052f0 100644
--- a/src/obj/NiUVData.cpp
+++ b/src/obj/NiUVData.cpp
@@ -12,20 +12,20 @@ NiUVData::NiUVData() NI_U_V_DATA_CONSTRUCT {}
 
 NiUVData::~NiUVData() {}
 
-void NiUVData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiUVData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiUVData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiUVData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiUVData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiUVData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiUVData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiUVData::GetRefs() const {
diff --git a/src/obj/NiVectorExtraData.cpp b/src/obj/NiVectorExtraData.cpp
index 81d6e399efc6a53e4173efdfbb82bcf51f56358d..4d6526b6c6f37111dc38de5e612d166190349453 100644
--- a/src/obj/NiVectorExtraData.cpp
+++ b/src/obj/NiVectorExtraData.cpp
@@ -11,20 +11,20 @@ NiVectorExtraData::NiVectorExtraData() NI_VECTOR_EXTRA_DATA_CONSTRUCT {}
 
 NiVectorExtraData::~NiVectorExtraData() {}
 
-void NiVectorExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVectorExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVectorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVectorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVectorExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVectorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVectorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVectorExtraData::GetRefs() const {
diff --git a/src/obj/NiVertWeightsExtraData.cpp b/src/obj/NiVertWeightsExtraData.cpp
index d78a614cdc44daac23428709a96b479e10a8a7c7..29bc214be488da789dd03d0fcf653bbae553a37c 100644
--- a/src/obj/NiVertWeightsExtraData.cpp
+++ b/src/obj/NiVertWeightsExtraData.cpp
@@ -11,20 +11,20 @@ NiVertWeightsExtraData::NiVertWeightsExtraData() NI_VERT_WEIGHTS_EXTRA_DATA_CONS
 
 NiVertWeightsExtraData::~NiVertWeightsExtraData() {}
 
-void NiVertWeightsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVertWeightsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVertWeightsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVertWeightsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVertWeightsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVertWeightsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVertWeightsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVertWeightsExtraData::GetRefs() const {
diff --git a/src/obj/NiVertexColorProperty.cpp b/src/obj/NiVertexColorProperty.cpp
index 2660e9635be6b254d9de5dc3b8caa6b498b55afc..bb77488988383c212dae4e895de8efc98ed0442f 100644
--- a/src/obj/NiVertexColorProperty.cpp
+++ b/src/obj/NiVertexColorProperty.cpp
@@ -11,20 +11,20 @@ NiVertexColorProperty::NiVertexColorProperty() NI_VERTEX_COLOR_PROPERTY_CONSTRUC
 
 NiVertexColorProperty::~NiVertexColorProperty() {}
 
-void NiVertexColorProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVertexColorProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVertexColorProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVertexColorProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVertexColorProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVertexColorProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVertexColorProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVertexColorProperty::GetRefs() const {
diff --git a/src/obj/NiVisController.cpp b/src/obj/NiVisController.cpp
index 079eafe6a432e0ca500dab910d58f71407ed5b24..fdd4c95a8f065c01631fcf2466e1c0a5b4e6dd99 100644
--- a/src/obj/NiVisController.cpp
+++ b/src/obj/NiVisController.cpp
@@ -12,20 +12,20 @@ NiVisController::NiVisController() NI_VIS_CONTROLLER_CONSTRUCT {}
 
 NiVisController::~NiVisController() {}
 
-void NiVisController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVisController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVisController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVisController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVisController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVisController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVisController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVisController::GetRefs() const {
diff --git a/src/obj/NiVisData.cpp b/src/obj/NiVisData.cpp
index 950ccee00b53b4d68e931070922f33ed7da9eebf..963ce87c6bfacaa508e9c645ecffcc5c9bf032d4 100644
--- a/src/obj/NiVisData.cpp
+++ b/src/obj/NiVisData.cpp
@@ -11,20 +11,20 @@ NiVisData::NiVisData() NI_VIS_DATA_CONSTRUCT {}
 
 NiVisData::~NiVisData() {}
 
-void NiVisData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVisData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVisData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVisData::GetRefs() const {
diff --git a/src/obj/NiWireframeProperty.cpp b/src/obj/NiWireframeProperty.cpp
index c5a037861a06831cdfa45cb3f68dfe96dda2fc3c..33ee8f19f332f1db88882f69a5e616b678a80fff 100644
--- a/src/obj/NiWireframeProperty.cpp
+++ b/src/obj/NiWireframeProperty.cpp
@@ -11,20 +11,20 @@ NiWireframeProperty::NiWireframeProperty() NI_WIREFRAME_PROPERTY_CONSTRUCT {}
 
 NiWireframeProperty::~NiWireframeProperty() {}
 
-void NiWireframeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiWireframeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiWireframeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiWireframeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiWireframeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiWireframeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiWireframeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiWireframeProperty::GetRefs() const {
diff --git a/src/obj/NiZBufferProperty.cpp b/src/obj/NiZBufferProperty.cpp
index 562974125813f4c72f19bd098a4aef7f1d66cde2..ee4fe42223533eccbc3cdac7e762a980540a011e 100644
--- a/src/obj/NiZBufferProperty.cpp
+++ b/src/obj/NiZBufferProperty.cpp
@@ -11,20 +11,20 @@ NiZBufferProperty::NiZBufferProperty() NI_Z_BUFFER_PROPERTY_CONSTRUCT {}
 
 NiZBufferProperty::~NiZBufferProperty() {}
 
-void NiZBufferProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiZBufferProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiZBufferProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiZBufferProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiZBufferProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiZBufferProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiZBufferProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiZBufferProperty::GetRefs() const {
diff --git a/src/obj/RootCollisionNode.cpp b/src/obj/RootCollisionNode.cpp
index d8e542823e8cbb58aa118b8beaad4da5f3c6f7c3..3efffc9893ac388d605016ad4a2885c4bfbff17e 100644
--- a/src/obj/RootCollisionNode.cpp
+++ b/src/obj/RootCollisionNode.cpp
@@ -11,20 +11,20 @@ RootCollisionNode::RootCollisionNode() ROOT_COLLISION_NODE_CONSTRUCT {}
 
 RootCollisionNode::~RootCollisionNode() {}
 
-void RootCollisionNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void RootCollisionNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void RootCollisionNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void RootCollisionNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string RootCollisionNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void RootCollisionNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void RootCollisionNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> RootCollisionNode::GetRefs() const {
diff --git a/src/obj/bhkBlendCollisionObject.cpp b/src/obj/bhkBlendCollisionObject.cpp
index efdac89d1005491d17409d569cefe861c74be16a..b6881e6e5d0f34313459e6506923d702d0c1aefc 100644
--- a/src/obj/bhkBlendCollisionObject.cpp
+++ b/src/obj/bhkBlendCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkBlendCollisionObject::bhkBlendCollisionObject() BHK_BLEND_COLLISION_OBJECT_CO
 
 bhkBlendCollisionObject::~bhkBlendCollisionObject() {}
 
-void bhkBlendCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBlendCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBlendCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBlendCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBlendCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBlendCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBlendCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBlendCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkBlendController.cpp b/src/obj/bhkBlendController.cpp
index 56ed241454eedcc6014ffe07ac3975d46911e068..f224d66aa97c6173610936dd1dbcbd1a598fcef5 100644
--- a/src/obj/bhkBlendController.cpp
+++ b/src/obj/bhkBlendController.cpp
@@ -11,20 +11,20 @@ bhkBlendController::bhkBlendController() BHK_BLEND_CONTROLLER_CONSTRUCT {}
 
 bhkBlendController::~bhkBlendController() {}
 
-void bhkBlendController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBlendController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBlendController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBlendController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBlendController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBlendController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBlendController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBlendController::GetRefs() const {
diff --git a/src/obj/bhkBoxShape.cpp b/src/obj/bhkBoxShape.cpp
index 5dc8c6bfbd7ca404bf7a1a463d65d15a7b88f5d7..ceabc9ada2a893e7b2fac046ca2057bea5259263 100644
--- a/src/obj/bhkBoxShape.cpp
+++ b/src/obj/bhkBoxShape.cpp
@@ -11,20 +11,20 @@ bhkBoxShape::bhkBoxShape() BHK_BOX_SHAPE_CONSTRUCT {}
 
 bhkBoxShape::~bhkBoxShape() {}
 
-void bhkBoxShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBoxShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBoxShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBoxShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBoxShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBoxShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBoxShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBoxShape::GetRefs() const {
diff --git a/src/obj/bhkCapsuleShape.cpp b/src/obj/bhkCapsuleShape.cpp
index 7d01c6c5fb0384e2c21e6fbe18ae5a5686f7d4c8..5fc4801834aeb3de9c54ea0b74078da1644dad49 100644
--- a/src/obj/bhkCapsuleShape.cpp
+++ b/src/obj/bhkCapsuleShape.cpp
@@ -11,20 +11,20 @@ bhkCapsuleShape::bhkCapsuleShape() BHK_CAPSULE_SHAPE_CONSTRUCT {}
 
 bhkCapsuleShape::~bhkCapsuleShape() {}
 
-void bhkCapsuleShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkCapsuleShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkCapsuleShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkCapsuleShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkCapsuleShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkCapsuleShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkCapsuleShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkCapsuleShape::GetRefs() const {
diff --git a/src/obj/bhkCollisionObject.cpp b/src/obj/bhkCollisionObject.cpp
index dfce63d33c0b95035d5fb1555e76290fabaccb03..478087475e6fca217e81dfae91f88b80cbbca586 100644
--- a/src/obj/bhkCollisionObject.cpp
+++ b/src/obj/bhkCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkCollisionObject::bhkCollisionObject() BHK_COLLISION_OBJECT_CONSTRUCT {}
 
 bhkCollisionObject::~bhkCollisionObject() {}
 
-void bhkCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkConvexShape.cpp b/src/obj/bhkConvexShape.cpp
index 9630c36b2514408d70b1e68a1bf580eddf7639fb..bfd811a1f398517da829d6f14c710d2026ffc64b 100644
--- a/src/obj/bhkConvexShape.cpp
+++ b/src/obj/bhkConvexShape.cpp
@@ -11,20 +11,20 @@ bhkConvexShape::bhkConvexShape() BHK_CONVEX_SHAPE_CONSTRUCT {}
 
 bhkConvexShape::~bhkConvexShape() {}
 
-void bhkConvexShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexShape::GetRefs() const {
diff --git a/src/obj/bhkConvexTransformShape.cpp b/src/obj/bhkConvexTransformShape.cpp
index 4eedc742d253976ddd646146cf0d7e7ca8dc4ff8..9581d2c8498664986bfd4b83af03b88e287b80a0 100644
--- a/src/obj/bhkConvexTransformShape.cpp
+++ b/src/obj/bhkConvexTransformShape.cpp
@@ -11,20 +11,20 @@ bhkConvexTransformShape::bhkConvexTransformShape() BHK_CONVEX_TRANSFORM_SHAPE_CO
 
 bhkConvexTransformShape::~bhkConvexTransformShape() {}
 
-void bhkConvexTransformShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexTransformShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexTransformShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexTransformShape::GetRefs() const {
diff --git a/src/obj/bhkConvexVerticesShape.cpp b/src/obj/bhkConvexVerticesShape.cpp
index 21f204480a32640c019b9b720ce42b26aa5a640b..25f84aa0183ef672ca4e644dc2153ff9d242de39 100644
--- a/src/obj/bhkConvexVerticesShape.cpp
+++ b/src/obj/bhkConvexVerticesShape.cpp
@@ -11,20 +11,20 @@ bhkConvexVerticesShape::bhkConvexVerticesShape() BHK_CONVEX_VERTICES_SHAPE_CONST
 
 bhkConvexVerticesShape::~bhkConvexVerticesShape() {}
 
-void bhkConvexVerticesShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexVerticesShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexVerticesShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexVerticesShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexVerticesShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexVerticesShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexVerticesShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexVerticesShape::GetRefs() const {
diff --git a/src/obj/bhkEntity.cpp b/src/obj/bhkEntity.cpp
index a09a39989190695443790da32ec4c647639f2aed..39dfe3d0874ffc7227832840dc4a15de3fbb5c60 100644
--- a/src/obj/bhkEntity.cpp
+++ b/src/obj/bhkEntity.cpp
@@ -12,20 +12,20 @@ bhkEntity::bhkEntity() BHK_ENTITY_CONSTRUCT {}
 
 bhkEntity::~bhkEntity() {}
 
-void bhkEntity::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkEntity::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkEntity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkEntity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkEntity::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkEntity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkEntity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkEntity::GetRefs() const {
diff --git a/src/obj/bhkHingeConstraint.cpp b/src/obj/bhkHingeConstraint.cpp
index e3eb5655dc64d5752fe5f2bbb991d8a8c3256295..b0ed22c8a5eb702749c5f0b77f846719d8909662 100644
--- a/src/obj/bhkHingeConstraint.cpp
+++ b/src/obj/bhkHingeConstraint.cpp
@@ -11,20 +11,20 @@ bhkHingeConstraint::bhkHingeConstraint() BHK_HINGE_CONSTRAINT_CONSTRUCT {}
 
 bhkHingeConstraint::~bhkHingeConstraint() {}
 
-void bhkHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkHingeConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkHingeConstraint::GetRefs() const {
diff --git a/src/obj/bhkLimitedHingeConstraint.cpp b/src/obj/bhkLimitedHingeConstraint.cpp
index 3686e1daded04e95f916913eb0115a7319cef0e2..94d40ad7d557b66611a4b9a948409669ac93dad6 100644
--- a/src/obj/bhkLimitedHingeConstraint.cpp
+++ b/src/obj/bhkLimitedHingeConstraint.cpp
@@ -12,20 +12,20 @@ bhkLimitedHingeConstraint::bhkLimitedHingeConstraint() BHK_LIMITED_HINGE_CONSTRA
 
 bhkLimitedHingeConstraint::~bhkLimitedHingeConstraint() {}
 
-void bhkLimitedHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkLimitedHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkLimitedHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkLimitedHingeConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkLimitedHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkLimitedHingeConstraint::GetRefs() const {
diff --git a/src/obj/bhkListShape.cpp b/src/obj/bhkListShape.cpp
index bab6afbd2801e5ec2e35c8710d787b53b4eb8f41..45844e8caea80ce8ed5ab880dd45bdaac2351f81 100644
--- a/src/obj/bhkListShape.cpp
+++ b/src/obj/bhkListShape.cpp
@@ -12,20 +12,20 @@ bhkListShape::bhkListShape() BHK_LIST_SHAPE_CONSTRUCT {}
 
 bhkListShape::~bhkListShape() {}
 
-void bhkListShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkListShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkListShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkListShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkListShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkListShape::GetRefs() const {
diff --git a/src/obj/bhkMalleableConstraint.cpp b/src/obj/bhkMalleableConstraint.cpp
index 28baa7c5548124df5d1a9c587668e90ac15f324d..9b64467196b0aa2dc09543e27d0ddc9f64a9a480 100644
--- a/src/obj/bhkMalleableConstraint.cpp
+++ b/src/obj/bhkMalleableConstraint.cpp
@@ -14,20 +14,20 @@ bhkMalleableConstraint::bhkMalleableConstraint() BHK_MALLEABLE_CONSTRAINT_CONSTR
 
 bhkMalleableConstraint::~bhkMalleableConstraint() {}
 
-void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMalleableConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMalleableConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMalleableConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMalleableConstraint::GetRefs() const {
diff --git a/src/obj/bhkMoppBvTreeShape.cpp b/src/obj/bhkMoppBvTreeShape.cpp
index 39fc1f3ddf35293c8ce13fe78a21999d1ff678c0..ae8ee96b0ec6c35cdcfc92e27e6c2dd72969df18 100644
--- a/src/obj/bhkMoppBvTreeShape.cpp
+++ b/src/obj/bhkMoppBvTreeShape.cpp
@@ -12,20 +12,20 @@ bhkMoppBvTreeShape::bhkMoppBvTreeShape() BHK_MOPP_BV_TREE_SHAPE_CONSTRUCT {}
 
 bhkMoppBvTreeShape::~bhkMoppBvTreeShape() {}
 
-void bhkMoppBvTreeShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMoppBvTreeShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMoppBvTreeShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMoppBvTreeShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMoppBvTreeShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMoppBvTreeShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMoppBvTreeShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMoppBvTreeShape::GetRefs() const {
diff --git a/src/obj/bhkMultiSphereShape.cpp b/src/obj/bhkMultiSphereShape.cpp
index 13c06fef73c10066085f0ef57453bc5fe653a508..4e6492e4940b6eef83d359cc821264beb046ff63 100644
--- a/src/obj/bhkMultiSphereShape.cpp
+++ b/src/obj/bhkMultiSphereShape.cpp
@@ -12,20 +12,20 @@ bhkMultiSphereShape::bhkMultiSphereShape() BHK_MULTI_SPHERE_SHAPE_CONSTRUCT {}
 
 bhkMultiSphereShape::~bhkMultiSphereShape() {}
 
-void bhkMultiSphereShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMultiSphereShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMultiSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMultiSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMultiSphereShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMultiSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMultiSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMultiSphereShape::GetRefs() const {
diff --git a/src/obj/bhkNiTriStripsShape.cpp b/src/obj/bhkNiTriStripsShape.cpp
index c0187b0a6a0fe8ad2cd905a1d28ca8474f2eabe8..92f80df912145b6b186b87b4ce84e32160a47c16 100644
--- a/src/obj/bhkNiTriStripsShape.cpp
+++ b/src/obj/bhkNiTriStripsShape.cpp
@@ -12,20 +12,20 @@ bhkNiTriStripsShape::bhkNiTriStripsShape() BHK_NI_TRI_STRIPS_SHAPE_CONSTRUCT {}
 
 bhkNiTriStripsShape::~bhkNiTriStripsShape() {}
 
-void bhkNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkNiTriStripsShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkNiTriStripsShape::GetRefs() const {
diff --git a/src/obj/bhkPackedNiTriStripsShape.cpp b/src/obj/bhkPackedNiTriStripsShape.cpp
index e1640c99e20caced267188a9d9123363b4a0feb0..e1b01672b9b0b5327f5b2aca792247fb9133905c 100644
--- a/src/obj/bhkPackedNiTriStripsShape.cpp
+++ b/src/obj/bhkPackedNiTriStripsShape.cpp
@@ -12,20 +12,20 @@ bhkPackedNiTriStripsShape::bhkPackedNiTriStripsShape() BHK_PACKED_NI_TRI_STRIPS_
 
 bhkPackedNiTriStripsShape::~bhkPackedNiTriStripsShape() {}
 
-void bhkPackedNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkPackedNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkPackedNiTriStripsShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkPackedNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkPackedNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkPackedNiTriStripsShape::GetRefs() const {
diff --git a/src/obj/bhkPrismaticConstraint.cpp b/src/obj/bhkPrismaticConstraint.cpp
index dfedecb7b62e709e312b4befd9bbe3431b9e429a..871b91956ecc787780ea68ffefa5daf36c9efcb4 100644
--- a/src/obj/bhkPrismaticConstraint.cpp
+++ b/src/obj/bhkPrismaticConstraint.cpp
@@ -11,20 +11,20 @@ bhkPrismaticConstraint::bhkPrismaticConstraint() BHK_PRISMATIC_CONSTRAINT_CONSTR
 
 bhkPrismaticConstraint::~bhkPrismaticConstraint() {}
 
-void bhkPrismaticConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkPrismaticConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkPrismaticConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkPrismaticConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkPrismaticConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkPrismaticConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkPrismaticConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkPrismaticConstraint::GetRefs() const {
diff --git a/src/obj/bhkRagdollConstraint.cpp b/src/obj/bhkRagdollConstraint.cpp
index bebcc13df6dc3aa941e79634f7ebe3f864585b5c..e0122151d6066b82a1d6d4aa33b73432027805f7 100644
--- a/src/obj/bhkRagdollConstraint.cpp
+++ b/src/obj/bhkRagdollConstraint.cpp
@@ -11,20 +11,20 @@ bhkRagdollConstraint::bhkRagdollConstraint() BHK_RAGDOLL_CONSTRAINT_CONSTRUCT {}
 
 bhkRagdollConstraint::~bhkRagdollConstraint() {}
 
-void bhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRagdollConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRagdollConstraint::GetRefs() const {
diff --git a/src/obj/bhkRefObject.cpp b/src/obj/bhkRefObject.cpp
index 9035e64ebad444a6985bbdcf58859b43431cb008..7e6ca99ad6b646177c04593c3fe4aeb53047fc6c 100644
--- a/src/obj/bhkRefObject.cpp
+++ b/src/obj/bhkRefObject.cpp
@@ -11,20 +11,20 @@ bhkRefObject::bhkRefObject() BHK_REF_OBJECT_CONSTRUCT {}
 
 bhkRefObject::~bhkRefObject() {}
 
-void bhkRefObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRefObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRefObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRefObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRefObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRefObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRefObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRefObject::GetRefs() const {
diff --git a/src/obj/bhkRigidBody.cpp b/src/obj/bhkRigidBody.cpp
index 1df0cc2a8d8c93cd770761261e39bac9a620a270..bd78307858e0aaea41fc52754e6959f97a3832d7 100644
--- a/src/obj/bhkRigidBody.cpp
+++ b/src/obj/bhkRigidBody.cpp
@@ -13,20 +13,20 @@ bhkRigidBody::bhkRigidBody() BHK_RIGID_BODY_CONSTRUCT {}
 
 bhkRigidBody::~bhkRigidBody() {}
 
-void bhkRigidBody::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRigidBody::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRigidBody::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRigidBody::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRigidBody::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRigidBody::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRigidBody::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRigidBody::GetRefs() const {
diff --git a/src/obj/bhkRigidBodyT.cpp b/src/obj/bhkRigidBodyT.cpp
index 0f7d102bc3a0b36a381aa326bced44b7e8598e38..4d0d2b4e6c8faf27d9eee0d7b5db22f5224da340 100644
--- a/src/obj/bhkRigidBodyT.cpp
+++ b/src/obj/bhkRigidBodyT.cpp
@@ -11,20 +11,20 @@ bhkRigidBodyT::bhkRigidBodyT() BHK_RIGID_BODY_T_CONSTRUCT {}
 
 bhkRigidBodyT::~bhkRigidBodyT() {}
 
-void bhkRigidBodyT::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRigidBodyT::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRigidBodyT::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRigidBodyT::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRigidBodyT::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRigidBodyT::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRigidBodyT::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRigidBodyT::GetRefs() const {
diff --git a/src/obj/bhkSPCollisionObject.cpp b/src/obj/bhkSPCollisionObject.cpp
index 8cb00948fa3cd8457572568de83183f65d252cb1..6f1135c7c8ed26a50a99d76968fa26505e377315 100644
--- a/src/obj/bhkSPCollisionObject.cpp
+++ b/src/obj/bhkSPCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkSPCollisionObject::bhkSPCollisionObject() BHK_S_P_COLLISION_OBJECT_CONSTRUCT
 
 bhkSPCollisionObject::~bhkSPCollisionObject() {}
 
-void bhkSPCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSPCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSPCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSPCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSPCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSPCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSPCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSPCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkSerializable.cpp b/src/obj/bhkSerializable.cpp
index fdbd73f47a0ba5909595405e757473c3ca6b1e37..3b237d165ec86ec61e133919a4d351594aaae077 100644
--- a/src/obj/bhkSerializable.cpp
+++ b/src/obj/bhkSerializable.cpp
@@ -11,20 +11,20 @@ bhkSerializable::bhkSerializable() BHK_SERIALIZABLE_CONSTRUCT {}
 
 bhkSerializable::~bhkSerializable() {}
 
-void bhkSerializable::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSerializable::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSerializable::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSerializable::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSerializable::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSerializable::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSerializable::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSerializable::GetRefs() const {
diff --git a/src/obj/bhkShape.cpp b/src/obj/bhkShape.cpp
index d19a243677c125563faaf2e4871ab9a466be65cb..fe837574f2155f0b1733ca85a826650086e2793d 100644
--- a/src/obj/bhkShape.cpp
+++ b/src/obj/bhkShape.cpp
@@ -11,20 +11,20 @@ bhkShape::bhkShape() BHK_SHAPE_CONSTRUCT {}
 
 bhkShape::~bhkShape() {}
 
-void bhkShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkShape::GetRefs() const {
diff --git a/src/obj/bhkSimpleShapePhantom.cpp b/src/obj/bhkSimpleShapePhantom.cpp
index 7fba8498de32574291f9d358cdbb5b03b83ce60d..f14831d75b4d86c1dcd3c96c82b4524b876e812e 100644
--- a/src/obj/bhkSimpleShapePhantom.cpp
+++ b/src/obj/bhkSimpleShapePhantom.cpp
@@ -11,20 +11,20 @@ bhkSimpleShapePhantom::bhkSimpleShapePhantom() BHK_SIMPLE_SHAPE_PHANTOM_CONSTRUC
 
 bhkSimpleShapePhantom::~bhkSimpleShapePhantom() {}
 
-void bhkSimpleShapePhantom::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSimpleShapePhantom::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSimpleShapePhantom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSimpleShapePhantom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSimpleShapePhantom::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSimpleShapePhantom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSimpleShapePhantom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSimpleShapePhantom::GetRefs() const {
diff --git a/src/obj/bhkSphereRepShape.cpp b/src/obj/bhkSphereRepShape.cpp
index 7c8370e850560849f69fdf7b0e342daf19ec9a49..28fc5066462d043d3ba05c46e01a47617a2b4093 100644
--- a/src/obj/bhkSphereRepShape.cpp
+++ b/src/obj/bhkSphereRepShape.cpp
@@ -11,20 +11,20 @@ bhkSphereRepShape::bhkSphereRepShape() BHK_SPHERE_REP_SHAPE_CONSTRUCT {}
 
 bhkSphereRepShape::~bhkSphereRepShape() {}
 
-void bhkSphereRepShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSphereRepShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSphereRepShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSphereRepShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSphereRepShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSphereRepShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSphereRepShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSphereRepShape::GetRefs() const {
diff --git a/src/obj/bhkSphereShape.cpp b/src/obj/bhkSphereShape.cpp
index fda79ecfa168569fe6706978806d8f6a68198f97..e0404f5c196ee1be09c8c97582d7ec70afcc5056 100644
--- a/src/obj/bhkSphereShape.cpp
+++ b/src/obj/bhkSphereShape.cpp
@@ -11,20 +11,20 @@ bhkSphereShape::bhkSphereShape() BHK_SPHERE_SHAPE_CONSTRUCT {}
 
 bhkSphereShape::~bhkSphereShape() {}
 
-void bhkSphereShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSphereShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSphereShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSphereShape::GetRefs() const {
diff --git a/src/obj/bhkStiffSpringConstraint.cpp b/src/obj/bhkStiffSpringConstraint.cpp
index 14c924136171f69d5e19d53cbee3d28497df396d..8dbe1330e1527888fe5fda5ee44fa75b25ae2ca0 100644
--- a/src/obj/bhkStiffSpringConstraint.cpp
+++ b/src/obj/bhkStiffSpringConstraint.cpp
@@ -11,20 +11,20 @@ bhkStiffSpringConstraint::bhkStiffSpringConstraint() BHK_STIFF_SPRING_CONSTRAINT
 
 bhkStiffSpringConstraint::~bhkStiffSpringConstraint() {}
 
-void bhkStiffSpringConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkStiffSpringConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkStiffSpringConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkStiffSpringConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkStiffSpringConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkStiffSpringConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkStiffSpringConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkStiffSpringConstraint::GetRefs() const {
diff --git a/src/obj/bhkTransformShape.cpp b/src/obj/bhkTransformShape.cpp
index 366fd93abd00e27cea10eb213a6e9efed339732d..324dc4fadc5435774e75c557f773f686a102f861 100644
--- a/src/obj/bhkTransformShape.cpp
+++ b/src/obj/bhkTransformShape.cpp
@@ -11,20 +11,20 @@ bhkTransformShape::bhkTransformShape() BHK_TRANSFORM_SHAPE_CONSTRUCT {}
 
 bhkTransformShape::~bhkTransformShape() {}
 
-void bhkTransformShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkTransformShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkTransformShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkTransformShape::GetRefs() const {
diff --git a/src/obj/bhkWorldObject.cpp b/src/obj/bhkWorldObject.cpp
index 4acc8d518ec1aa64aafb8b90e38efacca53c9f9d..199a11783d5b97823ae96d189991efddec3c6f91 100644
--- a/src/obj/bhkWorldObject.cpp
+++ b/src/obj/bhkWorldObject.cpp
@@ -11,20 +11,20 @@ bhkWorldObject::bhkWorldObject() BHK_WORLD_OBJECT_CONSTRUCT {}
 
 bhkWorldObject::~bhkWorldObject() {}
 
-void bhkWorldObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkWorldObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkWorldObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkWorldObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkWorldObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkWorldObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkWorldObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkWorldObject::GetRefs() const {
diff --git a/src/obj/hkPackedNiTriStripsData.cpp b/src/obj/hkPackedNiTriStripsData.cpp
index 2fec414263accbe442e53f4edc6a6dfb2a9bbbe6..f20ae0fb46b5e032858ca4636067885eb47d4c80 100644
--- a/src/obj/hkPackedNiTriStripsData.cpp
+++ b/src/obj/hkPackedNiTriStripsData.cpp
@@ -12,20 +12,20 @@ hkPackedNiTriStripsData::hkPackedNiTriStripsData() HK_PACKED_NI_TRI_STRIPS_DATA_
 
 hkPackedNiTriStripsData::~hkPackedNiTriStripsData() {}
 
-void hkPackedNiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void hkPackedNiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void hkPackedNiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void hkPackedNiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string hkPackedNiTriStripsData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void hkPackedNiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void hkPackedNiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> hkPackedNiTriStripsData::GetRefs() const {