diff --git a/src/NIF_IO.cpp b/src/NIF_IO.cpp
index 4776bee6ba1dd5b3b1b95788b1ff5606688f24d6..ef9b53dda6f25bbcc548bd450dfe2d59abdf5f2b 100644
--- a/src/NIF_IO.cpp
+++ b/src/NIF_IO.cpp
@@ -8,11 +8,13 @@ namespace Niflib {
 //--Endian Support Functions--//
 EndianType DetectEndianType();
 int SwapEndian( int in );
+unsigned int SwapEndian( unsigned int in );
 short SwapEndian( short in );
+unsigned short SwapEndian( unsigned short in );
 float SwapEndian( float in );
 
 //Constant that stores the detected endian storage type of the current system
-const EndianType system_endian = DetectEndianType();
+const EndianType sys_endian = DetectEndianType();
 
 //--Endian Function Bodies--//
 
@@ -44,6 +46,22 @@ int SwapEndian( int in ) {
 	return out;
 }
 
+unsigned int SwapEndian( unsigned int in ) {
+	unsigned int out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)∈
+	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;
@@ -58,6 +76,20 @@ short SwapEndian( short in ) {
 	return out;
 }
 
+unsigned short SwapEndian( unsigned short in ) {
+	unsigned short out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)∈
+	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;
@@ -199,36 +231,116 @@ void WriteBool( bool val, ostream& out, unsigned int version ) {
 //--Basic Types--//
 
 //int
-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 ); }
+void NifStream( int & val, istream& in, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		val = ReadInt( in );
+	} else {
+		val = SwapEndian( ReadInt( in ) );
+	}
+}
+
+void NifStream( int const & val, ostream& out, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		WriteInt( val, out );
+	} else {
+		WriteInt( SwapEndian(val), out );
+	}
+}
 
 //unsigned int
-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 ); }
+void NifStream( unsigned int & val, istream& in, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		val = ReadUInt( in );
+	} else {
+		val = SwapEndian( ReadUInt( in ) );
+	}
+};
+
+void NifStream( unsigned int const & val, ostream& out, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		WriteUInt( val, out );
+	} else {
+		WriteUInt( SwapEndian(val), out );
+	}
+}
 
 //unsigned short
-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 ); }
+void NifStream( unsigned short & val, istream& in, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		val = ReadUShort( in );
+	} else {
+		val = SwapEndian( ReadUShort( in ) );
+	}
+}
+
+void NifStream( unsigned short const & val, ostream& out, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		WriteUShort( val, out );
+	} else {
+		WriteUShort( SwapEndian(val), out );
+	}
+}
 
 //short
-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 ); }
+void NifStream( short & val, istream& in, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		val = ReadShort( in );
+	} else {
+		val = SwapEndian( ReadShort( in ) );
+	}
+}
+
+void NifStream( short const & val, ostream& out, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		WriteShort( val, out );
+	} else {
+		WriteShort( SwapEndian(val), out );
+	}
+}
 
 //byte
-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 ); }
+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, const NifInfo & info ) { val = ReadBool( in, info.version ); };
-void NifStream( bool const & val, ostream& out, const NifInfo & info ) { WriteBool( val, out, info.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, const NifInfo & info ) { val = ReadFloat( in ); };
-void NifStream( float const & val, ostream& out, const NifInfo & info ) { WriteFloat( val, out ); }
+void NifStream( float & val, istream& in, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		val = ReadFloat( in );
+	} else {
+		val = SwapEndian( ReadFloat( in ) );
+	}
+}
+
+void NifStream( float const & val, ostream& out, const NifInfo & info ) {
+	if ( info.endian == sys_endian ) {
+		WriteFloat( val, out );
+	} else {
+		WriteFloat( SwapEndian(val), out );
+	}
+}
 
 //string
-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 ); }
+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--//
 
diff --git a/src/gen/Header.cpp b/src/gen/Header.cpp
index b8242c73799a73e1c8759aed0c7e3e7b534c7a42..3ca3f592d061bc2d420d152f744569f1154a6ab9 100644
--- a/src/gen/Header.cpp
+++ b/src/gen/Header.cpp
@@ -93,14 +93,14 @@ NifInfo Header::Read( istream& in ) {
 	//Fill out and return NifInfo structure.
 	info.userVersion = userVersion;
 	if ( endianType == 0) {
-		info->endian = BIG_ENDIAN;
+		info.endian = BIG_ENDIAN;
 	} else {
-		info->endian = LITTLE_ENDIAN;
+		info.endian = LITTLE_ENDIAN;
 	}
 	info.endian = EndianType(endianType);
 	info.creator = creator.str;
-	info.exportInfo1 = exportInfo1;
-	info.exportInfo2 = exportInfo2;
+	info.exportInfo1 = exportInfo1.str;
+	info.exportInfo2 = exportInfo2.str;
 
 	return info;
 
diff --git a/src/niflib.cpp b/src/niflib.cpp
index a8592a774db6d18f59e8317ca795d813973d8513..d0784023daaa76a78ab18234be3b168f54b00957 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -427,7 +427,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
 	}
 
 	//Write header to file
-	header.Write( out );
+	header.Write( out, info );
 
 #ifdef PRINT_OBJECT_NAMES
 	cout << endl << "Writing Objects:";