diff --git a/NIF_IO.cpp b/NIF_IO.cpp
index e98e8ddb5332c41d7467cfa81fba18cd18fda10e..31bae5476d54e263dceb5e9eb76f1670d18476bf 100644
--- a/NIF_IO.cpp
+++ b/NIF_IO.cpp
@@ -123,13 +123,6 @@ ostream & operator<<(ostream & lh, usVector3 const & rh) {
 /**
  * Read utility functions
  */
-int ReadUInt( istream& in ){
-
-	int tmp;
-	in.read( (char*)&tmp, 4 );
-	return tmp;
-}
-
 uint ReadUInt( istream& in ){
 
 	uint tmp;
@@ -221,11 +214,6 @@ void WriteUInt( uint val, ostream& out ){
 	out.write( (char*)&val, 4 );
 }
 
-void WriteInt( int val, ostream& out ){
-
-	out.write( (char*)&val, 4 );
-}
-
 void WriteUShort( ushort val, ostream& out ){
 
 	out.write( (char*)&val, 2 );
@@ -347,42 +335,41 @@ ostream & operator<<(ostream & lh, Bin const & rh) {
 
 //--Overloaded versions of Read/Write functions ReadData/WriteData
 
-void NifStream( int & val, istream& in ) { val = ReadInt( in ); };
-void NifStream( uint & val, istream& in ) { val = ReadUInt( in ); };
-void NifStream( ushort & val, istream& in ) { val = ReadUShort( in ); };
-void NifStream( short & val, istream& in ) { val = ReadShort( in ); };
-void NifStream( byte & val, istream& in ) { val = ReadByte( in ); };
-void NifStream( float & val, istream& in ) { val = ReadFloat( in ); };
-void NifStream( string & val, istream& in ) { val = ReadString( in ); };
-void NifStream( KeyType & val, istream& in ) { val = KeyType(ReadUInt( in )); };
+void NifStream( uint & val, istream& in, uint version ) { val = ReadUInt( in ); };
+void NifStream( ushort & val, istream& in, uint version ) { val = ReadUShort( in ); };
+void NifStream( short & val, istream& in, uint version ) { val = ReadShort( in ); };
+void NifStream( byte & val, istream& in, uint version ) { val = ReadByte( in ); };
+void NifStream( float & val, istream& in, uint version ) { val = ReadFloat( in ); };
+void NifStream( string & val, istream& in, uint version ) { val = ReadString( in ); };
+void NifStream( KeyType & val, istream& in, uint version ) { val = KeyType(ReadUInt( in )); };
 
-void NifStream( Vector3 & val, istream& in ) {
+void NifStream( Vector3 & val, istream& in, uint version ) {
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Quaternion & val, istream& in ) {
+void NifStream( Quaternion & val, istream& in, uint version ) {
 	val.w = ReadFloat( in );
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Color4 & val, istream& in ) {
+void NifStream( Color4 & val, istream& in, uint version ) {
 	val.r = ReadFloat( in );
 	val.g = ReadFloat( in );
 	val.b = ReadFloat( in );
 	val.a = ReadFloat( in );
 };
 
-void NifStream( Triangle & val, istream& in ) {
+void NifStream( Triangle & val, istream& in, uint version ) {
 	val.v1 = ReadUShort( in );
 	val.v2 = ReadUShort( in );
 	val.v3 = ReadUShort( in );
 };
 
-void NifStream( LODRange & val, istream& in ) {
+void NifStream( LODRange & val, istream& in, uint version ) {
 	val.near = ReadFloat( in );
 	val.far = ReadFloat( in );
 };
@@ -427,37 +414,36 @@ void NifStream( TexDesc & val, istream& in, uint version ) {
 
 
 
-void NifStream( uint const & val, ostream& out ) { WriteUInt( val, out ); }
-void NifStream( int const & val, ostream& out ) { WriteInt( val, out ); }
-void NifStream( ushort const & val, ostream& out ) { WriteUShort( val, out ); }
-void NifStream( short const & val, ostream& out ) { WriteShort( val, out ); }
-void NifStream( byte const & val, ostream& out ) { WriteByte( val, out ); }
-void NifStream( float const & val, ostream& out ) { WriteFloat( val, out ); }
-void NifStream( string const & val, ostream& out ) { WriteString( val, out ); }
-void NifStream( KeyType const & val, ostream& out ) { WriteUInt( val, out ); }
-void NifStream( Vector3 const & val, ostream& out ) {
+void NifStream( uint const & val, ostream& out, uint version ) { WriteUInt( val, out ); }
+void NifStream( ushort const & val, ostream& out, uint version ) { WriteUShort( val, out ); }
+void NifStream( short const & val, ostream& out, uint version ) { WriteShort( val, out ); }
+void NifStream( byte const & val, ostream& out, uint version ) { WriteByte( val, out ); }
+void NifStream( float const & val, ostream& out, uint version ) { WriteFloat( val, out ); }
+void NifStream( string const & val, ostream& out, uint version ) { WriteString( val, out ); }
+void NifStream( KeyType const & val, ostream& out, uint version ) { WriteUInt( val, out ); }
+void NifStream( Vector3 const & val, ostream& out, uint version ) {
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
 	WriteFloat( val.z, out );
 };
-void NifStream( Quaternion const & val, ostream& out ) {
+void NifStream( Quaternion const & val, ostream& out, uint version ) {
 	WriteFloat( val.w, out );
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
 	WriteFloat( val.z, out );
 };
-void NifStream( Color4 const & val, ostream& out ) {
+void NifStream( Color4 const & val, ostream& out, uint version ) {
 	WriteFloat( val.r, out );
 	WriteFloat( val.g, out );
 	WriteFloat( val.b, out );
 	WriteFloat( val.a, out );
 };
-void NifStream( Triangle const & val, ostream& out ) {
+void NifStream( Triangle const & val, ostream& out, uint version ) {
 	WriteUShort( val.v1, out );
 	WriteUShort( val.v2, out );
 	WriteUShort( val.v3, out );
 };
-void NifStream( LODRange const & val, ostream& out ) {
+void NifStream( LODRange const & val, ostream& out, uint version ) {
 	WriteFloat( val.near, out );
 	WriteFloat( val.far, out );
 };
diff --git a/NIF_IO.h b/NIF_IO.h
index 3cfaaeb617f889fc1012c6fa26ab21da2355b52e..7d5caeff3cef2155b9e96fdad2f229452dd4e011 100644
--- a/NIF_IO.h
+++ b/NIF_IO.h
@@ -151,7 +151,6 @@ ostream & operator<<(ostream & lh, usVector3 const & rh);
  * Read utility functions
  */
 uint ReadUInt( istream& in );
-uint ReadInt( istream& in );
 ushort ReadUShort( istream& in );
 short ReadShort( istream& in );
 byte ReadByte( istream& in );
@@ -164,20 +163,19 @@ void ReadFVector3( fVector3& fvec, istream& in );
 void ReadFVector4( fVector4& fvec, istream& in );
 
 //Read
-void NifStream( uint & val, istream& in );
-void NifStream( int & val, istream& in );
-void NifStream( ushort & val, istream& in );
-void NifStream( short & val, istream& in );
-void NifStream( byte & val, istream& in );
-void NifStream( float & val, istream& in );
-void NifStream( string & val, istream& in );
-void NifStream( Vector3 & val, istream& in );
-void NifStream( Quaternion & val, istream& in );
-void NifStream( KeyType & val, istream& in );
-void NifStream( Color4 & val, istream& in );
-void NifStream( Triangle & val, istream& in );
-void NifStream( TexDesc & val, istream& in, uint version );
-void NifStream( LODRange & val, istream& in );
+void NifStream( uint & val, istream& in, uint version = 0 );
+void NifStream( ushort & val, istream& in, uint version = 0 );
+void NifStream( short & val, istream& in, uint version = 0 );
+void NifStream( byte & val, istream& in, uint version = 0 );
+void NifStream( float & val, istream& in, uint version = 0 );
+void NifStream( string & val, istream& in, uint version = 0 );
+void NifStream( Vector3 & val, istream& in, uint version = 0 );
+void NifStream( Quaternion & val, istream& in, uint version = 0 );
+void NifStream( KeyType & val, istream& in, uint version = 0 );
+void NifStream( Color4 & val, istream& in, uint version = 0 );
+void NifStream( Triangle & val, istream& in, uint version = 0 );
+void NifStream( TexDesc & val, istream& in, uint version );  // version is significant
+void NifStream( LODRange & val, istream& in, uint version = 0 );
 
 template <class T> 
 void NifStream( Key<T> & key, istream& file, KeyType type ) {
@@ -222,8 +220,6 @@ void NifStream( vector<T> & val, istream& file ) {
  */
 void WriteUInt( uint val, ostream& out );
 
-void WriteInt( uint val, ostream& out );
-
 void WriteUShort( ushort val, ostream& out );
 
 void WriteShort( short val, ostream& out );
@@ -247,20 +243,19 @@ void WriteFVector4( fVector4 const & fvec, ostream& out );
 void WriteBlockName( const char* name, uint nameLength, ostream& out );
 
 //Write
-void NifStream( uint const & val, ostream& out );
-void NifStream( int const & val, ostream& out );
-void NifStream( ushort const & val, ostream& out );
-void NifStream( short const & val, ostream& out );
-void NifStream( byte const & val, ostream& out );
-void NifStream( float const & val, ostream& out );
-void NifStream( string const & val, ostream& out );
-void NifStream( Vector3 const & val, ostream& out );
-void NifStream( Quaternion const & val, ostream& out );
-void NifStream( KeyType const & val, ostream& out );
-void NifStream( Color4 const & val, ostream& out );
-void NifStream( Triangle const & val, ostream& out );
-void NifStream( TexDesc const & val, ostream& out, uint version );
-void NifStream( LODRange const & val, ostream& out );
+void NifStream( uint const & val, ostream& out, uint version = 0  );
+void NifStream( ushort const & val, ostream& out, uint version = 0  );
+void NifStream( short const & val, ostream& out, uint version = 0  );
+void NifStream( byte const & val, ostream& out, uint version = 0  );
+void NifStream( float const & val, ostream& out, uint version = 0  );
+void NifStream( string const & val, ostream& out, uint version = 0  );
+void NifStream( Vector3 const & val, ostream& out, uint version = 0  );
+void NifStream( Quaternion const & val, ostream& out, uint version = 0  );
+void NifStream( KeyType const & val, ostream& out, uint version = 0  );
+void NifStream( Color4 const & val, ostream& out, uint version = 0  );
+void NifStream( Triangle const & val, ostream& out, uint version = 0 );
+void NifStream( TexDesc const & val, ostream& out, uint version ); // version is significant
+void NifStream( LODRange const & val, ostream& out, uint version = 0 );
 
 template <class T> 
 void NifStream( Key<T> const & key, ostream& file, KeyType type ) {
diff --git a/niflib.vcproj b/niflib.vcproj
index 2ebb506403caafd1b516930a2b141385763d21ff..88faa196a67df2e6001076184459f22821921696 100644
--- a/niflib.vcproj
+++ b/niflib.vcproj
@@ -149,6 +149,9 @@
 			<File
 				RelativePath=".\niflib.cpp">
 			</File>
+			<File
+				RelativePath=".\xml_extract.cpp">
+			</File>
 		</Filter>
 		<Filter
 			Name="Header Files"
@@ -169,6 +172,9 @@
 			<File
 				RelativePath=".\niflib.h">
 			</File>
+			<File
+				RelativePath=".\xml_extract.h">
+			</File>
 		</Filter>
 		<Filter
 			Name="Resource Files"