diff --git a/include/gen/ArkTexture.h b/include/gen/ArkTexture.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8229f914469d1eb8780702b2a3365839059f4a3
--- /dev/null
+++ b/include/gen/ArkTexture.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#ifndef _ARKTEXTURE_H_
+#define _ARKTEXTURE_H_
+
+#include "../NIF_IO.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class NiTexturingProperty;
+
+/*! A texture reference used by NiArkTextureExtraData. */
+struct ArkTexture {
+	/*! Default Constructor */
+	NIFLIB_API ArkTexture();
+	/*! Default Destructor */
+	NIFLIB_API ~ArkTexture();
+	/*! Copy Constructor */
+	NIFLIB_API ArkTexture( const ArkTexture & src );
+	/*! Copy Operator */
+	NIFLIB_API ArkTexture & operator=( const ArkTexture & src );
+	/*! Unknown. */
+	IndexString textureName;
+	/*! Unknown. */
+	int unknownInt3;
+	/*! Unknown. */
+	int unknownInt4;
+	/*! Unknown. */
+	Ref<NiTexturingProperty > texturingProperty;
+	/*! Unknown. */
+	array<9,byte > unknownBytes;
+};
+
+}
+#endif
diff --git a/include/gen/InertiaMatrix.h b/include/gen/InertiaMatrix.h
new file mode 100644
index 0000000000000000000000000000000000000000..e6a2c138df1ef934f4a01ebd42016209869fc96f
--- /dev/null
+++ b/include/gen/InertiaMatrix.h
@@ -0,0 +1,53 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#ifndef _INERTIAMATRIX_H_
+#define _INERTIAMATRIX_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*! An inertia matrix. */
+struct InertiaMatrix {
+	/*! Default Constructor */
+	NIFLIB_API InertiaMatrix();
+	/*! Default Destructor */
+	NIFLIB_API ~InertiaMatrix();
+	/*! Copy Constructor */
+	NIFLIB_API InertiaMatrix( const InertiaMatrix & src );
+	/*! Copy Operator */
+	NIFLIB_API InertiaMatrix & operator=( const InertiaMatrix & src );
+	/*! Unknown. */
+	float m11;
+	/*! Unknown. */
+	float m12;
+	/*! Unknown. */
+	float m13;
+	/*! Zero */
+	float m14;
+	/*! Unknown. */
+	float m21;
+	/*! Unknown. */
+	float m22;
+	/*! Unknown. */
+	float m23;
+	/*! Zero */
+	float m24;
+	/*! Unknown. */
+	float m31;
+	/*! Unknown. */
+	float m32;
+	/*! Unknown. */
+	float m33;
+	/*! Zero */
+	float m34;
+};
+
+}
+#endif
diff --git a/include/gen/physXMaterialRef.h b/include/gen/physXMaterialRef.h
new file mode 100644
index 0000000000000000000000000000000000000000..169f71496cfb2a7594cbc3c12dbb15c0ed4c7087
--- /dev/null
+++ b/include/gen/physXMaterialRef.h
@@ -0,0 +1,39 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#ifndef _PHYSXMATERIALREF_H_
+#define _PHYSXMATERIALREF_H_
+
+#include "../NIF_IO.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class NiPhysXMaterialDesc;
+
+/*!  */
+struct physXMaterialRef {
+	/*! Default Constructor */
+	NIFLIB_API physXMaterialRef();
+	/*! Default Destructor */
+	NIFLIB_API ~physXMaterialRef();
+	/*! Copy Constructor */
+	NIFLIB_API physXMaterialRef( const physXMaterialRef & src );
+	/*! Copy Operator */
+	NIFLIB_API physXMaterialRef & operator=( const physXMaterialRef & src );
+	/*! Unknown */
+	byte number;
+	/*! Unknown */
+	byte unknownByte1;
+	/*! PhysX Material Description */
+	Ref<NiPhysXMaterialDesc > materialDesc;
+};
+
+}
+#endif
diff --git a/include/obj/NiLines.h b/include/obj/NiLines.h
new file mode 100644
index 0000000000000000000000000000000000000000..5e4464139a44606b9f60744faefa2b3e44159d4f
--- /dev/null
+++ b/include/obj/NiLines.h
@@ -0,0 +1,75 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+#ifndef _NILINES_H_
+#define _NILINES_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiTriBasedGeom.h"
+namespace Niflib {
+
+class NiLines;
+typedef Ref<NiLines> NiLinesRef;
+
+/*! Wireframe geometry. */
+class NiLines : public NiTriBasedGeom {
+public:
+	/*! Constructor */
+	NIFLIB_API NiLines();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~NiLines();
+
+	/*!
+	 * A constant value which uniquly identifies objects of this type.
+	 */
+	NIFLIB_API static const Type TYPE;
+
+	/*!
+	 * A factory function used during file reading to create an instance of this type of object.
+	 * \return A pointer to a newly allocated instance of this type of object.
+	 */
+	NIFLIB_API static NiObject * Create();
+
+	/*!
+	 * Summarizes the information contained in this object in English.
+	 * \param[in] verbose Determines whether or not detailed information about large areas of data will be printed out.
+	 * \return A string containing a summary of the information within the object in English.  This is the function that Niflyze calls to generate its analysis, so the output is the same.
+	 */
+	NIFLIB_API virtual string asString( bool verbose = false ) const;
+
+	/*!
+	 * Used to determine the type of a particular instance of this object.
+	 * \return The type constant for the actual type of the object.
+	 */
+	NIFLIB_API virtual const Type & GetType() const;
+
+	//--BEGIN MISC CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+public:
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
+};
+
+//--BEGIN FILE FOOT CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+} //End Niflib namespace
+#endif
diff --git a/include/obj/NiLinesData.h b/include/obj/NiLinesData.h
new file mode 100644
index 0000000000000000000000000000000000000000..dad3c372096d2faf1d4f2fe6b027f396ff0a2641
--- /dev/null
+++ b/include/obj/NiLinesData.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+#ifndef _NILINESDATA_H_
+#define _NILINESDATA_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiGeometryData.h"
+namespace Niflib {
+
+class NiLinesData;
+typedef Ref<NiLinesData> NiLinesDataRef;
+
+/*! Wireframe geometry data. */
+class NiLinesData : public NiGeometryData {
+public:
+	/*! Constructor */
+	NIFLIB_API NiLinesData();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~NiLinesData();
+
+	/*!
+	 * A constant value which uniquly identifies objects of this type.
+	 */
+	NIFLIB_API static const Type TYPE;
+
+	/*!
+	 * A factory function used during file reading to create an instance of this type of object.
+	 * \return A pointer to a newly allocated instance of this type of object.
+	 */
+	NIFLIB_API static NiObject * Create();
+
+	/*!
+	 * Summarizes the information contained in this object in English.
+	 * \param[in] verbose Determines whether or not detailed information about large areas of data will be printed out.
+	 * \return A string containing a summary of the information within the object in English.  This is the function that Niflyze calls to generate its analysis, so the output is the same.
+	 */
+	NIFLIB_API virtual string asString( bool verbose = false ) const;
+
+	/*!
+	 * Used to determine the type of a particular instance of this object.
+	 * \return The type constant for the actual type of the object.
+	 */
+	NIFLIB_API virtual const Type & GetType() const;
+
+	//--BEGIN MISC CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+protected:
+	/*! Is vertex connected to other (next?) vertex? */
+	vector<bool > lines;
+public:
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
+};
+
+//--BEGIN FILE FOOT CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+} //End Niflib namespace
+#endif
diff --git a/include/obj/NiPhysXBodyDesc.h b/include/obj/NiPhysXBodyDesc.h
new file mode 100644
index 0000000000000000000000000000000000000000..910f9f1fb2e0f9a8eacabba0728186f1b0397539
--- /dev/null
+++ b/include/obj/NiPhysXBodyDesc.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+#ifndef _NIPHYSXBODYDESC_H_
+#define _NIPHYSXBODYDESC_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class NiPhysXBodyDesc;
+typedef Ref<NiPhysXBodyDesc> NiPhysXBodyDescRef;
+
+/*! Unknown PhysX node. */
+class NiPhysXBodyDesc : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API NiPhysXBodyDesc();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~NiPhysXBodyDesc();
+
+	/*!
+	 * A constant value which uniquly identifies objects of this type.
+	 */
+	NIFLIB_API static const Type TYPE;
+
+	/*!
+	 * A factory function used during file reading to create an instance of this type of object.
+	 * \return A pointer to a newly allocated instance of this type of object.
+	 */
+	NIFLIB_API static NiObject * Create();
+
+	/*!
+	 * Summarizes the information contained in this object in English.
+	 * \param[in] verbose Determines whether or not detailed information about large areas of data will be printed out.
+	 * \return A string containing a summary of the information within the object in English.  This is the function that Niflyze calls to generate its analysis, so the output is the same.
+	 */
+	NIFLIB_API virtual string asString( bool verbose = false ) const;
+
+	/*!
+	 * Used to determine the type of a particular instance of this object.
+	 * \return The type constant for the actual type of the object.
+	 */
+	NIFLIB_API virtual const Type & GetType() const;
+
+	//--BEGIN MISC CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+protected:
+	/*! Unknown */
+	array<136,byte > unknownBytes;
+public:
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
+};
+
+//--BEGIN FILE FOOT CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+} //End Niflib namespace
+#endif
diff --git a/include/obj/NiPhysXD6JointDesc.h b/include/obj/NiPhysXD6JointDesc.h
new file mode 100644
index 0000000000000000000000000000000000000000..f8a356bade54e4d0c1ab62e0198ca0546916adf4
--- /dev/null
+++ b/include/obj/NiPhysXD6JointDesc.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+#ifndef _NIPHYSXD6JOINTDESC_H_
+#define _NIPHYSXD6JOINTDESC_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class NiPhysXD6JointDesc;
+typedef Ref<NiPhysXD6JointDesc> NiPhysXD6JointDescRef;
+
+/*! Unknown PhysX node. */
+class NiPhysXD6JointDesc : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API NiPhysXD6JointDesc();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~NiPhysXD6JointDesc();
+
+	/*!
+	 * A constant value which uniquly identifies objects of this type.
+	 */
+	NIFLIB_API static const Type TYPE;
+
+	/*!
+	 * A factory function used during file reading to create an instance of this type of object.
+	 * \return A pointer to a newly allocated instance of this type of object.
+	 */
+	NIFLIB_API static NiObject * Create();
+
+	/*!
+	 * Summarizes the information contained in this object in English.
+	 * \param[in] verbose Determines whether or not detailed information about large areas of data will be printed out.
+	 * \return A string containing a summary of the information within the object in English.  This is the function that Niflyze calls to generate its analysis, so the output is the same.
+	 */
+	NIFLIB_API virtual string asString( bool verbose = false ) const;
+
+	/*!
+	 * Used to determine the type of a particular instance of this object.
+	 * \return The type constant for the actual type of the object.
+	 */
+	NIFLIB_API virtual const Type & GetType() const;
+
+	//--BEGIN MISC CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+protected:
+	/*! Unknown */
+	array<388,byte > unknownBytes;
+public:
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
+	/*! NIFLIB_HIDDEN function.  For internal use only. */
+	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
+};
+
+//--BEGIN FILE FOOT CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+} //End Niflib namespace
+#endif
diff --git a/src/gen/ArkTexture.cpp b/src/gen/ArkTexture.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1752eeafc2fbc0456009b1b8178b9f2d3e0ed2c9
--- /dev/null
+++ b/src/gen/ArkTexture.cpp
@@ -0,0 +1,31 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#include "../../include/gen/ArkTexture.h"
+#include "../../include/obj/NiTexturingProperty.h"
+using namespace Niflib;
+
+//Constructor
+ArkTexture::ArkTexture() : unknownInt3((int)0), unknownInt4((int)0), texturingProperty(NULL) {};
+
+//Copy Constructor
+ArkTexture::ArkTexture( const ArkTexture & src ) {
+	*this = src;
+};
+
+//Copy Operator
+ArkTexture & ArkTexture::operator=( const ArkTexture & src ) {
+	this->textureName = src.textureName;
+	this->unknownInt3 = src.unknownInt3;
+	this->unknownInt4 = src.unknownInt4;
+	this->texturingProperty = src.texturingProperty;
+	this->unknownBytes = src.unknownBytes;
+	return *this;
+};
+
+//Destructor
+ArkTexture::~ArkTexture() {};
diff --git a/src/gen/InertiaMatrix.cpp b/src/gen/InertiaMatrix.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5fc8a753469bfc7b0fe7ffcccf010ec1ce30a92f
--- /dev/null
+++ b/src/gen/InertiaMatrix.cpp
@@ -0,0 +1,37 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#include "../../include/gen/InertiaMatrix.h"
+using namespace Niflib;
+
+//Constructor
+InertiaMatrix::InertiaMatrix() : m11(0.0f), m12(0.0f), m13(0.0f), m14(0.0f), m21(0.0f), m22(0.0f), m23(0.0f), m24(0.0f), m31(0.0f), m32(0.0f), m33(0.0f), m34(0.0f) {};
+
+//Copy Constructor
+InertiaMatrix::InertiaMatrix( const InertiaMatrix & src ) {
+	*this = src;
+};
+
+//Copy Operator
+InertiaMatrix & InertiaMatrix::operator=( const InertiaMatrix & src ) {
+	this->m11 = src.m11;
+	this->m12 = src.m12;
+	this->m13 = src.m13;
+	this->m14 = src.m14;
+	this->m21 = src.m21;
+	this->m22 = src.m22;
+	this->m23 = src.m23;
+	this->m24 = src.m24;
+	this->m31 = src.m31;
+	this->m32 = src.m32;
+	this->m33 = src.m33;
+	this->m34 = src.m34;
+	return *this;
+};
+
+//Destructor
+InertiaMatrix::~InertiaMatrix() {};
diff --git a/src/gen/physXMaterialRef.cpp b/src/gen/physXMaterialRef.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1743035cff872f35a52ceb6833938c2a066aa662
--- /dev/null
+++ b/src/gen/physXMaterialRef.cpp
@@ -0,0 +1,29 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//---THIS FILE WAS AUTOMATICALLY GENERATED.  DO NOT EDIT---//
+
+//To change this file, alter the niftools/docsys/gen_niflib.py Python script.
+
+#include "../../include/gen/physXMaterialRef.h"
+#include "../../include/obj/NiPhysXMaterialDesc.h"
+using namespace Niflib;
+
+//Constructor
+physXMaterialRef::physXMaterialRef() : number((byte)0), unknownByte1((byte)0), materialDesc(NULL) {};
+
+//Copy Constructor
+physXMaterialRef::physXMaterialRef( const physXMaterialRef & src ) {
+	*this = src;
+};
+
+//Copy Operator
+physXMaterialRef & physXMaterialRef::operator=( const physXMaterialRef & src ) {
+	this->number = src.number;
+	this->unknownByte1 = src.unknownByte1;
+	this->materialDesc = src.materialDesc;
+	return *this;
+};
+
+//Destructor
+physXMaterialRef::~physXMaterialRef() {};
diff --git a/src/obj/NiArkAnimationExtraData.cpp b/src/obj/NiArkAnimationExtraData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fc8087be96be512ac7e490eb39decd3eee0d70bd
--- /dev/null
+++ b/src/obj/NiArkAnimationExtraData.cpp
@@ -0,0 +1,142 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiArkAnimationExtraData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiArkAnimationExtraData::TYPE("NiArkAnimationExtraData", &NiExtraData::TYPE );
+
+NiArkAnimationExtraData::NiArkAnimationExtraData() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiArkAnimationExtraData::~NiArkAnimationExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiArkAnimationExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiArkAnimationExtraData::Create() {
+	return new NiArkAnimationExtraData;
+}
+
+void NiArkAnimationExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 4; i1++) {
+		NifStream( unknownInts[i1], in, info );
+	};
+	if ( info.version <= 0x0401000C ) {
+		for (unsigned int i2 = 0; i2 < 37; i2++) {
+			NifStream( unknownBytes[i2], in, info );
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkAnimationExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < 4; i1++) {
+		NifStream( unknownInts[i1], out, info );
+	};
+	if ( info.version <= 0x0401000C ) {
+		for (unsigned int i2 = 0; i2 < 37; i2++) {
+			NifStream( unknownBytes[i2], out, info );
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiArkAnimationExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 4; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Ints[" << i1 << "]:  " << unknownInts[i1] << endl;
+		array_output_count++;
+	};
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 37; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkAnimationExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiArkAnimationExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiArkImporterExtraData.cpp b/src/obj/NiArkImporterExtraData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f7c8b4885a37e15bf174abaa2cf6588a25916023
--- /dev/null
+++ b/src/obj/NiArkImporterExtraData.cpp
@@ -0,0 +1,151 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiArkImporterExtraData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiArkImporterExtraData::TYPE("NiArkImporterExtraData", &NiExtraData::TYPE );
+
+NiArkImporterExtraData::NiArkImporterExtraData() : unknownInt1((int)0), unknownInt2((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiArkImporterExtraData::~NiArkImporterExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiArkImporterExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiArkImporterExtraData::Create() {
+	return new NiArkImporterExtraData;
+}
+
+void NiArkImporterExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownInt2, in, info );
+	};
+	NifStream( importerName, in, info );
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		NifStream( unknownBytes[i1], in, info );
+	};
+	for (unsigned int i1 = 0; i1 < 7; i1++) {
+		NifStream( unknownFloats[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkImporterExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownInt2, out, info );
+	};
+	NifStream( importerName, out, info );
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		NifStream( unknownBytes[i1], out, info );
+	};
+	for (unsigned int i1 = 0; i1 < 7; i1++) {
+		NifStream( unknownFloats[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiArkImporterExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Importer Name:  " << importerName << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
+	};
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 7; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkImporterExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiArkImporterExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiArkShaderExtraData.cpp b/src/obj/NiArkShaderExtraData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7912e6435a9f63488630a950b91f67aff213f9c1
--- /dev/null
+++ b/src/obj/NiArkShaderExtraData.cpp
@@ -0,0 +1,108 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiArkShaderExtraData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiArkShaderExtraData::TYPE("NiArkShaderExtraData", &NiExtraData::TYPE );
+
+NiArkShaderExtraData::NiArkShaderExtraData() : unknownInt((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiArkShaderExtraData::~NiArkShaderExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiArkShaderExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiArkShaderExtraData::Create() {
+	return new NiArkShaderExtraData;
+}
+
+void NiArkShaderExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
+	NifStream( unknownString, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkShaderExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Write( out, link_map, info );
+	NifStream( unknownInt, out, info );
+	NifStream( unknownString, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiArkShaderExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	out << "  Unknown Int:  " << unknownInt << endl;
+	out << "  Unknown String:  " << unknownString << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkShaderExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiArkShaderExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiArkTextureExtraData.cpp b/src/obj/NiArkTextureExtraData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..755268cc91700fe21043e23434b43cacadfeb140
--- /dev/null
+++ b/src/obj/NiArkTextureExtraData.cpp
@@ -0,0 +1,196 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiArkTextureExtraData.h"
+#include "../../include/gen/ArkTexture.h"
+#include "../../include/obj/NiTexturingProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiArkTextureExtraData::TYPE("NiArkTextureExtraData", &NiExtraData::TYPE );
+
+NiArkTextureExtraData::NiArkTextureExtraData() : unknownByte((byte)0), unknownInt2((int)0), numTextures((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiArkTextureExtraData::~NiArkTextureExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiArkTextureExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiArkTextureExtraData::Create() {
+	return new NiArkTextureExtraData;
+}
+
+void NiArkTextureExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	unsigned int block_num;
+	NiExtraData::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 2; i1++) {
+		NifStream( unknownInts1[i1], in, info );
+	};
+	NifStream( unknownByte, in, info );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownInt2, in, info );
+	};
+	NifStream( numTextures, in, info );
+	textures.resize(numTextures);
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		NifStream( textures[i1].textureName, in, info );
+		NifStream( textures[i1].unknownInt3, in, info );
+		NifStream( textures[i1].unknownInt4, in, info );
+		NifStream( block_num, in, info );
+		link_stack.push_back( block_num );
+		for (unsigned int i2 = 0; i2 < 9; i2++) {
+			NifStream( textures[i1].unknownBytes[i2], in, info );
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkTextureExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Write( out, link_map, info );
+	numTextures = (int)(textures.size());
+	for (unsigned int i1 = 0; i1 < 2; i1++) {
+		NifStream( unknownInts1[i1], out, info );
+	};
+	NifStream( unknownByte, out, info );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownInt2, out, info );
+	};
+	NifStream( numTextures, out, info );
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		NifStream( textures[i1].textureName, out, info );
+		NifStream( textures[i1].unknownInt3, out, info );
+		NifStream( textures[i1].unknownInt4, out, info );
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*textures[i1].texturingProperty), out, info );
+		} else {
+			if ( textures[i1].texturingProperty != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(textures[i1].texturingProperty) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
+		for (unsigned int i2 = 0; i2 < 9; i2++) {
+			NifStream( textures[i1].unknownBytes[i2], out, info );
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiArkTextureExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	numTextures = (int)(textures.size());
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 2; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Ints 1[" << i1 << "]:  " << unknownInts1[i1] << endl;
+		array_output_count++;
+	};
+	out << "  Unknown Byte:  " << unknownByte << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Num Textures:  " << numTextures << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Texture Name:  " << textures[i1].textureName << endl;
+		out << "    Unknown Int 3:  " << textures[i1].unknownInt3 << endl;
+		out << "    Unknown Int 4:  " << textures[i1].unknownInt4 << endl;
+		out << "    Texturing Property:  " << textures[i1].texturingProperty << endl;
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < 9; i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
+			out << "      Unknown Bytes[" << i2 << "]:  " << textures[i1].unknownBytes[i2] << endl;
+			array_output_count++;
+		};
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkTextureExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::FixLinks( objects, link_stack, info );
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		textures[i1].texturingProperty = FixLink<NiTexturingProperty>( objects, link_stack, info );
+	};
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiArkTextureExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		if ( textures[i1].texturingProperty != NULL )
+			refs.push_back(StaticCast<NiObject>(textures[i1].texturingProperty));
+	};
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiArkViewportInfoExtraData.cpp b/src/obj/NiArkViewportInfoExtraData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..99da82cd37c01d997252aafc84f3808ca4d199d3
--- /dev/null
+++ b/src/obj/NiArkViewportInfoExtraData.cpp
@@ -0,0 +1,120 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiArkViewportInfoExtraData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiArkViewportInfoExtraData::TYPE("NiArkViewportInfoExtraData", &NiExtraData::TYPE );
+
+NiArkViewportInfoExtraData::NiArkViewportInfoExtraData() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiArkViewportInfoExtraData::~NiArkViewportInfoExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiArkViewportInfoExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiArkViewportInfoExtraData::Create() {
+	return new NiArkViewportInfoExtraData;
+}
+
+void NiArkViewportInfoExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		NifStream( unknownBytes[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkViewportInfoExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		NifStream( unknownBytes[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiArkViewportInfoExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 13; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiArkViewportInfoExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiExtraData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiArkViewportInfoExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiLines.cpp b/src/obj/NiLines.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ec573466ddc445841da578bd936fc4cfbc8fecc9
--- /dev/null
+++ b/src/obj/NiLines.cpp
@@ -0,0 +1,102 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiLines.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiLines::TYPE("NiLines", &NiTriBasedGeom::TYPE );
+
+NiLines::NiLines() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiLines::~NiLines() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiLines::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiLines::Create() {
+	return new NiLines;
+}
+
+void NiLines::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriBasedGeom::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiLines::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriBasedGeom::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiLines::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiTriBasedGeom::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiLines::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiLines::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiTriBasedGeom::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiLinesData.cpp b/src/obj/NiLinesData.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..740f879ffe9e6856b35b6a33eaeab56375a012c8
--- /dev/null
+++ b/src/obj/NiLinesData.cpp
@@ -0,0 +1,121 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiLinesData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiLinesData::TYPE("NiLinesData", &NiGeometryData::TYPE );
+
+NiLinesData::NiLinesData() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiLinesData::~NiLinesData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiLinesData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiLinesData::Create() {
+	return new NiLinesData;
+}
+
+void NiLinesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiGeometryData::Read( in, link_stack, info );
+	lines.resize(numVertices);
+	for (unsigned int i1 = 0; i1 < lines.size(); i1++) {
+		NifStream( lines[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiLinesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiGeometryData::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < lines.size(); i1++) {
+		NifStream( lines[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiLinesData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiGeometryData::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < lines.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Lines[" << i1 << "]:  " << lines[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiLinesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiGeometryData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiLinesData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiGeometryData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiPhysXBodyDesc.cpp b/src/obj/NiPhysXBodyDesc.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f1e969a9ec39a207996ecb22b029b412981d1df5
--- /dev/null
+++ b/src/obj/NiPhysXBodyDesc.cpp
@@ -0,0 +1,124 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiPhysXBodyDesc.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiPhysXBodyDesc::TYPE("NiPhysXBodyDesc", &NiObject::TYPE );
+
+NiPhysXBodyDesc::NiPhysXBodyDesc() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiPhysXBodyDesc::~NiPhysXBodyDesc() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiPhysXBodyDesc::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiPhysXBodyDesc::Create() {
+	return new NiPhysXBodyDesc;
+}
+
+void NiPhysXBodyDesc::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x14030006 ) {
+		for (unsigned int i2 = 0; i2 < 136; i2++) {
+			NifStream( unknownBytes[i2], in, info );
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiPhysXBodyDesc::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::Write( out, link_map, info );
+	if ( info.version >= 0x14030006 ) {
+		for (unsigned int i2 = 0; i2 < 136; i2++) {
+			NifStream( unknownBytes[i2], out, info );
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiPhysXBodyDesc::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 136; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiPhysXBodyDesc::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiPhysXBodyDesc::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiPhysXD6JointDesc.cpp b/src/obj/NiPhysXD6JointDesc.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2344f98e92f01e3c6958637b6e71e1170cd73ef6
--- /dev/null
+++ b/src/obj/NiPhysXD6JointDesc.cpp
@@ -0,0 +1,124 @@
+/* Copyright (c) 2006, NIF File Format Library and Tools
+All rights reserved.  Please see niflib.h for license. */
+
+//-----------------------------------NOTICE----------------------------------//
+// Some of this file is automatically filled in by a Python script.  Only    //
+// add custom code in the designated areas or it will be overwritten during  //
+// the next update.                                                          //
+//-----------------------------------NOTICE----------------------------------//
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "../../include/FixLink.h"
+#include "../../include/ObjectRegistry.h"
+#include "../../include/NIF_IO.h"
+#include "../../include/obj/NiPhysXD6JointDesc.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiPhysXD6JointDesc::TYPE("NiPhysXD6JointDesc", &NiObject::TYPE );
+
+NiPhysXD6JointDesc::NiPhysXD6JointDesc() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiPhysXD6JointDesc::~NiPhysXD6JointDesc() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiPhysXD6JointDesc::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiPhysXD6JointDesc::Create() {
+	return new NiPhysXD6JointDesc;
+}
+
+void NiPhysXD6JointDesc::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x14030006 ) {
+		for (unsigned int i2 = 0; i2 < 388; i2++) {
+			NifStream( unknownBytes[i2], in, info );
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiPhysXD6JointDesc::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::Write( out, link_map, info );
+	if ( info.version >= 0x14030006 ) {
+		for (unsigned int i2 = 0; i2 < 388; i2++) {
+			NifStream( unknownBytes[i2], out, info );
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiPhysXD6JointDesc::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 388; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiPhysXD6JointDesc::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiObject::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> NiPhysXD6JointDesc::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//