From e4e54cffe0d33f8c8cb0cb7ca0eaf0e87364c526 Mon Sep 17 00:00:00 2001
From: Tazpn <tazpn@users.sourceforge.net>
Date: Sun, 16 Nov 2008 16:42:05 +0000
Subject: [PATCH] niflib: Update to Fallout version of xml

---
 Makefile                                      | 100 +++-
 include/gen/AVObject.h                        |   2 +-
 include/gen/AdditionalDataBlock.h             |  43 ++
 include/gen/AdditionalDataInfo.h              |  43 ++
 include/gen/BSSegmentedTriangle.h             |  35 ++
 include/gen/BSTreadTransfInfo.h               |  35 ++
 include/gen/BSTreadTransfSubInfo.h            |  45 ++
 include/gen/BodyPartList.h                    |  33 ++
 include/gen/DecalVectorArray.h                |  35 ++
 include/gen/HingeDescriptor.h                 |  68 +++
 include/gen/LimitedHingeDescriptor.h          |   6 +
 include/gen/RagdollDescriptor.h               |  14 +
 include/gen/ShaderTexDesc.h                   |   4 +-
 include/gen/enums.h                           |   8 +-
 include/nif_versions.h                        |   1 +
 include/obj/BSAnimNotes.h                     |  78 +++
 include/obj/BSBlastNode.h                     |  80 +++
 include/obj/BSDamageStage.h                   |  80 +++
 include/obj/BSDebrisNode.h                    |  80 +++
 include/obj/BSDecalPlacementVectorExtraData.h |  85 ++++
 include/obj/BSDismemberSkinInstance.h         |  83 ++++
 include/obj/BSDistantTreeShaderProperty.h     |  75 +++
 include/obj/BSFadeNode.h                      |  75 +++
 include/obj/BSFrustumFOVController.h          |  78 +++
 include/obj/BSMasterParticleSystem.h          |  87 ++++
 .../obj/BSMaterialEmittanceMultController.h   |  75 +++
 include/obj/BSMultiBound.h                    |  78 +++
 include/obj/BSMultiBoundAABB.h                |  78 +++
 include/obj/BSMultiBoundNode.h                |  78 +++
 include/obj/BSMultiBoundSphere.h              |  84 ++++
 include/obj/BSOrderedNode.h                   |  80 +++
 include/obj/BSPSysMultiTargetEmitterCtlr.h    |  90 ++++
 include/obj/BSPSysSimpleColorModifier.h       |  90 ++++
 include/obj/BSPSysStripUpdateModifier.h       |  78 +++
 .../obj/BSRefractionFirePeriodController.h    |  75 +++
 include/obj/BSRefractionStrengthController.h  |  75 +++
 include/obj/BSSegmentedTriShape.h             |  83 ++++
 include/obj/BSShaderLightingProperty.h        |  98 ++++
 include/obj/BSShaderNoLightingProperty.h      |  98 ++++
 include/obj/BSShaderPPLightingProperty.h      | 101 ++++
 include/obj/BSShaderProperty.h                |  75 +++
 include/obj/BSShaderTextureSet.h              |  80 +++
 include/obj/BSStripPSysData.h                 |  84 ++++
 include/obj/BSStripParticleSystem.h           |  75 +++
 include/obj/BSTreadTransfInterpolator.h       |  85 ++++
 include/obj/BSValueNode.h                     |  80 +++
 include/obj/BSWArray.h                        |  80 +++
 include/obj/DistantLODShaderProperty.h        |  75 +++
 include/obj/HairShaderProperty.h              |  75 +++
 include/obj/Lighting30ShaderProperty.h        |  96 ++++
 include/obj/NiAVObject.h                      |   2 +
 include/obj/NiAdditionalGeometryData.h        |  90 ++++
 include/obj/NiControllerSequence.h            |  35 +-
 include/obj/NiGeometry.h                      |   5 +-
 include/obj/NiGeometryData.h                  |   4 +-
 include/obj/NiMaterialProperty.h              |   2 +
 include/obj/NiPSysCollider.h                  |   2 +-
 include/obj/NiPSysGravityModifier.h           |   2 +
 include/obj/NiPSysGrowFadeModifier.h          |   2 +
 include/obj/NiParticlesData.h                 | 118 ++++-
 include/obj/NiTimeController.h                |   8 +-
 include/obj/SkyShaderProperty.h               |  94 ++++
 include/obj/TallGrassShaderProperty.h         |  86 ++++
 include/obj/TileShaderProperty.h              |  88 ++++
 include/obj/VolumetricFogShaderProperty.h     |  75 +++
 include/obj/WaterShaderProperty.h             |  88 ++++
 include/obj/bhkAabbPhantom.h                  |  78 +++
 include/obj/bhkBreakableConstraint.h          |  80 +++
 include/obj/bhkConvexListShape.h              | 102 ++++
 include/obj/bhkHingeConstraint.h              |  19 +-
 include/obj/bhkLimitedHingeConstraint.h       |  18 +
 include/obj/bhkLiquidAction.h                 |  90 ++++
 include/obj/bhkMalleableConstraint.h          |   5 +
 include/obj/bhkOrientHingedBodyAction.h       |  78 +++
 include/obj/bhkPrismaticConstraint.h          |   2 +
 include/obj/bhkRagdollConstraint.h            |  18 +
 include/obj/bhkRigidBody.h                    |   4 +-
 include/obj/hkPackedNiTriStripsData.h         |   7 +
 niflib.vcproj                                 | 436 ++++++++++++++++-
 niflib_VC2008.vcproj                          | 432 ++++++++++++++++
 src/gen/AdditionalDataBlock.cpp               |  32 ++
 src/gen/AdditionalDataInfo.cpp                |  32 ++
 src/gen/BSSegmentedTriangle.cpp               |  28 ++
 src/gen/BSTreadTransfInfo.cpp                 |  28 ++
 src/gen/BSTreadTransfSubInfo.cpp              |  33 ++
 src/gen/BodyPartList.cpp                      |  27 +
 src/gen/DecalVectorArray.cpp                  |  28 ++
 src/gen/Header.cpp                            |  33 +-
 src/gen/HingeDescriptor.cpp                   |  43 ++
 src/gen/LimitedHingeDescriptor.cpp            |   5 +-
 src/gen/RagdollDescriptor.cpp                 |   9 +-
 src/gen/ShaderTexDesc.cpp                     |   4 +-
 src/gen/register.cpp                          |  92 ++++
 src/niflib.cpp                                |   1 +
 src/obj/BSAnimNotes.cpp                       | 105 ++++
 src/obj/BSBlastNode.cpp                       | 108 ++++
 src/obj/BSDamageStage.cpp                     | 108 ++++
 src/obj/BSDebrisNode.cpp                      | 108 ++++
 src/obj/BSDecalPlacementVectorExtraData.cpp   | 166 +++++++
 src/obj/BSDismemberSkinInstance.cpp           | 126 +++++
 src/obj/BSDistantTreeShaderProperty.cpp       | 102 ++++
 src/obj/BSFadeNode.cpp                        | 102 ++++
 src/obj/BSFrustumFOVController.cpp            | 105 ++++
 src/obj/BSMasterParticleSystem.cpp            | 147 ++++++
 src/obj/BSMaterialEmittanceMultController.cpp | 102 ++++
 src/obj/BSMultiBound.cpp                      | 105 ++++
 src/obj/BSMultiBoundAABB.cpp                  | 120 +++++
 src/obj/BSMultiBoundNode.cpp                  | 105 ++++
 src/obj/BSMultiBoundSphere.cpp                | 114 +++++
 src/obj/BSOrderedNode.cpp                     | 108 ++++
 src/obj/BSPSysMultiTargetEmitterCtlr.cpp      | 153 ++++++
 src/obj/BSPSysSimpleColorModifier.cpp         | 138 ++++++
 src/obj/BSPSysStripUpdateModifier.cpp         | 105 ++++
 src/obj/BSRefractionFirePeriodController.cpp  | 102 ++++
 src/obj/BSRefractionStrengthController.cpp    | 102 ++++
 src/obj/BSSegmentedTriShape.cpp               | 129 +++++
 src/obj/BSShaderLightingProperty.cpp          | 135 +++++
 src/obj/BSShaderNoLightingProperty.cpp        | 139 ++++++
 src/obj/BSShaderPPLightingProperty.cpp        | 150 ++++++
 src/obj/BSShaderProperty.cpp                  | 102 ++++
 src/obj/BSShaderTextureSet.cpp                | 126 +++++
 src/obj/BSStripPSysData.cpp                   | 114 +++++
 src/obj/BSStripParticleSystem.cpp             | 102 ++++
 src/obj/BSTreadTransfInterpolator.cpp         | 162 ++++++
 src/obj/BSValueNode.cpp                       | 108 ++++
 src/obj/BSWArray.cpp                          | 126 +++++
 src/obj/DistantLODShaderProperty.cpp          | 102 ++++
 src/obj/HairShaderProperty.cpp                | 102 ++++
 src/obj/Lighting30ShaderProperty.cpp          | 132 +++++
 src/obj/Ni3dsAnimationNode.cpp                |   8 -
 src/obj/NiAVObject.cpp                        |   9 +-
 src/obj/NiAdditionalGeometryData.cpp          | 250 ++++++++++
 src/obj/NiBoneLODController.cpp               |   6 +-
 src/obj/NiControllerSequence.cpp              |  33 +-
 src/obj/NiGeomMorpherController.cpp           |  17 +-
 src/obj/NiGeometry.cpp                        |   6 +-
 src/obj/NiGeometryData.cpp                    |  54 +-
 src/obj/NiMaterialProperty.cpp                |  21 +-
 src/obj/NiMorphData.cpp                       |   4 +-
 src/obj/NiPSysCollider.cpp                    |   2 -
 src/obj/NiPSysData.cpp                        |  58 ++-
 src/obj/NiPSysGravityModifier.cpp             |   9 +-
 src/obj/NiPSysGrowFadeModifier.cpp            |   9 +-
 src/obj/NiParticlesData.cpp                   | 460 +++++++++++++++---
 src/obj/NiSequence.cpp                        |  10 +-
 src/obj/NiTexturingProperty.cpp               |   6 +-
 src/obj/SkyShaderProperty.cpp                 | 129 +++++
 src/obj/TallGrassShaderProperty.cpp           | 117 +++++
 src/obj/TileShaderProperty.cpp                | 120 +++++
 src/obj/VolumetricFogShaderProperty.cpp       | 102 ++++
 src/obj/WaterShaderProperty.cpp               | 120 +++++
 src/obj/bhkAabbPhantom.cpp                    | 120 +++++
 src/obj/bhkBreakableConstraint.cpp            | 123 +++++
 src/obj/bhkConvexListShape.cpp                | 171 +++++++
 src/obj/bhkHingeConstraint.cpp                |  86 +++-
 src/obj/bhkLimitedHingeConstraint.cpp         |  52 +-
 src/obj/bhkLiquidAction.cpp                   | 123 +++++
 src/obj/bhkMalleableConstraint.cpp            | 112 ++++-
 src/obj/bhkOrientHingedBodyAction.cpp         | 120 +++++
 src/obj/bhkPackedNiTriStripsShape.cpp         |  34 +-
 src/obj/bhkPrismaticConstraint.cpp            |   9 +-
 src/obj/bhkRagdollConstraint.cpp              |  64 ++-
 src/obj/bhkRigidBody.cpp                      |   4 +-
 src/obj/hkPackedNiTriStripsData.cpp           |  54 +-
 164 files changed, 12265 insertions(+), 321 deletions(-)
 create mode 100644 include/gen/AdditionalDataBlock.h
 create mode 100644 include/gen/AdditionalDataInfo.h
 create mode 100644 include/gen/BSSegmentedTriangle.h
 create mode 100644 include/gen/BSTreadTransfInfo.h
 create mode 100644 include/gen/BSTreadTransfSubInfo.h
 create mode 100644 include/gen/BodyPartList.h
 create mode 100644 include/gen/DecalVectorArray.h
 create mode 100644 include/gen/HingeDescriptor.h
 create mode 100644 include/obj/BSAnimNotes.h
 create mode 100644 include/obj/BSBlastNode.h
 create mode 100644 include/obj/BSDamageStage.h
 create mode 100644 include/obj/BSDebrisNode.h
 create mode 100644 include/obj/BSDecalPlacementVectorExtraData.h
 create mode 100644 include/obj/BSDismemberSkinInstance.h
 create mode 100644 include/obj/BSDistantTreeShaderProperty.h
 create mode 100644 include/obj/BSFadeNode.h
 create mode 100644 include/obj/BSFrustumFOVController.h
 create mode 100644 include/obj/BSMasterParticleSystem.h
 create mode 100644 include/obj/BSMaterialEmittanceMultController.h
 create mode 100644 include/obj/BSMultiBound.h
 create mode 100644 include/obj/BSMultiBoundAABB.h
 create mode 100644 include/obj/BSMultiBoundNode.h
 create mode 100644 include/obj/BSMultiBoundSphere.h
 create mode 100644 include/obj/BSOrderedNode.h
 create mode 100644 include/obj/BSPSysMultiTargetEmitterCtlr.h
 create mode 100644 include/obj/BSPSysSimpleColorModifier.h
 create mode 100644 include/obj/BSPSysStripUpdateModifier.h
 create mode 100644 include/obj/BSRefractionFirePeriodController.h
 create mode 100644 include/obj/BSRefractionStrengthController.h
 create mode 100644 include/obj/BSSegmentedTriShape.h
 create mode 100644 include/obj/BSShaderLightingProperty.h
 create mode 100644 include/obj/BSShaderNoLightingProperty.h
 create mode 100644 include/obj/BSShaderPPLightingProperty.h
 create mode 100644 include/obj/BSShaderProperty.h
 create mode 100644 include/obj/BSShaderTextureSet.h
 create mode 100644 include/obj/BSStripPSysData.h
 create mode 100644 include/obj/BSStripParticleSystem.h
 create mode 100644 include/obj/BSTreadTransfInterpolator.h
 create mode 100644 include/obj/BSValueNode.h
 create mode 100644 include/obj/BSWArray.h
 create mode 100644 include/obj/DistantLODShaderProperty.h
 create mode 100644 include/obj/HairShaderProperty.h
 create mode 100644 include/obj/Lighting30ShaderProperty.h
 create mode 100644 include/obj/NiAdditionalGeometryData.h
 create mode 100644 include/obj/SkyShaderProperty.h
 create mode 100644 include/obj/TallGrassShaderProperty.h
 create mode 100644 include/obj/TileShaderProperty.h
 create mode 100644 include/obj/VolumetricFogShaderProperty.h
 create mode 100644 include/obj/WaterShaderProperty.h
 create mode 100644 include/obj/bhkAabbPhantom.h
 create mode 100644 include/obj/bhkBreakableConstraint.h
 create mode 100644 include/obj/bhkConvexListShape.h
 create mode 100644 include/obj/bhkLiquidAction.h
 create mode 100644 include/obj/bhkOrientHingedBodyAction.h
 create mode 100644 src/gen/AdditionalDataBlock.cpp
 create mode 100644 src/gen/AdditionalDataInfo.cpp
 create mode 100644 src/gen/BSSegmentedTriangle.cpp
 create mode 100644 src/gen/BSTreadTransfInfo.cpp
 create mode 100644 src/gen/BSTreadTransfSubInfo.cpp
 create mode 100644 src/gen/BodyPartList.cpp
 create mode 100644 src/gen/DecalVectorArray.cpp
 create mode 100644 src/gen/HingeDescriptor.cpp
 create mode 100644 src/obj/BSAnimNotes.cpp
 create mode 100644 src/obj/BSBlastNode.cpp
 create mode 100644 src/obj/BSDamageStage.cpp
 create mode 100644 src/obj/BSDebrisNode.cpp
 create mode 100644 src/obj/BSDecalPlacementVectorExtraData.cpp
 create mode 100644 src/obj/BSDismemberSkinInstance.cpp
 create mode 100644 src/obj/BSDistantTreeShaderProperty.cpp
 create mode 100644 src/obj/BSFadeNode.cpp
 create mode 100644 src/obj/BSFrustumFOVController.cpp
 create mode 100644 src/obj/BSMasterParticleSystem.cpp
 create mode 100644 src/obj/BSMaterialEmittanceMultController.cpp
 create mode 100644 src/obj/BSMultiBound.cpp
 create mode 100644 src/obj/BSMultiBoundAABB.cpp
 create mode 100644 src/obj/BSMultiBoundNode.cpp
 create mode 100644 src/obj/BSMultiBoundSphere.cpp
 create mode 100644 src/obj/BSOrderedNode.cpp
 create mode 100644 src/obj/BSPSysMultiTargetEmitterCtlr.cpp
 create mode 100644 src/obj/BSPSysSimpleColorModifier.cpp
 create mode 100644 src/obj/BSPSysStripUpdateModifier.cpp
 create mode 100644 src/obj/BSRefractionFirePeriodController.cpp
 create mode 100644 src/obj/BSRefractionStrengthController.cpp
 create mode 100644 src/obj/BSSegmentedTriShape.cpp
 create mode 100644 src/obj/BSShaderLightingProperty.cpp
 create mode 100644 src/obj/BSShaderNoLightingProperty.cpp
 create mode 100644 src/obj/BSShaderPPLightingProperty.cpp
 create mode 100644 src/obj/BSShaderProperty.cpp
 create mode 100644 src/obj/BSShaderTextureSet.cpp
 create mode 100644 src/obj/BSStripPSysData.cpp
 create mode 100644 src/obj/BSStripParticleSystem.cpp
 create mode 100644 src/obj/BSTreadTransfInterpolator.cpp
 create mode 100644 src/obj/BSValueNode.cpp
 create mode 100644 src/obj/BSWArray.cpp
 create mode 100644 src/obj/DistantLODShaderProperty.cpp
 create mode 100644 src/obj/HairShaderProperty.cpp
 create mode 100644 src/obj/Lighting30ShaderProperty.cpp
 create mode 100644 src/obj/NiAdditionalGeometryData.cpp
 create mode 100644 src/obj/SkyShaderProperty.cpp
 create mode 100644 src/obj/TallGrassShaderProperty.cpp
 create mode 100644 src/obj/TileShaderProperty.cpp
 create mode 100644 src/obj/VolumetricFogShaderProperty.cpp
 create mode 100644 src/obj/WaterShaderProperty.cpp
 create mode 100644 src/obj/bhkAabbPhantom.cpp
 create mode 100644 src/obj/bhkBreakableConstraint.cpp
 create mode 100644 src/obj/bhkConvexListShape.cpp
 create mode 100644 src/obj/bhkLiquidAction.cpp
 create mode 100644 src/obj/bhkOrientHingedBodyAction.cpp

diff --git a/Makefile b/Makefile
index 21218d0a..5d07ef54 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,8 @@ DEBUGGING	=
 # Example: -march=k8 would generate enhancements for the k8 family (opterons and some athlons).or -march=pentium4 for a pentium4
 # For more info read this: http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
 #
-CFLAGS 		= -O2 -Wall -fPIC $(DEBUGGING) -fpermissive -Iinclude -D BUILDING_NIFLIB_DLL
+#CFLAGS      = -fPIC 
+CFLAGS 		= -O2 -Wall $(DEBUGGING) -fpermissive -Iinclude -D BUILDING_NIFLIB_DLL
 CXXFLAGS	= $(CFLAGS)
 #IT should find the libs used, but if it doesn't specify here. Ex: -lm for libm.so.<whatever>
 LIBS		=
@@ -48,11 +49,28 @@ OBJ_FILES = \
             NvTriStrip/NvTriStripObjects.o \
             NvTriStrip/VertexCache.o \
             src/ComplexShape.o \
+            src/Inertia.o \
+            src/kfm.o \
+            src/MatTexCollection.o \
+            src/niflib.o \
+            src/nifqhull.o \
+            src/NIF_IO.o \
+            src/nif_math.o \
+            src/ObjectRegistry.o \
+            src/pch.o \
+            src/RefObject.o \
+            src/Type.o \
+            src/gen/AdditionalDataBlock.o \
+            src/gen/AdditionalDataInfo.o \
             src/gen/ArkTexture.o \
             src/gen/AVObject.o \
+            src/gen/BodyPartList.o \
             src/gen/BoundingBox.o \
             src/gen/BoundingVolume.o \
             src/gen/BoxBV.o \
+            src/gen/BSSegmentedTriangle.o \
+            src/gen/BSTreadTransfInfo.o \
+            src/gen/BSTreadTransfSubInfo.o \
             src/gen/ByteArray.o \
             src/gen/ByteColor3.o \
             src/gen/ByteColor4.o \
@@ -60,12 +78,14 @@ OBJ_FILES = \
             src/gen/CapsuleBV.o \
             src/gen/ChannelData.o \
             src/gen/ControllerLink.o \
+            src/gen/DecalVectorArray.o \
             src/gen/enums.o \
             src/gen/ExportInfo.o \
             src/gen/Footer.o \
             src/gen/FurniturePosition.o \
             src/gen/HalfSpaceBV.o \
             src/gen/Header.o \
+            src/gen/HingeDescriptor.o \
             src/gen/hkTriangle.o \
             src/gen/LimitedHingeDescriptor.o \
             src/gen/LODRange.o \
@@ -97,35 +117,32 @@ OBJ_FILES = \
             src/gen/TexDesc.o \
             src/gen/TexSource.o \
             src/gen/UnionBV.o \
-            src/Inertia.o \
-            src/kfm.o \
-            src/MatTexCollection.o \
-            src/niflib.o \
-            src/nifqhull.o \
-            src/NIF_IO.o \
-            src/nif_math.o \
-            src/ObjectRegistry.o \
             src/obj/ATextureRenderData.o \
             src/obj/AvoidNode.o \
+            src/obj/bhkAabbPhantom.o \
             src/obj/bhkBlendCollisionObject.o \
             src/obj/bhkBlendController.o \
             src/obj/bhkBoxShape.o \
+            src/obj/bhkBreakableConstraint.o \
             src/obj/bhkBvTreeShape.o \
             src/obj/bhkCapsuleShape.o \
             src/obj/bhkCollisionObject.o \
             src/obj/bhkConstraint.o \
+            src/obj/bhkConvexListShape.o \
             src/obj/bhkConvexShape.o \
             src/obj/bhkConvexTransformShape.o \
             src/obj/bhkConvexVerticesShape.o \
             src/obj/bhkEntity.o \
             src/obj/bhkHingeConstraint.o \
             src/obj/bhkLimitedHingeConstraint.o \
+            src/obj/bhkLiquidAction.o \
             src/obj/bhkListShape.o \
             src/obj/bhkMalleableConstraint.o \
             src/obj/bhkMoppBvTreeShape.o \
             src/obj/bhkMultiSphereShape.o \
             src/obj/bhkNiCollisionObject.o \
             src/obj/bhkNiTriStripsShape.o \
+            src/obj/bhkOrientHingedBodyAction.o \
             src/obj/bhkPackedNiTriStripsShape.o \
             src/obj/bhkPCollisionObject.o \
             src/obj/bhkPhantom.o \
@@ -145,23 +162,59 @@ OBJ_FILES = \
             src/obj/bhkStiffSpringConstraint.o \
             src/obj/bhkTransformShape.o \
             src/obj/bhkWorldObject.o \
+            src/obj/BSAnimNotes.o \
+            src/obj/BSBlastNode.o \
             src/obj/BSBound.o \
+            src/obj/BSDamageStage.o \
+            src/obj/BSDebrisNode.o \
+            src/obj/BSDecalPlacementVectorExtraData.o \
+            src/obj/BSDismemberSkinInstance.o \
+            src/obj/BSDistantTreeShaderProperty.o \
+            src/obj/BSFadeNode.o \
+            src/obj/BSFrustumFOVController.o \
             src/obj/BSFurnitureMarker.o \
             src/obj/BSKeyframeController.o \
+            src/obj/BSMasterParticleSystem.o \
+            src/obj/BSMaterialEmittanceMultController.o \
+            src/obj/BSMultiBound.o \
+            src/obj/BSMultiBoundAABB.o \
+            src/obj/BSMultiBoundNode.o \
+            src/obj/BSMultiBoundSphere.o \
+            src/obj/BSOrderedNode.o \
             src/obj/BSParentVelocityModifier.o \
             src/obj/BSPSysArrayEmitter.o \
+            src/obj/BSPSysMultiTargetEmitterCtlr.o \
+            src/obj/BSPSysSimpleColorModifier.o \
+            src/obj/BSPSysStripUpdateModifier.o \
+            src/obj/BSRefractionFirePeriodController.o \
+            src/obj/BSRefractionStrengthController.o \
+            src/obj/BSSegmentedTriShape.o \
+            src/obj/BSShaderLightingProperty.o \
+            src/obj/BSShaderNoLightingProperty.o \
+            src/obj/BSShaderPPLightingProperty.o \
+            src/obj/BSShaderProperty.o \
+            src/obj/BSShaderTextureSet.o \
+            src/obj/BSStripParticleSystem.o \
+            src/obj/BSStripPSysData.o \
+            src/obj/BSTreadTransfInterpolator.o \
+            src/obj/BSValueNode.o \
+            src/obj/BSWArray.o \
             src/obj/BSWindModifier.o \
             src/obj/BSXFlags.o \
+            src/obj/DistantLODShaderProperty.o \
             src/obj/FxButton.o \
             src/obj/FxRadioButton.o \
             src/obj/FxWidget.o \
+            src/obj/HairShaderProperty.o \
             src/obj/hkPackedNiTriStripsData.o \
+            src/obj/Lighting30ShaderProperty.o \
             src/obj/Ni3dsAlphaAnimator.o \
             src/obj/Ni3dsAnimationNode.o \
             src/obj/Ni3dsColorAnimator.o \
             src/obj/Ni3dsMorphShape.o \
             src/obj/Ni3dsParticleSystem.o \
             src/obj/Ni3dsPathController.o \
+            src/obj/NiAdditionalGeometryData.o \
             src/obj/NiAlphaController.o \
             src/obj/NiAlphaProperty.o \
             src/obj/NiAmbientLight.o \
@@ -246,6 +299,7 @@ OBJ_FILES = \
             src/obj/NiLight.o \
             src/obj/NiLightColorController.o \
             src/obj/NiLightDimmerController.o \
+            src/obj/NiLightIntensityController.o \
             src/obj/NiLines.o \
             src/obj/NiLinesData.o \
             src/obj/NiLODData.o \
@@ -295,9 +349,11 @@ OBJ_FILES = \
             src/obj/NiPoint3InterpController.o \
             src/obj/NiPoint3Interpolator.o \
             src/obj/NiPointLight.o \
+            src/obj/NiPortal.o \
             src/obj/NiPosData.o \
             src/obj/NiProperty.o \
             src/obj/NiPSysAgeDeathModifier.o \
+            src/obj/NiPSysAirFieldModifier.o \
             src/obj/NiPSysBombModifier.o \
             src/obj/NiPSysBoundUpdateModifier.o \
             src/obj/NiPSysBoxEmitter.o \
@@ -306,6 +362,7 @@ OBJ_FILES = \
             src/obj/NiPSysColorModifier.o \
             src/obj/NiPSysCylinderEmitter.o \
             src/obj/NiPSysData.o \
+            src/obj/NiPSysDragFieldModifier.o \
             src/obj/NiPSysDragModifier.o \
             src/obj/NiPSysEmitter.o \
             src/obj/NiPSysEmitterCtlr.o \
@@ -315,6 +372,9 @@ OBJ_FILES = \
             src/obj/NiPSysEmitterInitialRadiusCtlr.o \
             src/obj/NiPSysEmitterLifeSpanCtlr.o \
             src/obj/NiPSysEmitterSpeedCtlr.o \
+            src/obj/NiPSysFieldMagnitudeCtlr.o \
+            src/obj/NiPSysFieldModifier.o \
+            src/obj/NiPSysGravityFieldModifier.o \
             src/obj/NiPSysGravityModifier.o \
             src/obj/NiPSysGravityStrengthCtlr.o \
             src/obj/NiPSysGrowFadeModifier.o \
@@ -332,11 +392,15 @@ OBJ_FILES = \
             src/obj/NiPSysSpawnModifier.o \
             src/obj/NiPSysSphereEmitter.o \
             src/obj/NiPSysSphericalCollider.o \
+            src/obj/NiPSysTurbulenceFieldModifier.o \
             src/obj/NiPSysUpdateCtlr.o \
             src/obj/NiPSysVolumeEmitter.o \
+            src/obj/NiPSysVortexFieldModifier.o \
             src/obj/NiRangeLODData.o \
             src/obj/NiRawImageData.o \
             src/obj/NiRollController.o \
+            src/obj/NiRoom.o \
+            src/obj/NiRoomGroup.o \
             src/obj/NiRotatingParticles.o \
             src/obj/NiRotatingParticlesData.o \
             src/obj/NiScreenElements.o \
@@ -389,19 +453,11 @@ OBJ_FILES = \
             src/obj/NiWireframeProperty.o \
             src/obj/NiZBufferProperty.o \
             src/obj/RootCollisionNode.o \
-            src/obj/NiLightIntensityController.o \
-            src/obj/NiPortal.o \
-            src/obj/NiPSysAirFieldModifier.o \
-            src/obj/NiPSysDragFieldModifier.o \
-            src/obj/NiPSysFieldMagnitudeCtlr.o \
-            src/obj/NiPSysFieldModifier.o \
-            src/obj/NiPSysGravityFieldModifier.o \
-            src/obj/NiPSysTurbulenceFieldModifier.o \
-            src/obj/NiPSysVortexFieldModifier.o \
-            src/obj/NiRoom.o \
-            src/obj/NiRoomGroup.o \
-            src/RefObject.o \
-            src/Type.o \
+            src/obj/SkyShaderProperty.o \
+            src/obj/TallGrassShaderProperty.o \
+            src/obj/TileShaderProperty.o \
+            src/obj/VolumetricFogShaderProperty.o \
+            src/obj/WaterShaderProperty.o \
             TriStripper/connectivity_graph.o \
             TriStripper/policy.o \
             TriStripper/tri_stripper.o \
diff --git a/include/gen/AVObject.h b/include/gen/AVObject.h
index c78d5f8a..42f2a102 100644
--- a/include/gen/AVObject.h
+++ b/include/gen/AVObject.h
@@ -26,7 +26,7 @@ struct AVObject {
 	/*! Copy Operator */
 	NIFLIB_API AVObject & operator=( const AVObject & src );
 	/*! Object name. */
-	IndexString name;
+	string name;
 	/*! Object reference. */
 	NiAVObject * avObject;
 };
diff --git a/include/gen/AdditionalDataBlock.h b/include/gen/AdditionalDataBlock.h
new file mode 100644
index 00000000..1fc369b0
--- /dev/null
+++ b/include/gen/AdditionalDataBlock.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 _ADDITIONALDATABLOCK_H_
+#define _ADDITIONALDATABLOCK_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*!  */
+struct AdditionalDataBlock {
+	/*! Default Constructor */
+	NIFLIB_API AdditionalDataBlock();
+	/*! Default Destructor */
+	NIFLIB_API ~AdditionalDataBlock();
+	/*! Copy Constructor */
+	NIFLIB_API AdditionalDataBlock( const AdditionalDataBlock & src );
+	/*! Copy Operator */
+	NIFLIB_API AdditionalDataBlock & operator=( const AdditionalDataBlock & src );
+	/*! Has data */
+	bool hasData;
+	/*! Size of Block */
+	mutable int blockSize;
+	/*! Unknown */
+	mutable int numBlocks;
+	/*! Unknown */
+	vector<int > blockOffsets;
+	/*! Unknown */
+	mutable int numData;
+	/*! Unknown */
+	vector<int > dataSizes;
+	/*! Unknown */
+	vector< vector<byte > > data;
+};
+
+}
+#endif
diff --git a/include/gen/AdditionalDataInfo.h b/include/gen/AdditionalDataInfo.h
new file mode 100644
index 00000000..590bbddf
--- /dev/null
+++ b/include/gen/AdditionalDataInfo.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 _ADDITIONALDATAINFO_H_
+#define _ADDITIONALDATAINFO_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*!  */
+struct AdditionalDataInfo {
+	/*! Default Constructor */
+	NIFLIB_API AdditionalDataInfo();
+	/*! Default Destructor */
+	NIFLIB_API ~AdditionalDataInfo();
+	/*! Copy Constructor */
+	NIFLIB_API AdditionalDataInfo( const AdditionalDataInfo & src );
+	/*! Copy Operator */
+	NIFLIB_API AdditionalDataInfo & operator=( const AdditionalDataInfo & src );
+	/*! Type of data */
+	int dataType;
+	/*! Size of Block */
+	int blockSize;
+	/*! Unknown */
+	int numBlocks;
+	/*! Unknown */
+	int blockSize2;
+	/*! Unknown */
+	int blockIndex;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	byte unknownByte1;
+};
+
+}
+#endif
diff --git a/include/gen/BSSegmentedTriangle.h b/include/gen/BSSegmentedTriangle.h
new file mode 100644
index 00000000..2032c64a
--- /dev/null
+++ b/include/gen/BSSegmentedTriangle.h
@@ -0,0 +1,35 @@
+/* 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 _BSSEGMENTEDTRIANGLE_H_
+#define _BSSEGMENTEDTRIANGLE_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*! Bethesda-specific node. */
+struct BSSegmentedTriangle {
+	/*! Default Constructor */
+	NIFLIB_API BSSegmentedTriangle();
+	/*! Default Destructor */
+	NIFLIB_API ~BSSegmentedTriangle();
+	/*! Copy Constructor */
+	NIFLIB_API BSSegmentedTriangle( const BSSegmentedTriangle & src );
+	/*! Copy Operator */
+	NIFLIB_API BSSegmentedTriangle & operator=( const BSSegmentedTriangle & src );
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	byte unknownByte1;
+};
+
+}
+#endif
diff --git a/include/gen/BSTreadTransfInfo.h b/include/gen/BSTreadTransfInfo.h
new file mode 100644
index 00000000..a2a26596
--- /dev/null
+++ b/include/gen/BSTreadTransfInfo.h
@@ -0,0 +1,35 @@
+/* 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 _BSTREADTRANSFINFO_H_
+#define _BSTREADTRANSFINFO_H_
+
+#include "../NIF_IO.h"
+
+// Include structures
+#include "BSTreadTransfSubInfo.h"
+namespace Niflib {
+
+
+/*! Bethesda-specific node. */
+struct BSTreadTransfInfo {
+	/*! Default Constructor */
+	NIFLIB_API BSTreadTransfInfo();
+	/*! Default Destructor */
+	NIFLIB_API ~BSTreadTransfInfo();
+	/*! Copy Constructor */
+	NIFLIB_API BSTreadTransfInfo( const BSTreadTransfInfo & src );
+	/*! Copy Operator */
+	NIFLIB_API BSTreadTransfInfo & operator=( const BSTreadTransfInfo & src );
+	/*! Unknown Flag */
+	float unknownFloat1;
+	/*! Data */
+	array<2,BSTreadTransfSubInfo > data;
+};
+
+}
+#endif
diff --git a/include/gen/BSTreadTransfSubInfo.h b/include/gen/BSTreadTransfSubInfo.h
new file mode 100644
index 00000000..929be7d8
--- /dev/null
+++ b/include/gen/BSTreadTransfSubInfo.h
@@ -0,0 +1,45 @@
+/* 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 _BSTREADTRANSFSUBINFO_H_
+#define _BSTREADTRANSFSUBINFO_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*! Bethesda-specific node. */
+struct BSTreadTransfSubInfo {
+	/*! Default Constructor */
+	NIFLIB_API BSTreadTransfSubInfo();
+	/*! Default Destructor */
+	NIFLIB_API ~BSTreadTransfSubInfo();
+	/*! Copy Constructor */
+	NIFLIB_API BSTreadTransfSubInfo( const BSTreadTransfSubInfo & src );
+	/*! Copy Operator */
+	NIFLIB_API BSTreadTransfSubInfo & operator=( const BSTreadTransfSubInfo & src );
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	int unknownInt5;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	int unknownInt7;
+	/*! Unknown */
+	int unknownInt8;
+};
+
+}
+#endif
diff --git a/include/gen/BodyPartList.h b/include/gen/BodyPartList.h
new file mode 100644
index 00000000..05efcc81
--- /dev/null
+++ b/include/gen/BodyPartList.h
@@ -0,0 +1,33 @@
+/* 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 _BODYPARTLIST_H_
+#define _BODYPARTLIST_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*! Body part list for DismemberSkinInstance */
+struct BodyPartList {
+	/*! Default Constructor */
+	NIFLIB_API BodyPartList();
+	/*! Default Destructor */
+	NIFLIB_API ~BodyPartList();
+	/*! Copy Constructor */
+	NIFLIB_API BodyPartList( const BodyPartList & src );
+	/*! Copy Operator */
+	NIFLIB_API BodyPartList & operator=( const BodyPartList & src );
+	/*! Unknown */
+	short unknownShort;
+	/*! Unknown */
+	short bodyPart;
+};
+
+}
+#endif
diff --git a/include/gen/DecalVectorArray.h b/include/gen/DecalVectorArray.h
new file mode 100644
index 00000000..bdeb9a56
--- /dev/null
+++ b/include/gen/DecalVectorArray.h
@@ -0,0 +1,35 @@
+/* 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 _DECALVECTORARRAY_H_
+#define _DECALVECTORARRAY_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*! Array of Vectors for Decal placement in BSDecalPlacementVectorExtraData. */
+struct DecalVectorArray {
+	/*! Default Constructor */
+	NIFLIB_API DecalVectorArray();
+	/*! Default Destructor */
+	NIFLIB_API ~DecalVectorArray();
+	/*! Copy Constructor */
+	NIFLIB_API DecalVectorArray( const DecalVectorArray & src );
+	/*! Copy Operator */
+	NIFLIB_API DecalVectorArray & operator=( const DecalVectorArray & src );
+	/*! Number of sets */
+	mutable short numVectors;
+	/*! Vector XYZ coords */
+	vector<Vector3 > points;
+	/*! Vector Normals */
+	vector<Vector3 > normals;
+};
+
+}
+#endif
diff --git a/include/gen/HingeDescriptor.h b/include/gen/HingeDescriptor.h
new file mode 100644
index 00000000..d9e1adaa
--- /dev/null
+++ b/include/gen/HingeDescriptor.h
@@ -0,0 +1,68 @@
+/* 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 _HINGEDESCRIPTOR_H_
+#define _HINGEDESCRIPTOR_H_
+
+#include "../NIF_IO.h"
+
+namespace Niflib {
+
+
+/*!  */
+struct HingeDescriptor {
+	/*! Default Constructor */
+	NIFLIB_API HingeDescriptor();
+	/*! Default Destructor */
+	NIFLIB_API ~HingeDescriptor();
+	/*! Copy Constructor */
+	NIFLIB_API HingeDescriptor( const HingeDescriptor & src );
+	/*! Copy Operator */
+	NIFLIB_API HingeDescriptor & operator=( const HingeDescriptor & src );
+	/*! Pivot point around which the object will rotate. */
+	Vector4 pivotA;
+	/*! Vector in the rotation plane which defines the zero angle. */
+	Vector4 perp2AxleInA1;
+	/*!
+	 * Vector in the rotation plane, orthogonal on the previous one, which defines the
+	 * positive direction of rotation.
+	 */
+	Vector4 perp2AxleInA2;
+	/*! Pivot A in second entity coordinate system. */
+	Vector4 pivotB;
+	/*! Axle A (vector orthogonal on Perp2 Axles) in second entity coordinate system. */
+	Vector4 axleB;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	float unknownInt2;
+	/*! Unknown */
+	float unknownInt3;
+	/*! Unknown */
+	float unknownInt4;
+	/*! Unknown */
+	float unknownInt5;
+	/*! Unknown */
+	float unknownInt6;
+	/*! Unknown */
+	float unknownInt7;
+	/*! Unknown */
+	float unknownInt8;
+	/*! Unknown */
+	float unknownInt9;
+	/*! Unknown */
+	float unknownInt10;
+	/*! Unknown */
+	byte unknownByte1;
+	/*! Unknown */
+	byte unknownByte2;
+	/*! Unknown */
+	byte unknownByte3;
+};
+
+}
+#endif
diff --git a/include/gen/LimitedHingeDescriptor.h b/include/gen/LimitedHingeDescriptor.h
index db07bada..624a8d16 100644
--- a/include/gen/LimitedHingeDescriptor.h
+++ b/include/gen/LimitedHingeDescriptor.h
@@ -47,6 +47,12 @@ struct LimitedHingeDescriptor {
 	float maxAngle;
 	/*! Maximum friction, typically either 0 or 10. */
 	float maxFriction;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	float unknownFloat2;
+	/*! Unknown */
+	float unknownFloat3;
 };
 
 }
diff --git a/include/gen/RagdollDescriptor.h b/include/gen/RagdollDescriptor.h
index 61556806..630943b7 100644
--- a/include/gen/RagdollDescriptor.h
+++ b/include/gen/RagdollDescriptor.h
@@ -60,6 +60,20 @@ struct RagdollDescriptor {
 	float twistMaxAngle;
 	/*! Maximum friction, typically 0 or 10. */
 	float maxFriction;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	float unknownFloat2;
+	/*! Unknown */
+	float unknownFloat3;
+	/*! Unknown */
+	float unknownFloat4;
+	/*! Unknown */
+	float unknownFloat5;
+	/*! Unknown */
+	float unknownFloat6;
+	/*! Unknown */
+	float unknownFloat7;
 };
 
 }
diff --git a/include/gen/ShaderTexDesc.h b/include/gen/ShaderTexDesc.h
index ef72b458..aa396bc1 100644
--- a/include/gen/ShaderTexDesc.h
+++ b/include/gen/ShaderTexDesc.h
@@ -29,8 +29,8 @@ struct ShaderTexDesc {
 	bool isUsed;
 	/*! The texture data. */
 	TexDesc textureData;
-	/*! Unknown. */
-	unsigned int unknownInt;
+	/*! Map Index */
+	unsigned int mapIndex;
 };
 
 }
diff --git a/include/gen/enums.h b/include/gen/enums.h
index 4fae7d0f..462f1299 100644
--- a/include/gen/enums.h
+++ b/include/gen/enums.h
@@ -262,11 +262,9 @@ ostream & operator<<( ostream & out, OblivionLayer const & val );
 
 /*!
  * A list of possible solver deactivation settings. This value defines how the
- *                 solver deactivates objects. The solver works on a per object
- * basis.
- *                 Note: Solver deactivation does not save CPU, but reduces
- * creeping of
- *                 movable objects in a pile quite dramatically.
+ *         solver deactivates objects. The solver works on a per object basis.
+ *         Note: Solver deactivation does not save CPU, but reduces creeping of
+ *         movable objects in a pile quite dramatically.
  */
 enum SolverDeactivation {
 	SOLVER_DEACTIVATION_INVALID = 0, /*!< Invalid */
diff --git a/include/nif_versions.h b/include/nif_versions.h
index d26ef02a..b491ba9c 100644
--- a/include/nif_versions.h
+++ b/include/nif_versions.h
@@ -26,6 +26,7 @@ const unsigned VER_10_2_0_0    = 0x0A020000; /*!< NIF Version 10.2.0.0 */
 const unsigned VER_20_0_0_4    = 0x14000004; /*!< NIF Version 20.0.0.4 */ 
 const unsigned VER_20_0_0_5    = 0x14000005; /*!< NIF Version 20.0.0.4 */ 
 const unsigned VER_20_1_0_3    = 0x14010003; /*!< NIF Version 20.1.0.3 */ 
+const unsigned VER_20_2_0_7    = 0x14010007; /*!< NIF Version 20.2.0.7 */ 
 const unsigned VER_20_3_0_3    = 0x14030003; /*!< NIF Version 20.3.0.3 */ 
 const unsigned VER_20_3_0_6    = 0x14030006; /*!< NIF Version 20.3.0.6 */ 
 const unsigned VER_UNSUPPORTED = 0xFFFFFFFF; /*!< Unsupported NIF Version */
diff --git a/include/obj/BSAnimNotes.h b/include/obj/BSAnimNotes.h
new file mode 100644
index 00000000..47c7cb13
--- /dev/null
+++ b/include/obj/BSAnimNotes.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 _BSANIMNOTES_H_
+#define _BSANIMNOTES_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class BSAnimNotes;
+typedef Ref<BSAnimNotes> BSAnimNotesRef;
+
+/*! Bethesda-specific node. */
+class BSAnimNotes : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API BSAnimNotes();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSAnimNotes();
+
+	/*!
+	 * 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 */
+	short unknownShort1;
+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/BSBlastNode.h b/include/obj/BSBlastNode.h
new file mode 100644
index 00000000..0093ef84
--- /dev/null
+++ b/include/obj/BSBlastNode.h
@@ -0,0 +1,80 @@
+/* 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 _BSBLASTNODE_H_
+#define _BSBLASTNODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSBlastNode;
+typedef Ref<BSBlastNode> BSBlastNodeRef;
+
+/*! Bethesda-Specific node. */
+class BSBlastNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSBlastNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSBlastNode();
+
+	/*!
+	 * 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 */
+	byte unknownByte1;
+	/*! Unknown */
+	short unknownShort1;
+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/BSDamageStage.h b/include/obj/BSDamageStage.h
new file mode 100644
index 00000000..2ded8256
--- /dev/null
+++ b/include/obj/BSDamageStage.h
@@ -0,0 +1,80 @@
+/* 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 _BSDAMAGESTAGE_H_
+#define _BSDAMAGESTAGE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSDamageStage;
+typedef Ref<BSDamageStage> BSDamageStageRef;
+
+/*! Bethesda-Specific node. */
+class BSDamageStage : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSDamageStage();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSDamageStage();
+
+	/*!
+	 * 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 */
+	byte unknownByte1;
+	/*! Unknown */
+	short unknownShort1;
+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/BSDebrisNode.h b/include/obj/BSDebrisNode.h
new file mode 100644
index 00000000..149c92a0
--- /dev/null
+++ b/include/obj/BSDebrisNode.h
@@ -0,0 +1,80 @@
+/* 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 _BSDEBRISNODE_H_
+#define _BSDEBRISNODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSDebrisNode;
+typedef Ref<BSDebrisNode> BSDebrisNodeRef;
+
+/*! Bethesda-Specific node. */
+class BSDebrisNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSDebrisNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSDebrisNode();
+
+	/*!
+	 * 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 */
+	byte unknownByte1;
+	/*! Unknown */
+	short unknownShort1;
+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/BSDecalPlacementVectorExtraData.h b/include/obj/BSDecalPlacementVectorExtraData.h
new file mode 100644
index 00000000..786e88ba
--- /dev/null
+++ b/include/obj/BSDecalPlacementVectorExtraData.h
@@ -0,0 +1,85 @@
+/* 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 _BSDECALPLACEMENTVECTOREXTRADATA_H_
+#define _BSDECALPLACEMENTVECTOREXTRADATA_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiExtraData.h"
+
+// Include structures
+#include "../gen/DecalVectorArray.h"
+namespace Niflib {
+
+class BSDecalPlacementVectorExtraData;
+typedef Ref<BSDecalPlacementVectorExtraData> BSDecalPlacementVectorExtraDataRef;
+
+/*! Bethesda-specific node. (for dynamic decal projection?) */
+class BSDecalPlacementVectorExtraData : public NiExtraData {
+public:
+	/*! Constructor */
+	NIFLIB_API BSDecalPlacementVectorExtraData();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSDecalPlacementVectorExtraData();
+
+	/*!
+	 * 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 */
+	float unknownFloat1;
+	/*! Number of groups */
+	mutable short numVectorBlocks;
+	/*! Number of Blocks */
+	vector<DecalVectorArray > vectorBlocks;
+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/BSDismemberSkinInstance.h b/include/obj/BSDismemberSkinInstance.h
new file mode 100644
index 00000000..d53859a7
--- /dev/null
+++ b/include/obj/BSDismemberSkinInstance.h
@@ -0,0 +1,83 @@
+/* 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 _BSDISMEMBERSKININSTANCE_H_
+#define _BSDISMEMBERSKININSTANCE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiSkinInstance.h"
+
+// Include structures
+#include "../gen/BodyPartList.h"
+namespace Niflib {
+
+class BSDismemberSkinInstance;
+typedef Ref<BSDismemberSkinInstance> BSDismemberSkinInstanceRef;
+
+/*! Bethesda-specific node. */
+class BSDismemberSkinInstance : public NiSkinInstance {
+public:
+	/*! Constructor */
+	NIFLIB_API BSDismemberSkinInstance();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSDismemberSkinInstance();
+
+	/*!
+	 * 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 */
+	mutable int numPartitions;
+	/*! Unknown */
+	vector<BodyPartList > partitions;
+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/BSDistantTreeShaderProperty.h b/include/obj/BSDistantTreeShaderProperty.h
new file mode 100644
index 00000000..7c9a27c3
--- /dev/null
+++ b/include/obj/BSDistantTreeShaderProperty.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 _BSDISTANTTREESHADERPROPERTY_H_
+#define _BSDISTANTTREESHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class BSDistantTreeShaderProperty;
+typedef Ref<BSDistantTreeShaderProperty> BSDistantTreeShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class BSDistantTreeShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API BSDistantTreeShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSDistantTreeShaderProperty();
+
+	/*!
+	 * 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/BSFadeNode.h b/include/obj/BSFadeNode.h
new file mode 100644
index 00000000..07f30af1
--- /dev/null
+++ b/include/obj/BSFadeNode.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 _BSFADENODE_H_
+#define _BSFADENODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSFadeNode;
+typedef Ref<BSFadeNode> BSFadeNodeRef;
+
+/*! Bethesda-specific fade node. */
+class BSFadeNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSFadeNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSFadeNode();
+
+	/*!
+	 * 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/BSFrustumFOVController.h b/include/obj/BSFrustumFOVController.h
new file mode 100644
index 00000000..86665302
--- /dev/null
+++ b/include/obj/BSFrustumFOVController.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 _BSFRUSTUMFOVCONTROLLER_H_
+#define _BSFRUSTUMFOVCONTROLLER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiTimeController.h"
+namespace Niflib {
+
+class BSFrustumFOVController;
+typedef Ref<BSFrustumFOVController> BSFrustumFOVControllerRef;
+
+/*! Bethesda-specific node. */
+class BSFrustumFOVController : public NiTimeController {
+public:
+	/*! Constructor */
+	NIFLIB_API BSFrustumFOVController();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSFrustumFOVController();
+
+	/*!
+	 * 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 */
+	int unknownInt1;
+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/BSMasterParticleSystem.h b/include/obj/BSMasterParticleSystem.h
new file mode 100644
index 00000000..67b3a348
--- /dev/null
+++ b/include/obj/BSMasterParticleSystem.h
@@ -0,0 +1,87 @@
+/* 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 _BSMASTERPARTICLESYSTEM_H_
+#define _BSMASTERPARTICLESYSTEM_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class NiAVObject;
+class BSMasterParticleSystem;
+typedef Ref<BSMasterParticleSystem> BSMasterParticleSystemRef;
+
+/*! Bethesda-Specific node. */
+class BSMasterParticleSystem : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMasterParticleSystem();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMasterParticleSystem();
+
+	/*!
+	 * 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 */
+	unsigned short maxEmitterObjects;
+	/*! Unknown */
+	mutable int numParticleSystems;
+	/*! Unknown */
+	vector<Ref<NiAVObject > > particleSystems;
+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/BSMaterialEmittanceMultController.h b/include/obj/BSMaterialEmittanceMultController.h
new file mode 100644
index 00000000..d87bfa56
--- /dev/null
+++ b/include/obj/BSMaterialEmittanceMultController.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 _BSMATERIALEMITTANCEMULTCONTROLLER_H_
+#define _BSMATERIALEMITTANCEMULTCONTROLLER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiFloatInterpController.h"
+namespace Niflib {
+
+class BSMaterialEmittanceMultController;
+typedef Ref<BSMaterialEmittanceMultController> BSMaterialEmittanceMultControllerRef;
+
+/*! Bethesda-Specific node. */
+class BSMaterialEmittanceMultController : public NiFloatInterpController {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMaterialEmittanceMultController();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMaterialEmittanceMultController();
+
+	/*!
+	 * 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/BSMultiBound.h b/include/obj/BSMultiBound.h
new file mode 100644
index 00000000..6424e605
--- /dev/null
+++ b/include/obj/BSMultiBound.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 _BSMULTIBOUND_H_
+#define _BSMULTIBOUND_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class BSMultiBound;
+typedef Ref<BSMultiBound> BSMultiBoundRef;
+
+/*! Bethesda-specific node. */
+class BSMultiBound : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMultiBound();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMultiBound();
+
+	/*!
+	 * 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 Flag */
+	int unknownInt1;
+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/BSMultiBoundAABB.h b/include/obj/BSMultiBoundAABB.h
new file mode 100644
index 00000000..db0e3b33
--- /dev/null
+++ b/include/obj/BSMultiBoundAABB.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 _BSMULTIBOUNDAABB_H_
+#define _BSMULTIBOUNDAABB_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class BSMultiBoundAABB;
+typedef Ref<BSMultiBoundAABB> BSMultiBoundAABBRef;
+
+/*! Bethesda-specific node. */
+class BSMultiBoundAABB : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMultiBoundAABB();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMultiBoundAABB();
+
+	/*!
+	 * 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<6,float > unknownFloats1;
+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/BSMultiBoundNode.h b/include/obj/BSMultiBoundNode.h
new file mode 100644
index 00000000..0c4d338b
--- /dev/null
+++ b/include/obj/BSMultiBoundNode.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 _BSMULTIBOUNDNODE_H_
+#define _BSMULTIBOUNDNODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSMultiBoundNode;
+typedef Ref<BSMultiBoundNode> BSMultiBoundNodeRef;
+
+/*! Bethesda-specific node. */
+class BSMultiBoundNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMultiBoundNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMultiBoundNode();
+
+	/*!
+	 * 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 Flag */
+	int unknownInt1;
+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/BSMultiBoundSphere.h b/include/obj/BSMultiBoundSphere.h
new file mode 100644
index 00000000..e918d24e
--- /dev/null
+++ b/include/obj/BSMultiBoundSphere.h
@@ -0,0 +1,84 @@
+/* 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 _BSMULTIBOUNDSPHERE_H_
+#define _BSMULTIBOUNDSPHERE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class BSMultiBoundSphere;
+typedef Ref<BSMultiBoundSphere> BSMultiBoundSphereRef;
+
+/*! Bethesda-specific node. */
+class BSMultiBoundSphere : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API BSMultiBoundSphere();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSMultiBoundSphere();
+
+	/*!
+	 * 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 Flag */
+	int unknownInt1;
+	/*! Unknown Flag */
+	int unknownInt2;
+	/*! Unknown Flag */
+	int unknownInt3;
+	/*! Radius */
+	float radius;
+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/BSOrderedNode.h b/include/obj/BSOrderedNode.h
new file mode 100644
index 00000000..b8d87663
--- /dev/null
+++ b/include/obj/BSOrderedNode.h
@@ -0,0 +1,80 @@
+/* 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 _BSORDEREDNODE_H_
+#define _BSORDEREDNODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSOrderedNode;
+typedef Ref<BSOrderedNode> BSOrderedNodeRef;
+
+/*! Bethesda-Specific node. */
+class BSOrderedNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSOrderedNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSOrderedNode();
+
+	/*!
+	 * 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 */
+	Vector4 alphaSortBound;
+	/*! Unknown */
+	byte isStaticBound;
+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/BSPSysMultiTargetEmitterCtlr.h b/include/obj/BSPSysMultiTargetEmitterCtlr.h
new file mode 100644
index 00000000..16258ab7
--- /dev/null
+++ b/include/obj/BSPSysMultiTargetEmitterCtlr.h
@@ -0,0 +1,90 @@
+/* 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 _BSPSYSMULTITARGETEMITTERCTLR_H_
+#define _BSPSYSMULTITARGETEMITTERCTLR_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiPSysModifierCtlr.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class NiPSysEmitterCtlrData;
+class NiInterpolator;
+class BSPSysMultiTargetEmitterCtlr;
+typedef Ref<BSPSysMultiTargetEmitterCtlr> BSPSysMultiTargetEmitterCtlrRef;
+
+/*! Particle system (multi?) emitter controller. */
+class BSPSysMultiTargetEmitterCtlr : public NiPSysModifierCtlr {
+public:
+	/*! Constructor */
+	NIFLIB_API BSPSysMultiTargetEmitterCtlr();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSPSysMultiTargetEmitterCtlr();
+
+	/*!
+	 * 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:
+	/*! This controller's data */
+	Ref<NiPSysEmitterCtlrData > data;
+	/*! Links to a bool interpolator. Controls emitter's visibility status? */
+	Ref<NiInterpolator > visibilityInterpolator;
+	/*! Unknown */
+	short unknownShort1;
+	/*! Unknown */
+	int unknownInt1;
+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/BSPSysSimpleColorModifier.h b/include/obj/BSPSysSimpleColorModifier.h
new file mode 100644
index 00000000..3cc7ded6
--- /dev/null
+++ b/include/obj/BSPSysSimpleColorModifier.h
@@ -0,0 +1,90 @@
+/* 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 _BSPSYSSIMPLECOLORMODIFIER_H_
+#define _BSPSYSSIMPLECOLORMODIFIER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiPSysModifier.h"
+namespace Niflib {
+
+class BSPSysSimpleColorModifier;
+typedef Ref<BSPSysSimpleColorModifier> BSPSysSimpleColorModifierRef;
+
+/*! Bethesda-Specific Particle node. */
+class BSPSysSimpleColorModifier : public NiPSysModifier {
+public:
+	/*! Constructor */
+	NIFLIB_API BSPSysSimpleColorModifier();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSPSysSimpleColorModifier();
+
+	/*!
+	 * 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 */
+	float fadeInPercent;
+	/*! Unknown */
+	float fadeOutPercent;
+	/*! Unknown */
+	int color1EndPercent;
+	/*! Unknown */
+	int color1StartPercent;
+	/*! Unknown */
+	int color2EndPercent;
+	/*! Unknown */
+	int color2StartPercent;
+	/*! Colors */
+	array<3,Color4 > colors;
+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/BSPSysStripUpdateModifier.h b/include/obj/BSPSysStripUpdateModifier.h
new file mode 100644
index 00000000..44ec4c54
--- /dev/null
+++ b/include/obj/BSPSysStripUpdateModifier.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 _BSPSYSSTRIPUPDATEMODIFIER_H_
+#define _BSPSYSSTRIPUPDATEMODIFIER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiPSysModifier.h"
+namespace Niflib {
+
+class BSPSysStripUpdateModifier;
+typedef Ref<BSPSysStripUpdateModifier> BSPSysStripUpdateModifierRef;
+
+/*! Bethesda-Specific (mesh?) Particle System Modifier. */
+class BSPSysStripUpdateModifier : public NiPSysModifier {
+public:
+	/*! Constructor */
+	NIFLIB_API BSPSysStripUpdateModifier();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSPSysStripUpdateModifier();
+
+	/*!
+	 * 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 */
+	float updateDeltaTime;
+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/BSRefractionFirePeriodController.h b/include/obj/BSRefractionFirePeriodController.h
new file mode 100644
index 00000000..1fa900c2
--- /dev/null
+++ b/include/obj/BSRefractionFirePeriodController.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 _BSREFRACTIONFIREPERIODCONTROLLER_H_
+#define _BSREFRACTIONFIREPERIODCONTROLLER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiTimeController.h"
+namespace Niflib {
+
+class BSRefractionFirePeriodController;
+typedef Ref<BSRefractionFirePeriodController> BSRefractionFirePeriodControllerRef;
+
+/*! Bethesda-specific node. */
+class BSRefractionFirePeriodController : public NiTimeController {
+public:
+	/*! Constructor */
+	NIFLIB_API BSRefractionFirePeriodController();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSRefractionFirePeriodController();
+
+	/*!
+	 * 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/BSRefractionStrengthController.h b/include/obj/BSRefractionStrengthController.h
new file mode 100644
index 00000000..51022379
--- /dev/null
+++ b/include/obj/BSRefractionStrengthController.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 _BSREFRACTIONSTRENGTHCONTROLLER_H_
+#define _BSREFRACTIONSTRENGTHCONTROLLER_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiFloatInterpController.h"
+namespace Niflib {
+
+class BSRefractionStrengthController;
+typedef Ref<BSRefractionStrengthController> BSRefractionStrengthControllerRef;
+
+/*! Bethesda-Specific node. */
+class BSRefractionStrengthController : public NiFloatInterpController {
+public:
+	/*! Constructor */
+	NIFLIB_API BSRefractionStrengthController();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSRefractionStrengthController();
+
+	/*!
+	 * 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/BSSegmentedTriShape.h b/include/obj/BSSegmentedTriShape.h
new file mode 100644
index 00000000..81e2632d
--- /dev/null
+++ b/include/obj/BSSegmentedTriShape.h
@@ -0,0 +1,83 @@
+/* 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 _BSSEGMENTEDTRISHAPE_H_
+#define _BSSEGMENTEDTRISHAPE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiTriShape.h"
+
+// Include structures
+#include "../gen/BSSegmentedTriangle.h"
+namespace Niflib {
+
+class BSSegmentedTriShape;
+typedef Ref<BSSegmentedTriShape> BSSegmentedTriShapeRef;
+
+/*! Bethesda-specific node. */
+class BSSegmentedTriShape : public NiTriShape {
+public:
+	/*! Constructor */
+	NIFLIB_API BSSegmentedTriShape();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSSegmentedTriShape();
+
+	/*!
+	 * 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 */
+	mutable int numSegTriangles;
+	/*! Unknown */
+	vector<BSSegmentedTriangle > segTriangles;
+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/BSShaderLightingProperty.h b/include/obj/BSShaderLightingProperty.h
new file mode 100644
index 00000000..e051eb8a
--- /dev/null
+++ b/include/obj/BSShaderLightingProperty.h
@@ -0,0 +1,98 @@
+/* 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 _BSSHADERLIGHTINGPROPERTY_H_
+#define _BSSHADERLIGHTINGPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiProperty.h"
+namespace Niflib {
+
+class BSShaderLightingProperty;
+typedef Ref<BSShaderLightingProperty> BSShaderLightingPropertyRef;
+
+/*! Bethesda-specific property. */
+class BSShaderLightingProperty : public NiProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API BSShaderLightingProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSShaderLightingProperty();
+
+	/*!
+	 * 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 */
+	unsigned short flags;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	int unknownInt5;
+	/*! The normal string. */
+	string fileName;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	int unknownInt7;
+	/*! Unknown */
+	int unknownInt8;
+	/*! Unknown */
+	float unknownFloat2;
+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/BSShaderNoLightingProperty.h b/include/obj/BSShaderNoLightingProperty.h
new file mode 100644
index 00000000..299dd9e2
--- /dev/null
+++ b/include/obj/BSShaderNoLightingProperty.h
@@ -0,0 +1,98 @@
+/* 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 _BSSHADERNOLIGHTINGPROPERTY_H_
+#define _BSSHADERNOLIGHTINGPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiProperty.h"
+namespace Niflib {
+
+class BSShaderNoLightingProperty;
+typedef Ref<BSShaderNoLightingProperty> BSShaderNoLightingPropertyRef;
+
+/*! Bethesda-specific property. */
+class BSShaderNoLightingProperty : public NiProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API BSShaderNoLightingProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSShaderNoLightingProperty();
+
+	/*!
+	 * 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 */
+	unsigned short flags;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	int unknownInt5;
+	/*! The normal string. */
+	string fileName;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	int unknownInt7;
+	/*! Unknown */
+	int unknownInt8;
+	/*! Unknown */
+	float unknownFloat2;
+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/BSShaderPPLightingProperty.h b/include/obj/BSShaderPPLightingProperty.h
new file mode 100644
index 00000000..e52d1b9a
--- /dev/null
+++ b/include/obj/BSShaderPPLightingProperty.h
@@ -0,0 +1,101 @@
+/* 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 _BSSHADERPPLIGHTINGPROPERTY_H_
+#define _BSSHADERPPLIGHTINGPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class BSShaderTextureSet;
+class BSShaderPPLightingProperty;
+typedef Ref<BSShaderPPLightingProperty> BSShaderPPLightingPropertyRef;
+
+/*! Bethesda-specific Shade node. */
+class BSShaderPPLightingProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API BSShaderPPLightingProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSShaderPPLightingProperty();
+
+	/*!
+	 * 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 */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	int unknownInt5;
+	/*! Texture Set */
+	Ref<BSShaderTextureSet > textureSet;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	int unknownInt7;
+	/*! Unknown */
+	int unknownInt8;
+	/*! Unknown */
+	int unknownInt9;
+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/BSShaderProperty.h b/include/obj/BSShaderProperty.h
new file mode 100644
index 00000000..e05e8cf3
--- /dev/null
+++ b/include/obj/BSShaderProperty.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 _BSSHADERPROPERTY_H_
+#define _BSSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiProperty.h"
+namespace Niflib {
+
+class BSShaderProperty;
+typedef Ref<BSShaderProperty> BSShaderPropertyRef;
+
+/*! Bethesda-specific Property node */
+class BSShaderProperty : public NiProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API BSShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSShaderProperty();
+
+	/*!
+	 * 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/BSShaderTextureSet.h b/include/obj/BSShaderTextureSet.h
new file mode 100644
index 00000000..93478fe8
--- /dev/null
+++ b/include/obj/BSShaderTextureSet.h
@@ -0,0 +1,80 @@
+/* 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 _BSSHADERTEXTURESET_H_
+#define _BSSHADERTEXTURESET_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+namespace Niflib {
+
+class BSShaderTextureSet;
+typedef Ref<BSShaderTextureSet> BSShaderTextureSetRef;
+
+/*! Bethesda-specific node. */
+class BSShaderTextureSet : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API BSShaderTextureSet();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSShaderTextureSet();
+
+	/*!
+	 * 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:
+	/*! Object name. */
+	mutable int numTextures;
+	/*! Textures */
+	vector<string > textures;
+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/BSStripPSysData.h b/include/obj/BSStripPSysData.h
new file mode 100644
index 00000000..2b447828
--- /dev/null
+++ b/include/obj/BSStripPSysData.h
@@ -0,0 +1,84 @@
+/* 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 _BSSTRIPPSYSDATA_H_
+#define _BSSTRIPPSYSDATA_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiPSysData.h"
+namespace Niflib {
+
+class BSStripPSysData;
+typedef Ref<BSStripPSysData> BSStripPSysDataRef;
+
+/*! Bethesda-Specific (mesh?) Particle System Data. */
+class BSStripPSysData : public NiPSysData {
+public:
+	/*! Constructor */
+	NIFLIB_API BSStripPSysData();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSStripPSysData();
+
+	/*!
+	 * 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 */
+	short unknownShort1;
+	/*! Unknown */
+	byte unknownByte1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+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/BSStripParticleSystem.h b/include/obj/BSStripParticleSystem.h
new file mode 100644
index 00000000..5ae360ea
--- /dev/null
+++ b/include/obj/BSStripParticleSystem.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 _BSSTRIPPARTICLESYSTEM_H_
+#define _BSSTRIPPARTICLESYSTEM_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiParticleSystem.h"
+namespace Niflib {
+
+class BSStripParticleSystem;
+typedef Ref<BSStripParticleSystem> BSStripParticleSystemRef;
+
+/*! Bethesda-Specific (mesh?) Particle System. */
+class BSStripParticleSystem : public NiParticleSystem {
+public:
+	/*! Constructor */
+	NIFLIB_API BSStripParticleSystem();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSStripParticleSystem();
+
+	/*!
+	 * 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/BSTreadTransfInterpolator.h b/include/obj/BSTreadTransfInterpolator.h
new file mode 100644
index 00000000..65c56f5a
--- /dev/null
+++ b/include/obj/BSTreadTransfInterpolator.h
@@ -0,0 +1,85 @@
+/* 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 _BSTREADTRANSFINTERPOLATOR_H_
+#define _BSTREADTRANSFINTERPOLATOR_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiInterpolator.h"
+
+// Include structures
+#include "../gen/BSTreadTransfInfo.h"
+namespace Niflib {
+
+class BSTreadTransfInterpolator;
+typedef Ref<BSTreadTransfInterpolator> BSTreadTransfInterpolatorRef;
+
+/*! Bethesda-specific node. */
+class BSTreadTransfInterpolator : public NiInterpolator {
+public:
+	/*! Constructor */
+	NIFLIB_API BSTreadTransfInterpolator();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSTreadTransfInterpolator();
+
+	/*!
+	 * 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 */
+	mutable int numTransfers;
+	/*! Unknown */
+	vector<BSTreadTransfInfo > treadTransferInfo;
+	/*! Unknown */
+	int unknownInt1;
+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/BSValueNode.h b/include/obj/BSValueNode.h
new file mode 100644
index 00000000..97a0c5e5
--- /dev/null
+++ b/include/obj/BSValueNode.h
@@ -0,0 +1,80 @@
+/* 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 _BSVALUENODE_H_
+#define _BSVALUENODE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiNode.h"
+namespace Niflib {
+
+class BSValueNode;
+typedef Ref<BSValueNode> BSValueNodeRef;
+
+/*! Bethesda-Specific node. Found on fxFire effects */
+class BSValueNode : public NiNode {
+public:
+	/*! Constructor */
+	NIFLIB_API BSValueNode();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSValueNode();
+
+	/*!
+	 * 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:
+	/*! Value */
+	int value;
+	/*! Unknown */
+	byte unknownByte;
+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/BSWArray.h b/include/obj/BSWArray.h
new file mode 100644
index 00000000..f7c280c4
--- /dev/null
+++ b/include/obj/BSWArray.h
@@ -0,0 +1,80 @@
+/* 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 _BSWARRAY_H_
+#define _BSWARRAY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiExtraData.h"
+namespace Niflib {
+
+class BSWArray;
+typedef Ref<BSWArray> BSWArrayRef;
+
+/*! Bethesda-specific node. */
+class BSWArray : public NiExtraData {
+public:
+	/*! Constructor */
+	NIFLIB_API BSWArray();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~BSWArray();
+
+	/*!
+	 * 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 */
+	mutable int numItems;
+	/*! Unknown */
+	vector<int > items;
+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/DistantLODShaderProperty.h b/include/obj/DistantLODShaderProperty.h
new file mode 100644
index 00000000..109bd9ef
--- /dev/null
+++ b/include/obj/DistantLODShaderProperty.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 _DISTANTLODSHADERPROPERTY_H_
+#define _DISTANTLODSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class DistantLODShaderProperty;
+typedef Ref<DistantLODShaderProperty> DistantLODShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class DistantLODShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API DistantLODShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~DistantLODShaderProperty();
+
+	/*!
+	 * 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/HairShaderProperty.h b/include/obj/HairShaderProperty.h
new file mode 100644
index 00000000..cefdb963
--- /dev/null
+++ b/include/obj/HairShaderProperty.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 _HAIRSHADERPROPERTY_H_
+#define _HAIRSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class HairShaderProperty;
+typedef Ref<HairShaderProperty> HairShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class HairShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API HairShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~HairShaderProperty();
+
+	/*!
+	 * 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/Lighting30ShaderProperty.h b/include/obj/Lighting30ShaderProperty.h
new file mode 100644
index 00000000..f05b3795
--- /dev/null
+++ b/include/obj/Lighting30ShaderProperty.h
@@ -0,0 +1,96 @@
+/* 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 _LIGHTING30SHADERPROPERTY_H_
+#define _LIGHTING30SHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class Lighting30ShaderProperty;
+typedef Ref<Lighting30ShaderProperty> Lighting30ShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class Lighting30ShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API Lighting30ShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~Lighting30ShaderProperty();
+
+	/*!
+	 * 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 */
+	int unknownInt1;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	float unknownFloat2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	int unknownInt5;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	float unknownFloat3;
+	/*! Unknown */
+	float unknownFloat4;
+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/NiAVObject.h b/include/obj/NiAVObject.h
index dabada9a..1f41efea 100644
--- a/include/obj/NiAVObject.h
+++ b/include/obj/NiAVObject.h
@@ -269,6 +269,8 @@ protected:
 protected:
 	/*! Some flags; commonly 0x000C or 0x000A. */
 	unsigned short flags;
+	/*! Unknown Flag */
+	unsigned short unknownShort1;
 	/*! The translation vector. */
 	Vector3 translation;
 	/*! The rotation part of the transformation matrix. */
diff --git a/include/obj/NiAdditionalGeometryData.h b/include/obj/NiAdditionalGeometryData.h
new file mode 100644
index 00000000..ece4197d
--- /dev/null
+++ b/include/obj/NiAdditionalGeometryData.h
@@ -0,0 +1,90 @@
+/* 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 _NIADDITIONALGEOMETRYDATA_H_
+#define _NIADDITIONALGEOMETRYDATA_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiObject.h"
+
+// Include structures
+#include "../gen/AdditionalDataInfo.h"
+#include "../gen/AdditionalDataBlock.h"
+namespace Niflib {
+
+class NiAdditionalGeometryData;
+typedef Ref<NiAdditionalGeometryData> NiAdditionalGeometryDataRef;
+
+/*!  */
+class NiAdditionalGeometryData : public NiObject {
+public:
+	/*! Constructor */
+	NIFLIB_API NiAdditionalGeometryData();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~NiAdditionalGeometryData();
+
+	/*!
+	 * 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:
+	/*! Number of vertices */
+	unsigned short numVertices;
+	/*! Information about additional data blocks */
+	mutable unsigned int numBlockInfos;
+	/*! Number of additional data blocks */
+	vector<AdditionalDataInfo > blockInfos;
+	/*! Number of additional data blocks */
+	mutable int numBlocks;
+	/*! Number of additional data blocks */
+	vector<AdditionalDataBlock > blocks;
+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/NiControllerSequence.h b/include/obj/NiControllerSequence.h
index c1aac068..993c656e 100644
--- a/include/obj/NiControllerSequence.h
+++ b/include/obj/NiControllerSequence.h
@@ -7,8 +7,8 @@ All rights reserved.  Please see niflib.h for license. */
 // the next update.                                                          //
 //-----------------------------------NOTICE----------------------------------//
 
-#ifndef _NICONTROLLERSEQUENCE_H_
-#define _NICONTROLLERSEQUENCE_H_
+#ifndef _NiControllerSequence_H_
+#define _NiControllerSequence_H_
 
 //--BEGIN FILE HEAD CUSTOM CODE--//
 namespace Niflib {
@@ -94,14 +94,14 @@ public:
 	/*! 
 	 * Attatches a controler to this KF file for a KF file of version 10.2.0.0 or below.  Versions above this use interpolators.
 	 * \param[in] obj A reference to the new NiTimeController to attach.
-	 * \sa NiControllerSequence::ClearChildren, NiControllersequence::AddInterpolator
+	 * \sa NiControllerSequence::ClearChildren, NiControllerSequence::AddInterpolator
 	 */
 	NIFLIB_API void AddController( NiTimeController * obj );
 
 	/*! 
 	* Attaches a controler to this KF file for a KF file of version 10.2.0.0 or below.  Versions above this use interpolators.
 	* \param[in] obj A reference to the new NiTimeController to attach.
-	* \sa NiControllerSequence::ClearChildren, NiControllersequence::AddInterpolator
+	* \sa NiControllerSequence::ClearChildren, NiControllerSequence::AddInterpolator
 	*/
 	NIFLIB_API void AddController( string const & targetName, NiTimeController * obj );
 
@@ -115,17 +115,24 @@ public:
 
 	/*! 
 	 * Removes all controllers and interpolators from this Kf file root object.
-	 * \sa NiControllerSequence::AddController, NiControllersequence::AddInterpolator
+	 * \sa NiControllerSequence::AddController, NiControllerSequence::AddInterpolator
 	 */
 	NIFLIB_API void ClearControllerData();
 
 	/*!
 	 * Retrieves the data for the controllers or interpolators which are attached to this controller sequence.
 	 * \return A vector containing the data for all controllers.
-	 * \sa NiControllerSequence::AddController, NiControllersequence::AddInterpolator, ClearKfChildren
+	 * \sa NiControllerSequence::AddController, NiControllerSequence::AddInterpolator, NiControllerSequence::SetContollerData
 	 */
 	NIFLIB_API vector<ControllerLink> GetControllerData() const;
 
+	/*!
+	* Retrieves the data for the controllers or interpolators which are attached to this controller sequence.
+	* \return A vector containing the data for all controllers.
+	* \sa NiControllerSequence::AddController, NiControllerSequence::AddInterpolator, NiControllerSequence::GetContollerData
+	*/
+	NIFLIB_API void SetControllerData(const vector<ControllerLink>& value);
+
 	/*!
 	 * Retrieves the text keys, which are tags associated with keyframe times that mark the start and stop of each sequence, among other things such as the triggering of sound effects.
 	 * \return The text key data.
@@ -227,6 +234,18 @@ public:
 	 */
 	NIFLIB_API void SetTargetName( const string & value );
 
+	/*!
+	* Gets the string palette for this controller.
+	* \return The string palette.
+	*/
+	NIFLIB_API Ref<NiStringPalette > GetStringPalette() const;
+
+	/*!
+	* Sets the string palette for this controller.
+	* \param[in] value The string palette.
+	*/
+	NIFLIB_API void SetStringPalette( const Ref<NiStringPalette >& value );
+
 protected:
    friend class NiControllerManager;
    NiControllerManager * GetParent() const;
@@ -261,6 +280,10 @@ protected:
 	IndexString targetName;
 	/*! Refers to NiStringPalette. */
 	Ref<NiStringPalette > stringPalette;
+	/*! Unknown */
+	short unknownShort1;
+	/*! Unknown */
+	short unknownShort2;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiGeometry.h b/include/obj/NiGeometry.h
index c6fb7a7a..6edf969a 100644
--- a/include/obj/NiGeometry.h
+++ b/include/obj/NiGeometry.h
@@ -12,6 +12,7 @@ All rights reserved.  Please see niflib.h for license. */
 
 //--BEGIN FILE HEAD CUSTOM CODE--//
 #include "../gen/SkinWeight.h"
+#include "../obj/NiGeometryData.h"
 //--END CUSTOM CODE--//
 
 #include "NiAVObject.h"
@@ -21,7 +22,7 @@ All rights reserved.  Please see niflib.h for license. */
 namespace Niflib {
 
 // Forward define of referenced NIF objects
-class NiGeometryData;
+class NiObject;
 class NiSkinInstance;
 class NiGeometry;
 typedef Ref<NiGeometry> NiGeometryRef;
@@ -148,7 +149,7 @@ public:
 	//--END CUSTOM CODE--//
 protected:
 	/*! Data index (NiTriShapeData/NiTriStripData). */
-	Ref<NiGeometryData > data;
+	Ref<NiObject > data;
 	/*! Skin instance index. */
 	Ref<NiSkinInstance > skinInstance;
 	/*! Num Materials */
diff --git a/include/obj/NiGeometryData.h b/include/obj/NiGeometryData.h
index d4eddadb..953a0d0d 100644
--- a/include/obj/NiGeometryData.h
+++ b/include/obj/NiGeometryData.h
@@ -20,7 +20,7 @@ All rights reserved.  Please see niflib.h for license. */
 namespace Niflib {
 
 // Forward define of referenced NIF objects
-class NiObject;
+class NiAdditionalGeometryData;
 class NiGeometryData;
 typedef Ref<NiGeometryData> NiGeometryDataRef;
 
@@ -274,7 +274,7 @@ protected:
 	/*! Consistency Flags */
 	ConsistencyType consistencyFlags;
 	/*! Unknown. */
-	Ref<NiObject > unknownLink1;
+	Ref<NiAdditionalGeometryData > additionalData;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiMaterialProperty.h b/include/obj/NiMaterialProperty.h
index 5760b328..65a7f766 100644
--- a/include/obj/NiMaterialProperty.h
+++ b/include/obj/NiMaterialProperty.h
@@ -157,6 +157,8 @@ protected:
 	 * in this material's parent NiTriShape object, when alpha is not 1.
 	 */
 	float alpha;
+	/*! Unknown */
+	float emitmulti;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiPSysCollider.h b/include/obj/NiPSysCollider.h
index 04eb1455..04def741 100644
--- a/include/obj/NiPSysCollider.h
+++ b/include/obj/NiPSysCollider.h
@@ -78,7 +78,7 @@ protected:
 	 * Links to a NiNode that will define where in object space the collider is
 	 * located/oriented.
 	 */
-	Ref<NiNode > colliderObject;
+	NiNode * colliderObject;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiPSysGravityModifier.h b/include/obj/NiPSysGravityModifier.h
index b0d7a113..c4b957ca 100644
--- a/include/obj/NiPSysGravityModifier.h
+++ b/include/obj/NiPSysGravityModifier.h
@@ -74,6 +74,8 @@ protected:
 	float turbulence;
 	/*! Range for turbulence. */
 	float turbulenceScale;
+	/*! Unknown */
+	byte unknownByte;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiPSysGrowFadeModifier.h b/include/obj/NiPSysGrowFadeModifier.h
index 4f0701de..75f6706d 100644
--- a/include/obj/NiPSysGrowFadeModifier.h
+++ b/include/obj/NiPSysGrowFadeModifier.h
@@ -67,6 +67,8 @@ protected:
 	float fadeTime;
 	/*! Unknown. */
 	unsigned short fadeGeneration;
+	/*! Unknown */
+	float baseScale;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiParticlesData.h b/include/obj/NiParticlesData.h
index ef25dff0..fb8dc260 100644
--- a/include/obj/NiParticlesData.h
+++ b/include/obj/NiParticlesData.h
@@ -13,14 +13,19 @@ All rights reserved.  Please see niflib.h for license. */
 //--BEGIN FILE HEAD CUSTOM CODE--//
 //--END CUSTOM CODE--//
 
-#include "NiGeometryData.h"
+#include "NiObject.h"
+
+// Include structures
+#include "../Ref.h"
 namespace Niflib {
 
+// Forward define of referenced NIF objects
+class NiAdditionalGeometryData;
 class NiParticlesData;
 typedef Ref<NiParticlesData> NiParticlesDataRef;
 
 /*! Generic rotating particles data object. */
-class NiParticlesData : public NiGeometryData {
+class NiParticlesData : public NiObject {
 public:
 	/*! Constructor */
 	NIFLIB_API NiParticlesData();
@@ -55,37 +60,114 @@ public:
 	//--BEGIN MISC CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 protected:
+	/*! Name of this object. */
+	IndexString name;
+	/*!
+	 * Number of vertices. For NiPSysData this is max particles. (For Fallout 3 this is
+	 * always zero)
+	 */
+	mutable unsigned short numVertices;
+	/*! Used with NiCollision objects when OBB or TRI is set. */
+	byte keepFlags;
+	/*! Unknown. */
+	byte compressFlags;
+	/*! Is the vertex array present? (Always non-zero.) */
+	bool hasVertices;
+	/*! The mesh vertices. */
+	vector<Vector3 > vertices;
+	/*!
+	 * Methods for saving binormals and tangents saved in upper byte.  Texture flags in
+	 * lower byte.
+	 */
+	mutable unsigned short numUvSets;
+	/*!
+	 * Do we have lighting normals? These are essential for proper lighting: if not
+	 * present, the model will only be influenced by ambient light.
+	 */
+	bool hasNormals;
+	/*! The lighting normals. */
+	vector<Vector3 > normals;
+	/*!
+	 * Unknown. Binormal & tangents? has_normals must be set as well for this field to
+	 * be present.
+	 */
+	vector<Vector3 > binormals;
+	/*! Unknown. Binormal & tangents? */
+	vector<Vector3 > tangents;
+	/*!
+	 * Center of the bounding box (smallest box that contains all vertices) of the
+	 * mesh.
+	 */
+	Vector3 center;
+	/*!
+	 * Radius of the mesh: maximal Euclidean distance between the center and all
+	 * vertices.
+	 */
+	float radius;
+	/*!
+	 * Do we have vertex colors? These are usually used to fine-tune the lighting of
+	 * the model.
+	 * 
+	 *             Note: how vertex colors influence the model can be controlled by
+	 * having a NiVertexColorProperty object as a property child of the root node. If
+	 * this property object is not present, the vertex colors fine-tune lighting.
+	 * 
+	 *             Note 2: set to either 0 or 0xFFFFFFFF for NifTexture compatibility.
+	 */
+	bool hasVertexColors;
+	/*! The vertex colors. */
+	vector<Color4 > vertexColors;
+	/*!
+	 * Do we have UV coordinates?
+	 * 
+	 *             Note: for compatibility with NifTexture, set this value to either
+	 * 0x00000000 or 0xFFFFFFFF.
+	 */
+	bool hasUv;
+	/*!
+	 * The UV texture coordinates. They follow the OpenGL standard: some programs may
+	 * require you to flip the second coordinate.
+	 */
+	vector< vector<TexCoord > > uvSets;
+	/*! Consistency Flags */
+	ConsistencyType consistencyFlags;
+	/*! Unknown. */
+	Ref<NiAdditionalGeometryData > additionalData;
 	/*! The maximum number of particles (matches the number of vertices). */
 	unsigned short numParticles;
-	/*! The particles' size. */
-	float size;
+	/*! Is the particle size array present? */
+	bool hasRadii;
+	/*! The individual particel sizes. */
+	vector<float > radii;
 	/*!
 	 * The number of active particles at the time the system was saved. This is also
 	 * the number of valid entries in the following arrays.
 	 */
 	unsigned short numActive;
-	/*! Unknown. */
-	unsigned short unknownShort;
-	/*! Is the particle size array present? */
-	bool hasSizes;
-	/*! The individual particel sizes. */
-	vector<float > sizes;
 	/*! Unknown */
-	bool hasUnknownFloats1;
+	int hasSizes1;
+	/*! Unknown */
+	bool hasSizes;
 	/*! Unknown */
-	vector<float > unknownFloats1;
+	vector<float > sizes;
 	/*! Is the particle rotation array present? */
 	bool hasRotations1;
 	/*! The individual particle rotations. */
 	vector<Quaternion > rotations1;
-	/*! Unknown in Warhammer. Guess at version. */
-	bool hasUnknownFloats2;
+	/*! Are the angles of rotation present? */
+	bool hasRotationAngles;
+	/*! Angles of rotation */
+	vector<float > rotationAngles;
+	/*! Are axes of rotation present? */
+	bool hasRotationAxes;
 	/*! Unknown */
-	vector<float > unknownFloats2;
-	/*! Unknown. */
-	bool hasUnknownVertices1;
+	vector<Vector3 > rotationAxes;
+	/*! Unknown ushort */
+	bool hasUnknownStuff1;
+	/*! Unknown */
+	mutable short numUnknownStuff1;
 	/*! Unknown */
-	vector<Vector3 > unknownVertices1;
+	vector<Vector4 > unknownStuff1;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/NiTimeController.h b/include/obj/NiTimeController.h
index 391cfa3b..ac7f2d69 100644
--- a/include/obj/NiTimeController.h
+++ b/include/obj/NiTimeController.h
@@ -159,10 +159,10 @@ protected:
 	Ref<NiTimeController > nextController;
 	/*!
 	 * Controller flags (usually 0x000C). Probably controls loops.
-	 *              Bit 0 : Anim type, 0=APP_TIME 1=APP_INIT
-	 *              Bit 1-2 : Cycle type  00=Loop 01=Reverse 10=Loop
-	 *              Bit 3 : Active
-	 *              Bit 4 : Play backwards
+	 *             Bit 0 : Anim type, 0=APP_TIME 1=APP_INIT
+	 *             Bit 1-2 : Cycle type  00=Loop 01=Reverse 10=Loop
+	 *             Bit 3 : Active
+	 *             Bit 4 : Play backwards
 	 */
 	unsigned short flags;
 	/*! Frequency (is usually 1.0). */
diff --git a/include/obj/SkyShaderProperty.h b/include/obj/SkyShaderProperty.h
new file mode 100644
index 00000000..77e66c6a
--- /dev/null
+++ b/include/obj/SkyShaderProperty.h
@@ -0,0 +1,94 @@
+/* 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 _SKYSHADERPROPERTY_H_
+#define _SKYSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiProperty.h"
+namespace Niflib {
+
+class SkyShaderProperty;
+typedef Ref<SkyShaderProperty> SkyShaderPropertyRef;
+
+/*! Bethesda-specific node? Found in Fallout3 */
+class SkyShaderProperty : public NiProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API SkyShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~SkyShaderProperty();
+
+	/*!
+	 * 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 */
+	short unknownShort1;
+	/*! Unknown */
+	short unknownShort2;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	short unknownShort3;
+	/*! The normal string. */
+	string fileName;
+	/*! Unknown */
+	int unknownInt5;
+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/TallGrassShaderProperty.h b/include/obj/TallGrassShaderProperty.h
new file mode 100644
index 00000000..a97a3691
--- /dev/null
+++ b/include/obj/TallGrassShaderProperty.h
@@ -0,0 +1,86 @@
+/* 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 _TALLGRASSSHADERPROPERTY_H_
+#define _TALLGRASSSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class TallGrassShaderProperty;
+typedef Ref<TallGrassShaderProperty> TallGrassShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class TallGrassShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API TallGrassShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~TallGrassShaderProperty();
+
+	/*!
+	 * 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 */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownFloat1;
+	/*! The normal string. */
+	string fileName;
+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/TileShaderProperty.h b/include/obj/TileShaderProperty.h
new file mode 100644
index 00000000..d0ff38f1
--- /dev/null
+++ b/include/obj/TileShaderProperty.h
@@ -0,0 +1,88 @@
+/* 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 _TILESHADERPROPERTY_H_
+#define _TILESHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class TileShaderProperty;
+typedef Ref<TileShaderProperty> TileShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class TileShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API TileShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~TileShaderProperty();
+
+	/*!
+	 * 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 */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	int unknownInt5;
+	/*! The normal string. */
+	string fileName;
+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/VolumetricFogShaderProperty.h b/include/obj/VolumetricFogShaderProperty.h
new file mode 100644
index 00000000..765cb34d
--- /dev/null
+++ b/include/obj/VolumetricFogShaderProperty.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 _VOLUMETRICFOGSHADERPROPERTY_H_
+#define _VOLUMETRICFOGSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiShadeProperty.h"
+namespace Niflib {
+
+class VolumetricFogShaderProperty;
+typedef Ref<VolumetricFogShaderProperty> VolumetricFogShaderPropertyRef;
+
+/*! Bethesda-specific node. */
+class VolumetricFogShaderProperty : public NiShadeProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API VolumetricFogShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~VolumetricFogShaderProperty();
+
+	/*!
+	 * 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/WaterShaderProperty.h b/include/obj/WaterShaderProperty.h
new file mode 100644
index 00000000..ef7da036
--- /dev/null
+++ b/include/obj/WaterShaderProperty.h
@@ -0,0 +1,88 @@
+/* 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 _WATERSHADERPROPERTY_H_
+#define _WATERSHADERPROPERTY_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "NiProperty.h"
+namespace Niflib {
+
+class WaterShaderProperty;
+typedef Ref<WaterShaderProperty> WaterShaderPropertyRef;
+
+/*! Bethesda-specific node? Found in Fallout3 */
+class WaterShaderProperty : public NiProperty {
+public:
+	/*! Constructor */
+	NIFLIB_API WaterShaderProperty();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~WaterShaderProperty();
+
+	/*!
+	 * 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 */
+	short unknownShort1;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	short unknownShort2;
+	/*! Unknown */
+	unsigned short unknownUshort1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	float unknownFloat1;
+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/bhkAabbPhantom.h b/include/obj/bhkAabbPhantom.h
new file mode 100644
index 00000000..6c23db3f
--- /dev/null
+++ b/include/obj/bhkAabbPhantom.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 _BHKAABBPHANTOM_H_
+#define _BHKAABBPHANTOM_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "bhkShapePhantom.h"
+namespace Niflib {
+
+class bhkAabbPhantom;
+typedef Ref<bhkAabbPhantom> bhkAabbPhantomRef;
+
+/*! Bethesda-specific node. */
+class bhkAabbPhantom : public bhkShapePhantom {
+public:
+	/*! Constructor */
+	NIFLIB_API bhkAabbPhantom();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~bhkAabbPhantom();
+
+	/*!
+	 * 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<15,int > unknownInts1;
+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/bhkBreakableConstraint.h b/include/obj/bhkBreakableConstraint.h
new file mode 100644
index 00000000..742fa31d
--- /dev/null
+++ b/include/obj/bhkBreakableConstraint.h
@@ -0,0 +1,80 @@
+/* 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 _BHKBREAKABLECONSTRAINT_H_
+#define _BHKBREAKABLECONSTRAINT_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "bhkConstraint.h"
+namespace Niflib {
+
+class bhkBreakableConstraint;
+typedef Ref<bhkBreakableConstraint> bhkBreakableConstraintRef;
+
+/*! Bethesda-Specific node. */
+class bhkBreakableConstraint : public bhkConstraint {
+public:
+	/*! Constructor */
+	NIFLIB_API bhkBreakableConstraint();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~bhkBreakableConstraint();
+
+	/*!
+	 * 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<41,int > unknownInts1;
+	/*! Unknown */
+	short unknownShort1;
+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/bhkConvexListShape.h b/include/obj/bhkConvexListShape.h
new file mode 100644
index 00000000..291140dd
--- /dev/null
+++ b/include/obj/bhkConvexListShape.h
@@ -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----------------------------------//
+
+#ifndef _BHKCONVEXLISTSHAPE_H_
+#define _BHKCONVEXLISTSHAPE_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "bhkShape.h"
+
+// Include structures
+#include "../Ref.h"
+namespace Niflib {
+
+// Forward define of referenced NIF objects
+class bhkShape;
+class bhkConvexListShape;
+typedef Ref<bhkConvexListShape> bhkConvexListShapeRef;
+
+/*!
+ * A havok shape.
+ *         A list of shapes.
+ * 
+ *         Do not put a bhkPackedNiTriStripsShape in the Sub Shapes. Use a
+ *         separate collision nodes without a list shape for those.
+ * 
+ *         Also, shapes collected in a bhkListShape may not have the correct
+ *         walking noise, so only use it for non-walkable objects.
+ */
+class bhkConvexListShape : public bhkShape {
+public:
+	/*! Constructor */
+	NIFLIB_API bhkConvexListShape();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~bhkConvexListShape();
+
+	/*!
+	 * 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:
+	/*! The number of sub shapes referenced. */
+	mutable unsigned int numSubShapes;
+	/*! List of shapes. */
+	vector<Ref<bhkShape > > subShapes;
+	/*! The shape's material. */
+	HavokMaterial material;
+	/*! Unknown. Set to (0.0,0.0,-0.0,0.0,0.0,-0.0), where -0.0 is 0x80000000 in hex. */
+	array<6,float > unknownFloats;
+	/*! Unknown Flag */
+	byte unknownByte1;
+	/*! Unknown Flag */
+	float unknownFloat1;
+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/bhkHingeConstraint.h b/include/obj/bhkHingeConstraint.h
index 1ce5ab3b..23df035f 100644
--- a/include/obj/bhkHingeConstraint.h
+++ b/include/obj/bhkHingeConstraint.h
@@ -14,6 +14,9 @@ All rights reserved.  Please see niflib.h for license. */
 //--END CUSTOM CODE--//
 
 #include "bhkConstraint.h"
+
+// Include structures
+#include "../gen/HingeDescriptor.h"
 namespace Niflib {
 
 class bhkHingeConstraint;
@@ -55,16 +58,12 @@ public:
 	//--BEGIN MISC CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 protected:
-	/*! Pivot A. */
-	Vector4 pivotA;
-	/*! Unknown. */
-	Vector4 perp2AxleInA1;
-	/*! Unknown. */
-	Vector4 perp2AxleInA2;
-	/*! Pivot B. */
-	Vector4 pivotB;
-	/*! Unknown. */
-	Vector4 axleB;
+	/*! Hinge constraing. */
+	HingeDescriptor hinge;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	byte unknownByte1;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/bhkLimitedHingeConstraint.h b/include/obj/bhkLimitedHingeConstraint.h
index 89fc1399..3a992c29 100644
--- a/include/obj/bhkLimitedHingeConstraint.h
+++ b/include/obj/bhkLimitedHingeConstraint.h
@@ -60,6 +60,24 @@ public:
 protected:
 	/*! Describes a limited hinge constraint */
 	LimitedHingeDescriptor limitedHinge;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	byte isDeathPose;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	int unknownInt5;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	byte unknownByte1;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/bhkLiquidAction.h b/include/obj/bhkLiquidAction.h
new file mode 100644
index 00000000..93f4f3b6
--- /dev/null
+++ b/include/obj/bhkLiquidAction.h
@@ -0,0 +1,90 @@
+/* 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 _BHKLIQUIDACTION_H_
+#define _BHKLIQUIDACTION_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "bhkSerializable.h"
+namespace Niflib {
+
+class bhkLiquidAction;
+typedef Ref<bhkLiquidAction> bhkLiquidActionRef;
+
+/*! Bethesda-specific node. */
+class bhkLiquidAction : public bhkSerializable {
+public:
+	/*! Constructor */
+	NIFLIB_API bhkLiquidAction();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~bhkLiquidAction();
+
+	/*!
+	 * 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 Flag */
+	int unknownInt1;
+	/*! Unknown Flag */
+	int unknownInt2;
+	/*! Unknown Flag */
+	int unknownInt3;
+	/*! Unknown Flag */
+	float unknownFloat1;
+	/*! Unknown Flag */
+	float unknownFloat2;
+	/*! Unknown Flag */
+	float unknownFloat3;
+	/*! Unknown Flag */
+	float unknownFloat4;
+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/bhkMalleableConstraint.h b/include/obj/bhkMalleableConstraint.h
index 454415d8..1e45629b 100644
--- a/include/obj/bhkMalleableConstraint.h
+++ b/include/obj/bhkMalleableConstraint.h
@@ -17,6 +17,7 @@ All rights reserved.  Please see niflib.h for license. */
 
 // Include structures
 #include "../Ref.h"
+#include "../gen/HingeDescriptor.h"
 #include "../gen/RagdollDescriptor.h"
 #include "../gen/LimitedHingeDescriptor.h"
 namespace Niflib {
@@ -73,11 +74,15 @@ protected:
 	/*! Unknown. 1? */
 	unsigned int unknownInt3;
 	/*! Unknown. */
+	HingeDescriptor hinge;
+	/*! Unknown. */
 	RagdollDescriptor ragdoll;
 	/*! Unknown. */
 	LimitedHingeDescriptor limitedHinge;
 	/*! Unknown. */
 	float tau;
+	/*! Unknown */
+	byte unknownByte1;
 	/*! Unknown. */
 	float damping;
 public:
diff --git a/include/obj/bhkOrientHingedBodyAction.h b/include/obj/bhkOrientHingedBodyAction.h
new file mode 100644
index 00000000..52be4a16
--- /dev/null
+++ b/include/obj/bhkOrientHingedBodyAction.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 _BHKORIENTHINGEDBODYACTION_H_
+#define _BHKORIENTHINGEDBODYACTION_H_
+
+//--BEGIN FILE HEAD CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
+
+#include "bhkSerializable.h"
+namespace Niflib {
+
+class bhkOrientHingedBodyAction;
+typedef Ref<bhkOrientHingedBodyAction> bhkOrientHingedBodyActionRef;
+
+/*! Bethesda-Specific node. */
+class bhkOrientHingedBodyAction : public bhkSerializable {
+public:
+	/*! Constructor */
+	NIFLIB_API bhkOrientHingedBodyAction();
+
+	/*! Destructor */
+	NIFLIB_API virtual ~bhkOrientHingedBodyAction();
+
+	/*!
+	 * 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<17,int > unknownInts1;
+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/bhkPrismaticConstraint.h b/include/obj/bhkPrismaticConstraint.h
index 99d5d470..d46f4a71 100644
--- a/include/obj/bhkPrismaticConstraint.h
+++ b/include/obj/bhkPrismaticConstraint.h
@@ -71,6 +71,8 @@ protected:
 	float maxDistance;
 	/*! Friction. */
 	float friction;
+	/*! Unknown */
+	byte unknownByte1;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/bhkRagdollConstraint.h b/include/obj/bhkRagdollConstraint.h
index 6a77af85..ae6d330d 100644
--- a/include/obj/bhkRagdollConstraint.h
+++ b/include/obj/bhkRagdollConstraint.h
@@ -60,6 +60,24 @@ public:
 protected:
 	/*! Ragdoll constraint. */
 	RagdollDescriptor ragdoll;
+	/*! Unknown */
+	float unknownFloat1;
+	/*! Unknown */
+	byte isDeathPose;
+	/*! Unknown */
+	int unknownInt1;
+	/*! Unknown */
+	int unknownInt2;
+	/*! Unknown */
+	int unknownInt3;
+	/*! Unknown */
+	int unknownInt4;
+	/*! Unknown */
+	int unknownInt5;
+	/*! Unknown */
+	int unknownInt6;
+	/*! Unknown */
+	byte unknownByte1;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/include/obj/bhkRigidBody.h b/include/obj/bhkRigidBody.h
index 4e908871..fc5f46e9 100644
--- a/include/obj/bhkRigidBody.h
+++ b/include/obj/bhkRigidBody.h
@@ -21,7 +21,7 @@ All rights reserved.  Please see niflib.h for license. */
 namespace Niflib {
 
 // Forward define of referenced NIF objects
-class bhkConstraint;
+class bhkSerializable;
 class bhkRigidBody;
 typedef Ref<bhkRigidBody> bhkRigidBodyRef;
 
@@ -401,7 +401,7 @@ protected:
 	/*! The number of constraints this object is bound to. */
 	mutable unsigned int numConstraints;
 	/*! Unknown. */
-	vector<Ref<bhkConstraint > > constraints;
+	vector<Ref<bhkSerializable > > constraints;
 	/*! 0 = do not respond to wind, 1 = respond to wind (?) */
 	unsigned int unknownInt9;
 public:
diff --git a/include/obj/hkPackedNiTriStripsData.h b/include/obj/hkPackedNiTriStripsData.h
index 99b04fc3..f1aa983c 100644
--- a/include/obj/hkPackedNiTriStripsData.h
+++ b/include/obj/hkPackedNiTriStripsData.h
@@ -17,6 +17,7 @@ All rights reserved.  Please see niflib.h for license. */
 
 // Include structures
 #include "../gen/hkTriangle.h"
+#include "../gen/OblivionSubShape.h"
 namespace Niflib {
 
 class hkPackedNiTriStripsData;
@@ -116,8 +117,14 @@ protected:
 	vector<hkTriangle > triangles;
 	/*! Number of vertices. */
 	mutable unsigned int numVertices;
+	/*! Unknown. */
+	byte unknownByte1;
 	/*! The vertices? */
 	vector<Vector3 > vertices;
+	/*! Number of subparts. */
+	mutable unsigned short numSubShapes;
+	/*! The subparts. */
+	vector<OblivionSubShape > subShapes;
 public:
 	/*! NIFLIB_HIDDEN function.  For internal use only. */
 	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
diff --git a/niflib.vcproj b/niflib.vcproj
index df6306a4..1ba98aa3 100644
--- a/niflib.vcproj
+++ b/niflib.vcproj
@@ -282,8 +282,8 @@
 		</Configuration>
 		<Configuration
 			Name="Release - DLL|Win32"
-			OutputDirectory="$(ProjectDir)obj\$(ConfigurationName)"
-			IntermediateDirectory="$(ProjectDir)obj\$(ConfigurationName)"
+			OutputDirectory="$(ProjectDir)obj\$(ConfigurationName)\"
+			IntermediateDirectory="$(ProjectDir)obj\$(ConfigurationName)\"
 			ConfigurationType="2"
 			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
 			CharacterSet="2"
@@ -679,6 +679,10 @@
 					RelativePath=".\src\obj\AvoidNode.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkAabbPhantom.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkBlendCollisionObject.cpp"
 					>
@@ -691,6 +695,10 @@
 					RelativePath=".\src\obj\bhkBoxShape.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkBreakableConstraint.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkBvTreeShape.cpp"
 					>
@@ -707,6 +715,10 @@
 					RelativePath=".\src\obj\bhkConstraint.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkConvexListShape.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkConvexShape.cpp"
 					>
@@ -731,6 +743,10 @@
 					RelativePath=".\src\obj\bhkLimitedHingeConstraint.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkLiquidAction.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkListShape.cpp"
 					>
@@ -755,6 +771,10 @@
 					RelativePath=".\src\obj\bhkNiTriStripsShape.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkOrientHingedBodyAction.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkPackedNiTriStripsShape.cpp"
 					>
@@ -831,10 +851,46 @@
 					RelativePath=".\src\obj\bhkWorldObject.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSAnimNotes.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSBlastNode.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSBound.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSDamageStage.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDebrisNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDecalPlacementVectorExtraData.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDismemberSkinInstance.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDistantTreeShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSFadeNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSFrustumFOVController.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSFurnitureMarker.cpp"
 					>
@@ -843,6 +899,34 @@
 					RelativePath=".\src\obj\BSKeyframeController.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSMasterParticleSystem.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMaterialEmittanceMultController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBound.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundAABB.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundSphere.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSOrderedNode.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSParentVelocityModifier.cpp"
 					>
@@ -851,6 +935,70 @@
 					RelativePath=".\src\obj\BSPSysArrayEmitter.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysMultiTargetEmitterCtlr.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysSimpleColorModifier.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysStripUpdateModifier.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSRefractionFirePeriodController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSRefractionStrengthController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSSegmentedTriShape.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderNoLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderPPLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderTextureSet.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSStripParticleSystem.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSStripPSysData.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSTreadTransfInterpolator.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSValueNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSWArray.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSWindModifier.cpp"
 					>
@@ -859,6 +1007,10 @@
 					RelativePath=".\src\obj\BSXFlags.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\DistantLODShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\FxButton.cpp"
 					>
@@ -871,10 +1023,18 @@
 					RelativePath=".\src\obj\FxWidget.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\HairShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\hkPackedNiTriStripsData.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\Lighting30ShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\Ni3dsAlphaAnimator.cpp"
 					>
@@ -899,6 +1059,10 @@
 					RelativePath=".\src\obj\Ni3dsPathController.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\NiAdditionalGeometryData.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\NiAlphaController.cpp"
 					>
@@ -1851,10 +2015,38 @@
 					RelativePath=".\src\obj\RootCollisionNode.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\SkyShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\TallGrassShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\TileShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\VolumetricFogShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\WaterShaderProperty.cpp"
+					>
+				</File>
 			</Filter>
 			<Filter
 				Name="gen"
 				>
+				<File
+					RelativePath=".\src\gen\AdditionalDataBlock.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\AdditionalDataInfo.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\ArkTexture.cpp"
 					>
@@ -1863,6 +2055,10 @@
 					RelativePath=".\src\gen\AVObject.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\BodyPartList.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\BoundingBox.cpp"
 					>
@@ -1875,6 +2071,18 @@
 					RelativePath=".\src\gen\BoxBV.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\BSSegmentedTriangle.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\BSTreadTransfInfo.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\BSTreadTransfSubInfo.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\ByteArray.cpp"
 					>
@@ -1907,6 +2115,10 @@
 					RelativePath=".\src\gen\ControllerLink.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\DecalVectorArray.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\enums.cpp"
 					>
@@ -1931,6 +2143,10 @@
 					RelativePath=".\src\gen\Header.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\HingeDescriptor.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\hkTriangle.cpp"
 					>
@@ -2173,6 +2389,10 @@
 					RelativePath=".\include\obj\AvoidNode.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkAabbPhantom.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkBlendCollisionObject.h"
 					>
@@ -2185,6 +2405,10 @@
 					RelativePath=".\include\obj\bhkBoxShape.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkBreakableConstraint.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkBvTreeShape.h"
 					>
@@ -2201,6 +2425,10 @@
 					RelativePath=".\include\obj\bhkConstraint.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkConvexListShape.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkConvexShape.h"
 					>
@@ -2225,6 +2453,10 @@
 					RelativePath=".\include\obj\bhkLimitedHingeConstraint.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkLiquidAction.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkListShape.h"
 					>
@@ -2249,6 +2481,10 @@
 					RelativePath=".\include\obj\bhkNiTriStripsShape.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkOrientHingedBodyAction.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkPackedNiTriStripsShape.h"
 					>
@@ -2325,10 +2561,46 @@
 					RelativePath=".\include\obj\bhkWorldObject.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSAnimNotes.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSBlastNode.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSBound.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSDamageStage.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDebrisNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDecalPlacementVectorExtraData.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDismemberSkinInstance.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDistantTreeShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSFadeNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSFrustumFOVController.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSFurnitureMarker.h"
 					>
@@ -2337,6 +2609,34 @@
 					RelativePath=".\include\obj\BSKeyframeController.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSMasterParticleSystem.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMaterialEmittanceMultController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBound.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundAABB.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundSphere.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSOrderedNode.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSParentVelocityModifier.h"
 					>
@@ -2345,6 +2645,70 @@
 					RelativePath=".\include\obj\BSPSysArrayEmitter.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysMultiTargetEmitterCtlr.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysSimpleColorModifier.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysStripUpdateModifier.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSRefractionFirePeriodController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSRefractionStrengthController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSSegmentedTriShape.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderNoLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderPPLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderTextureSet.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSStripParticleSystem.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSStripPSysData.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSTreadTransfInterpolator.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSValueNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSWArray.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSWindModifier.h"
 					>
@@ -2353,6 +2717,10 @@
 					RelativePath=".\include\obj\BSXFlags.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\DistantLODShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\FxButton.h"
 					>
@@ -2365,10 +2733,18 @@
 					RelativePath=".\include\obj\FxWidget.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\HairShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\hkPackedNiTriStripsData.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\Lighting30ShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\Ni3dsAlphaAnimator.h"
 					>
@@ -2393,6 +2769,10 @@
 					RelativePath=".\include\obj\Ni3dsPathController.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\NiAdditionalGeometryData.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\NiAlphaController.h"
 					>
@@ -3345,10 +3725,38 @@
 					RelativePath=".\include\obj\RootCollisionNode.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\SkyShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\TallGrassShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\TileShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\VolumetricFogShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\WaterShaderProperty.h"
+					>
+				</File>
 			</Filter>
 			<Filter
 				Name="gen"
 				>
+				<File
+					RelativePath=".\include\gen\AdditionalDataBlock.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\AdditionalDataInfo.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\ArkTexture.h"
 					>
@@ -3357,6 +3765,10 @@
 					RelativePath=".\include\gen\AVObject.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\BodyPartList.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\BoundingBox.h"
 					>
@@ -3369,6 +3781,18 @@
 					RelativePath=".\include\gen\BoxBV.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\BSSegmentedTriangle.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\BSTreadTransfInfo.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\BSTreadTransfSubInfo.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\ByteArray.h"
 					>
@@ -3397,6 +3821,10 @@
 					RelativePath=".\include\gen\ControllerLink.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\DecalVectorArray.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\enums.h"
 					>
@@ -3425,6 +3853,10 @@
 					RelativePath=".\include\gen\Header.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\HingeDescriptor.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\hkTriangle.h"
 					>
diff --git a/niflib_VC2008.vcproj b/niflib_VC2008.vcproj
index a5a8e7eb..cd16925b 100644
--- a/niflib_VC2008.vcproj
+++ b/niflib_VC2008.vcproj
@@ -676,6 +676,10 @@
 					RelativePath=".\src\obj\AvoidNode.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkAabbPhantom.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkBlendCollisionObject.cpp"
 					>
@@ -688,6 +692,10 @@
 					RelativePath=".\src\obj\bhkBoxShape.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkBreakableConstraint.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkBvTreeShape.cpp"
 					>
@@ -704,6 +712,10 @@
 					RelativePath=".\src\obj\bhkConstraint.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkConvexListShape.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkConvexShape.cpp"
 					>
@@ -728,6 +740,10 @@
 					RelativePath=".\src\obj\bhkLimitedHingeConstraint.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkLiquidAction.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkListShape.cpp"
 					>
@@ -752,6 +768,10 @@
 					RelativePath=".\src\obj\bhkNiTriStripsShape.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\bhkOrientHingedBodyAction.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\bhkPackedNiTriStripsShape.cpp"
 					>
@@ -828,10 +848,46 @@
 					RelativePath=".\src\obj\bhkWorldObject.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSAnimNotes.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSBlastNode.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSBound.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSDamageStage.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDebrisNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDecalPlacementVectorExtraData.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDismemberSkinInstance.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSDistantTreeShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSFadeNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSFrustumFOVController.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSFurnitureMarker.cpp"
 					>
@@ -840,6 +896,34 @@
 					RelativePath=".\src\obj\BSKeyframeController.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSMasterParticleSystem.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMaterialEmittanceMultController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBound.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundAABB.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSMultiBoundSphere.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSOrderedNode.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSParentVelocityModifier.cpp"
 					>
@@ -848,6 +932,70 @@
 					RelativePath=".\src\obj\BSPSysArrayEmitter.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysMultiTargetEmitterCtlr.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysSimpleColorModifier.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSPSysStripUpdateModifier.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSRefractionFirePeriodController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSRefractionStrengthController.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSSegmentedTriShape.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderNoLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderPPLightingProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSShaderTextureSet.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSStripParticleSystem.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSStripPSysData.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSTreadTransfInterpolator.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSValueNode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\BSWArray.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\BSWindModifier.cpp"
 					>
@@ -856,6 +1004,10 @@
 					RelativePath=".\src\obj\BSXFlags.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\DistantLODShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\FxButton.cpp"
 					>
@@ -868,10 +1020,18 @@
 					RelativePath=".\src\obj\FxWidget.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\HairShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\hkPackedNiTriStripsData.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\Lighting30ShaderProperty.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\Ni3dsAlphaAnimator.cpp"
 					>
@@ -896,6 +1056,10 @@
 					RelativePath=".\src\obj\Ni3dsPathController.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\NiAdditionalGeometryData.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\obj\NiAlphaController.cpp"
 					>
@@ -1848,10 +2012,38 @@
 					RelativePath=".\src\obj\RootCollisionNode.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\obj\SkyShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\TallGrassShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\TileShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\VolumetricFogShaderProperty.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\obj\WaterShaderProperty.cpp"
+					>
+				</File>
 			</Filter>
 			<Filter
 				Name="gen"
 				>
+				<File
+					RelativePath=".\src\gen\AdditionalDataBlock.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\AdditionalDataInfo.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\ArkTexture.cpp"
 					>
@@ -1860,6 +2052,10 @@
 					RelativePath=".\src\gen\AVObject.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\BodyPartList.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\BoundingBox.cpp"
 					>
@@ -1872,6 +2068,18 @@
 					RelativePath=".\src\gen\BoxBV.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\BSSegmentedTriangle.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\BSTreadTransfInfo.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\gen\BSTreadTransfSubInfo.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\ByteArray.cpp"
 					>
@@ -1904,6 +2112,10 @@
 					RelativePath=".\src\gen\ControllerLink.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\DecalVectorArray.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\enums.cpp"
 					>
@@ -1928,6 +2140,10 @@
 					RelativePath=".\src\gen\Header.cpp"
 					>
 				</File>
+				<File
+					RelativePath=".\src\gen\HingeDescriptor.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\src\gen\hkTriangle.cpp"
 					>
@@ -2170,6 +2386,10 @@
 					RelativePath=".\include\obj\AvoidNode.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkAabbPhantom.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkBlendCollisionObject.h"
 					>
@@ -2182,6 +2402,10 @@
 					RelativePath=".\include\obj\bhkBoxShape.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkBreakableConstraint.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkBvTreeShape.h"
 					>
@@ -2198,6 +2422,10 @@
 					RelativePath=".\include\obj\bhkConstraint.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkConvexListShape.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkConvexShape.h"
 					>
@@ -2222,6 +2450,10 @@
 					RelativePath=".\include\obj\bhkLimitedHingeConstraint.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkLiquidAction.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkListShape.h"
 					>
@@ -2246,6 +2478,10 @@
 					RelativePath=".\include\obj\bhkNiTriStripsShape.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\bhkOrientHingedBodyAction.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\bhkPackedNiTriStripsShape.h"
 					>
@@ -2322,10 +2558,46 @@
 					RelativePath=".\include\obj\bhkWorldObject.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSAnimNotes.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSBlastNode.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSBound.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSDamageStage.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDebrisNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDecalPlacementVectorExtraData.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDismemberSkinInstance.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSDistantTreeShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSFadeNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSFrustumFOVController.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSFurnitureMarker.h"
 					>
@@ -2334,6 +2606,34 @@
 					RelativePath=".\include\obj\BSKeyframeController.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSMasterParticleSystem.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMaterialEmittanceMultController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBound.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundAABB.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSMultiBoundSphere.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSOrderedNode.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSParentVelocityModifier.h"
 					>
@@ -2342,6 +2642,70 @@
 					RelativePath=".\include\obj\BSPSysArrayEmitter.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysMultiTargetEmitterCtlr.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysSimpleColorModifier.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSPSysStripUpdateModifier.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSRefractionFirePeriodController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSRefractionStrengthController.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSSegmentedTriShape.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderNoLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderPPLightingProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSShaderTextureSet.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSStripParticleSystem.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSStripPSysData.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSTreadTransfInterpolator.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSValueNode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\BSWArray.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\BSWindModifier.h"
 					>
@@ -2350,6 +2714,10 @@
 					RelativePath=".\include\obj\BSXFlags.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\DistantLODShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\FxButton.h"
 					>
@@ -2362,10 +2730,18 @@
 					RelativePath=".\include\obj\FxWidget.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\HairShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\hkPackedNiTriStripsData.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\Lighting30ShaderProperty.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\Ni3dsAlphaAnimator.h"
 					>
@@ -2390,6 +2766,10 @@
 					RelativePath=".\include\obj\Ni3dsPathController.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\NiAdditionalGeometryData.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\obj\NiAlphaController.h"
 					>
@@ -3342,10 +3722,38 @@
 					RelativePath=".\include\obj\RootCollisionNode.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\obj\SkyShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\TallGrassShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\TileShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\VolumetricFogShaderProperty.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\obj\WaterShaderProperty.h"
+					>
+				</File>
 			</Filter>
 			<Filter
 				Name="gen"
 				>
+				<File
+					RelativePath=".\include\gen\AdditionalDataBlock.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\AdditionalDataInfo.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\ArkTexture.h"
 					>
@@ -3354,6 +3762,10 @@
 					RelativePath=".\include\gen\AVObject.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\BodyPartList.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\BoundingBox.h"
 					>
@@ -3366,6 +3778,18 @@
 					RelativePath=".\include\gen\BoxBV.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\BSSegmentedTriangle.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\BSTreadTransfInfo.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\gen\BSTreadTransfSubInfo.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\ByteArray.h"
 					>
@@ -3394,6 +3818,10 @@
 					RelativePath=".\include\gen\ControllerLink.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\DecalVectorArray.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\enums.h"
 					>
@@ -3422,6 +3850,10 @@
 					RelativePath=".\include\gen\Header.h"
 					>
 				</File>
+				<File
+					RelativePath=".\include\gen\HingeDescriptor.h"
+					>
+				</File>
 				<File
 					RelativePath=".\include\gen\hkTriangle.h"
 					>
diff --git a/src/gen/AdditionalDataBlock.cpp b/src/gen/AdditionalDataBlock.cpp
new file mode 100644
index 00000000..1fcdf847
--- /dev/null
+++ b/src/gen/AdditionalDataBlock.cpp
@@ -0,0 +1,32 @@
+/* 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/AdditionalDataBlock.h"
+using namespace Niflib;
+
+//Constructor
+AdditionalDataBlock::AdditionalDataBlock() : hasData(false), blockSize((int)0), numBlocks((int)0), numData((int)0) {};
+
+//Copy Constructor
+AdditionalDataBlock::AdditionalDataBlock( const AdditionalDataBlock & src ) {
+	*this = src;
+};
+
+//Copy Operator
+AdditionalDataBlock & AdditionalDataBlock::operator=( const AdditionalDataBlock & src ) {
+	this->hasData = src.hasData;
+	this->blockSize = src.blockSize;
+	this->numBlocks = src.numBlocks;
+	this->blockOffsets = src.blockOffsets;
+	this->numData = src.numData;
+	this->dataSizes = src.dataSizes;
+	this->data = src.data;
+	return *this;
+};
+
+//Destructor
+AdditionalDataBlock::~AdditionalDataBlock() {};
diff --git a/src/gen/AdditionalDataInfo.cpp b/src/gen/AdditionalDataInfo.cpp
new file mode 100644
index 00000000..646bbdee
--- /dev/null
+++ b/src/gen/AdditionalDataInfo.cpp
@@ -0,0 +1,32 @@
+/* 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/AdditionalDataInfo.h"
+using namespace Niflib;
+
+//Constructor
+AdditionalDataInfo::AdditionalDataInfo() : dataType((int)0), blockSize((int)0), numBlocks((int)0), blockSize2((int)0), blockIndex((int)0), unknownInt1((int)0), unknownByte1((byte)0) {};
+
+//Copy Constructor
+AdditionalDataInfo::AdditionalDataInfo( const AdditionalDataInfo & src ) {
+	*this = src;
+};
+
+//Copy Operator
+AdditionalDataInfo & AdditionalDataInfo::operator=( const AdditionalDataInfo & src ) {
+	this->dataType = src.dataType;
+	this->blockSize = src.blockSize;
+	this->numBlocks = src.numBlocks;
+	this->blockSize2 = src.blockSize2;
+	this->blockIndex = src.blockIndex;
+	this->unknownInt1 = src.unknownInt1;
+	this->unknownByte1 = src.unknownByte1;
+	return *this;
+};
+
+//Destructor
+AdditionalDataInfo::~AdditionalDataInfo() {};
diff --git a/src/gen/BSSegmentedTriangle.cpp b/src/gen/BSSegmentedTriangle.cpp
new file mode 100644
index 00000000..a3d2e6f9
--- /dev/null
+++ b/src/gen/BSSegmentedTriangle.cpp
@@ -0,0 +1,28 @@
+/* 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/BSSegmentedTriangle.h"
+using namespace Niflib;
+
+//Constructor
+BSSegmentedTriangle::BSSegmentedTriangle() : unknownInt1((int)0), unknownInt2((int)0), unknownByte1((byte)0) {};
+
+//Copy Constructor
+BSSegmentedTriangle::BSSegmentedTriangle( const BSSegmentedTriangle & src ) {
+	*this = src;
+};
+
+//Copy Operator
+BSSegmentedTriangle & BSSegmentedTriangle::operator=( const BSSegmentedTriangle & src ) {
+	this->unknownInt1 = src.unknownInt1;
+	this->unknownInt2 = src.unknownInt2;
+	this->unknownByte1 = src.unknownByte1;
+	return *this;
+};
+
+//Destructor
+BSSegmentedTriangle::~BSSegmentedTriangle() {};
diff --git a/src/gen/BSTreadTransfInfo.cpp b/src/gen/BSTreadTransfInfo.cpp
new file mode 100644
index 00000000..09b2ee7d
--- /dev/null
+++ b/src/gen/BSTreadTransfInfo.cpp
@@ -0,0 +1,28 @@
+/* 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/BSTreadTransfInfo.h"
+#include "../../include/gen/BSTreadTransfSubInfo.h"
+using namespace Niflib;
+
+//Constructor
+BSTreadTransfInfo::BSTreadTransfInfo() : unknownFloat1(0.0f) {};
+
+//Copy Constructor
+BSTreadTransfInfo::BSTreadTransfInfo( const BSTreadTransfInfo & src ) {
+	*this = src;
+};
+
+//Copy Operator
+BSTreadTransfInfo & BSTreadTransfInfo::operator=( const BSTreadTransfInfo & src ) {
+	this->unknownFloat1 = src.unknownFloat1;
+	this->data = src.data;
+	return *this;
+};
+
+//Destructor
+BSTreadTransfInfo::~BSTreadTransfInfo() {};
diff --git a/src/gen/BSTreadTransfSubInfo.cpp b/src/gen/BSTreadTransfSubInfo.cpp
new file mode 100644
index 00000000..5c4f8ec7
--- /dev/null
+++ b/src/gen/BSTreadTransfSubInfo.cpp
@@ -0,0 +1,33 @@
+/* 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/BSTreadTransfSubInfo.h"
+using namespace Niflib;
+
+//Constructor
+BSTreadTransfSubInfo::BSTreadTransfSubInfo() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownInt4((int)0), unknownInt5((int)0), unknownInt6((int)0), unknownInt7((int)0), unknownInt8((int)0) {};
+
+//Copy Constructor
+BSTreadTransfSubInfo::BSTreadTransfSubInfo( const BSTreadTransfSubInfo & src ) {
+	*this = src;
+};
+
+//Copy Operator
+BSTreadTransfSubInfo & BSTreadTransfSubInfo::operator=( const BSTreadTransfSubInfo & src ) {
+	this->unknownInt1 = src.unknownInt1;
+	this->unknownInt2 = src.unknownInt2;
+	this->unknownInt3 = src.unknownInt3;
+	this->unknownInt4 = src.unknownInt4;
+	this->unknownInt5 = src.unknownInt5;
+	this->unknownInt6 = src.unknownInt6;
+	this->unknownInt7 = src.unknownInt7;
+	this->unknownInt8 = src.unknownInt8;
+	return *this;
+};
+
+//Destructor
+BSTreadTransfSubInfo::~BSTreadTransfSubInfo() {};
diff --git a/src/gen/BodyPartList.cpp b/src/gen/BodyPartList.cpp
new file mode 100644
index 00000000..0f2f2cc5
--- /dev/null
+++ b/src/gen/BodyPartList.cpp
@@ -0,0 +1,27 @@
+/* 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/BodyPartList.h"
+using namespace Niflib;
+
+//Constructor
+BodyPartList::BodyPartList() : unknownShort((short)0), bodyPart((short)0) {};
+
+//Copy Constructor
+BodyPartList::BodyPartList( const BodyPartList & src ) {
+	*this = src;
+};
+
+//Copy Operator
+BodyPartList & BodyPartList::operator=( const BodyPartList & src ) {
+	this->unknownShort = src.unknownShort;
+	this->bodyPart = src.bodyPart;
+	return *this;
+};
+
+//Destructor
+BodyPartList::~BodyPartList() {};
diff --git a/src/gen/DecalVectorArray.cpp b/src/gen/DecalVectorArray.cpp
new file mode 100644
index 00000000..1d6b952c
--- /dev/null
+++ b/src/gen/DecalVectorArray.cpp
@@ -0,0 +1,28 @@
+/* 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/DecalVectorArray.h"
+using namespace Niflib;
+
+//Constructor
+DecalVectorArray::DecalVectorArray() : numVectors((short)0) {};
+
+//Copy Constructor
+DecalVectorArray::DecalVectorArray( const DecalVectorArray & src ) {
+	*this = src;
+};
+
+//Copy Operator
+DecalVectorArray & DecalVectorArray::operator=( const DecalVectorArray & src ) {
+	this->numVectors = src.numVectors;
+	this->points = src.points;
+	this->normals = src.normals;
+	return *this;
+};
+
+//Destructor
+DecalVectorArray::~DecalVectorArray() {};
diff --git a/src/gen/Header.cpp b/src/gen/Header.cpp
index b55a94a2..92dced91 100644
--- a/src/gen/Header.cpp
+++ b/src/gen/Header.cpp
@@ -8,7 +8,6 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/gen/Header.h"
 #include "../../include/gen/ExportInfo.h"
 #include "../../include/gen/ExportInfo.h"
-#include "../../include/gen/ExportInfo.h"
 using namespace Niflib;
 
 //Constructor
@@ -65,10 +64,7 @@ NifInfo Header::Read( istream& in ) {
 		NifStream( numBlocks, in, info );
 	};
 	if ( info.version >= 0x0A010000 ) {
-		if ( (userVersion == 10) ) {
-			NifStream( userVersion2, in, info );
-		};
-		if ( (userVersion == 11) ) {
+		if ( ((userVersion == 10) || (userVersion == 11)) ) {
 			NifStream( userVersion2, in, info );
 		};
 	};
@@ -81,15 +77,7 @@ NifInfo Header::Read( istream& in ) {
 		NifStream( exportInfo.exportInfo2, in, info );
 	};
 	if ( info.version >= 0x0A010000 ) {
-		if ( (userVersion == 10) ) {
-			if ( info.version <= 0x0A000102 ) {
-				NifStream( exportInfo.unknown, in, info );
-			};
-			NifStream( exportInfo.creator, in, info );
-			NifStream( exportInfo.exportInfo1, in, info );
-			NifStream( exportInfo.exportInfo2, in, info );
-		};
-		if ( (userVersion == 11) ) {
+		if ( ((userVersion == 10) || (userVersion == 11)) ) {
 			if ( info.version <= 0x0A000102 ) {
 				NifStream( exportInfo.unknown, in, info );
 			};
@@ -164,10 +152,7 @@ void Header::Write( ostream& out, const NifInfo & info ) const {
 		NifStream( numBlocks, out, info );
 	};
 	if ( info.version >= 0x0A010000 ) {
-		if ( (userVersion == 10) ) {
-			NifStream( userVersion2, out, info );
-		};
-		if ( (userVersion == 11) ) {
+		if ( ((userVersion == 10) || (userVersion == 11)) ) {
 			NifStream( userVersion2, out, info );
 		};
 	};
@@ -180,15 +165,7 @@ void Header::Write( ostream& out, const NifInfo & info ) const {
 		NifStream( exportInfo.exportInfo2, out, info );
 	};
 	if ( info.version >= 0x0A010000 ) {
-		if ( (userVersion == 10) ) {
-			if ( info.version <= 0x0A000102 ) {
-				NifStream( exportInfo.unknown, out, info );
-			};
-			NifStream( exportInfo.creator, out, info );
-			NifStream( exportInfo.exportInfo1, out, info );
-			NifStream( exportInfo.exportInfo2, out, info );
-		};
-		if ( (userVersion == 11) ) {
+		if ( ((userVersion == 10) || (userVersion == 11)) ) {
 			if ( info.version <= 0x0A000102 ) {
 				NifStream( exportInfo.unknown, out, info );
 			};
@@ -246,7 +223,7 @@ string Header::asString( bool verbose ) const {
 	out << "  Endian Type:  " << endianType << endl;
 	out << "  User Version:  " << userVersion << endl;
 	out << "  Num Blocks:  " << numBlocks << endl;
-	if ( (userVersion == 10) ) {
+	if ( ((userVersion == 10) || (userVersion == 11)) ) {
 		out << "    User Version 2:  " << userVersion2 << endl;
 	};
 	out << "  Unknown:  " << exportInfo.unknown << endl;
diff --git a/src/gen/HingeDescriptor.cpp b/src/gen/HingeDescriptor.cpp
new file mode 100644
index 00000000..617c8a10
--- /dev/null
+++ b/src/gen/HingeDescriptor.cpp
@@ -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.
+
+#include "../../include/gen/HingeDescriptor.h"
+using namespace Niflib;
+
+//Constructor
+HingeDescriptor::HingeDescriptor() : unknownFloat1(0.0f), unknownInt2(0.0f), unknownInt3(0.0f), unknownInt4(0.0f), unknownInt5(0.0f), unknownInt6(0.0f), unknownInt7(0.0f), unknownInt8(0.0f), unknownInt9(0.0f), unknownInt10(0.0f), unknownByte1((byte)0), unknownByte2((byte)0), unknownByte3((byte)0) {};
+
+//Copy Constructor
+HingeDescriptor::HingeDescriptor( const HingeDescriptor & src ) {
+	*this = src;
+};
+
+//Copy Operator
+HingeDescriptor & HingeDescriptor::operator=( const HingeDescriptor & src ) {
+	this->pivotA = src.pivotA;
+	this->perp2AxleInA1 = src.perp2AxleInA1;
+	this->perp2AxleInA2 = src.perp2AxleInA2;
+	this->pivotB = src.pivotB;
+	this->axleB = src.axleB;
+	this->unknownFloat1 = src.unknownFloat1;
+	this->unknownInt2 = src.unknownInt2;
+	this->unknownInt3 = src.unknownInt3;
+	this->unknownInt4 = src.unknownInt4;
+	this->unknownInt5 = src.unknownInt5;
+	this->unknownInt6 = src.unknownInt6;
+	this->unknownInt7 = src.unknownInt7;
+	this->unknownInt8 = src.unknownInt8;
+	this->unknownInt9 = src.unknownInt9;
+	this->unknownInt10 = src.unknownInt10;
+	this->unknownByte1 = src.unknownByte1;
+	this->unknownByte2 = src.unknownByte2;
+	this->unknownByte3 = src.unknownByte3;
+	return *this;
+};
+
+//Destructor
+HingeDescriptor::~HingeDescriptor() {};
diff --git a/src/gen/LimitedHingeDescriptor.cpp b/src/gen/LimitedHingeDescriptor.cpp
index 1081461e..e42d646e 100644
--- a/src/gen/LimitedHingeDescriptor.cpp
+++ b/src/gen/LimitedHingeDescriptor.cpp
@@ -9,7 +9,7 @@ All rights reserved.  Please see niflib.h for license. */
 using namespace Niflib;
 
 //Constructor
-LimitedHingeDescriptor::LimitedHingeDescriptor() : minAngle(0.0f), maxAngle(0.0f), maxFriction(0.0f) {};
+LimitedHingeDescriptor::LimitedHingeDescriptor() : minAngle(0.0f), maxAngle(0.0f), maxFriction(0.0f), unknownFloat1(0.0f), unknownFloat2(0.0f), unknownFloat3(0.0f) {};
 
 //Copy Constructor
 LimitedHingeDescriptor::LimitedHingeDescriptor( const LimitedHingeDescriptor & src ) {
@@ -28,6 +28,9 @@ LimitedHingeDescriptor & LimitedHingeDescriptor::operator=( const LimitedHingeDe
 	this->minAngle = src.minAngle;
 	this->maxAngle = src.maxAngle;
 	this->maxFriction = src.maxFriction;
+	this->unknownFloat1 = src.unknownFloat1;
+	this->unknownFloat2 = src.unknownFloat2;
+	this->unknownFloat3 = src.unknownFloat3;
 	return *this;
 };
 
diff --git a/src/gen/RagdollDescriptor.cpp b/src/gen/RagdollDescriptor.cpp
index 456572e1..f9f56959 100644
--- a/src/gen/RagdollDescriptor.cpp
+++ b/src/gen/RagdollDescriptor.cpp
@@ -9,7 +9,7 @@ All rights reserved.  Please see niflib.h for license. */
 using namespace Niflib;
 
 //Constructor
-RagdollDescriptor::RagdollDescriptor() : coneMaxAngle(0.0f), planeMinAngle(0.0f), planeMaxAngle(0.0f), twistMinAngle(0.0f), twistMaxAngle(0.0f), maxFriction(0.0f) {};
+RagdollDescriptor::RagdollDescriptor() : coneMaxAngle(0.0f), planeMinAngle(0.0f), planeMaxAngle(0.0f), twistMinAngle(0.0f), twistMaxAngle(0.0f), maxFriction(0.0f), unknownFloat1(0.0f), unknownFloat2(0.0f), unknownFloat3(0.0f), unknownFloat4(0.0f), unknownFloat5(0.0f), unknownFloat6(0.0f), unknownFloat7(0.0f) {};
 
 //Copy Constructor
 RagdollDescriptor::RagdollDescriptor( const RagdollDescriptor & src ) {
@@ -30,6 +30,13 @@ RagdollDescriptor & RagdollDescriptor::operator=( const RagdollDescriptor & src
 	this->twistMinAngle = src.twistMinAngle;
 	this->twistMaxAngle = src.twistMaxAngle;
 	this->maxFriction = src.maxFriction;
+	this->unknownFloat1 = src.unknownFloat1;
+	this->unknownFloat2 = src.unknownFloat2;
+	this->unknownFloat3 = src.unknownFloat3;
+	this->unknownFloat4 = src.unknownFloat4;
+	this->unknownFloat5 = src.unknownFloat5;
+	this->unknownFloat6 = src.unknownFloat6;
+	this->unknownFloat7 = src.unknownFloat7;
 	return *this;
 };
 
diff --git a/src/gen/ShaderTexDesc.cpp b/src/gen/ShaderTexDesc.cpp
index 059eff1b..981f86ff 100644
--- a/src/gen/ShaderTexDesc.cpp
+++ b/src/gen/ShaderTexDesc.cpp
@@ -11,7 +11,7 @@ All rights reserved.  Please see niflib.h for license. */
 using namespace Niflib;
 
 //Constructor
-ShaderTexDesc::ShaderTexDesc() : isUsed(false), unknownInt((unsigned int)0) {};
+ShaderTexDesc::ShaderTexDesc() : isUsed(false), mapIndex((unsigned int)0) {};
 
 //Copy Constructor
 ShaderTexDesc::ShaderTexDesc( const ShaderTexDesc & src ) {
@@ -22,7 +22,7 @@ ShaderTexDesc::ShaderTexDesc( const ShaderTexDesc & src ) {
 ShaderTexDesc & ShaderTexDesc::operator=( const ShaderTexDesc & src ) {
 	this->isUsed = src.isUsed;
 	this->textureData = src.textureData;
-	this->unknownInt = src.unknownInt;
+	this->mapIndex = src.mapIndex;
 	return *this;
 };
 
diff --git a/src/gen/register.cpp b/src/gen/register.cpp
index 727aa878..4aaa9fc2 100644
--- a/src/gen/register.cpp
+++ b/src/gen/register.cpp
@@ -301,6 +301,52 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/obj/NiRoomGroup.h"
 #include "../../include/obj/NiRoom.h"
 #include "../../include/obj/NiPortal.h"
+#include "../../include/obj/BSFadeNode.h"
+#include "../../include/obj/BSShaderLightingProperty.h"
+#include "../../include/obj/BSShaderNoLightingProperty.h"
+#include "../../include/obj/BSShaderPPLightingProperty.h"
+#include "../../include/obj/BSShaderTextureSet.h"
+#include "../../include/obj/BSDismemberSkinInstance.h"
+#include "../../include/obj/BSDecalPlacementVectorExtraData.h"
+#include "../../include/obj/WaterShaderProperty.h"
+#include "../../include/obj/SkyShaderProperty.h"
+#include "../../include/obj/BSPSysSimpleColorModifier.h"
+#include "../../include/obj/BSValueNode.h"
+#include "../../include/obj/BSStripParticleSystem.h"
+#include "../../include/obj/BSStripPSysData.h"
+#include "../../include/obj/BSPSysStripUpdateModifier.h"
+#include "../../include/obj/BSMaterialEmittanceMultController.h"
+#include "../../include/obj/BSMasterParticleSystem.h"
+#include "../../include/obj/BSPSysMultiTargetEmitterCtlr.h"
+#include "../../include/obj/BSRefractionStrengthController.h"
+#include "../../include/obj/BSOrderedNode.h"
+#include "../../include/obj/BSBlastNode.h"
+#include "../../include/obj/BSDamageStage.h"
+#include "../../include/obj/BSShaderProperty.h"
+#include "../../include/obj/TileShaderProperty.h"
+#include "../../include/obj/DistantLODShaderProperty.h"
+#include "../../include/obj/BSDistantTreeShaderProperty.h"
+#include "../../include/obj/TallGrassShaderProperty.h"
+#include "../../include/obj/VolumetricFogShaderProperty.h"
+#include "../../include/obj/HairShaderProperty.h"
+#include "../../include/obj/Lighting30ShaderProperty.h"
+#include "../../include/obj/BSRefractionFirePeriodController.h"
+#include "../../include/obj/bhkConvexListShape.h"
+#include "../../include/obj/BSTreadTransfInterpolator.h"
+#include "../../include/obj/BSAnimNotes.h"
+#include "../../include/obj/bhkLiquidAction.h"
+#include "../../include/obj/BSMultiBoundNode.h"
+#include "../../include/obj/BSMultiBound.h"
+#include "../../include/obj/BSMultiBoundSphere.h"
+#include "../../include/obj/BSSegmentedTriShape.h"
+#include "../../include/obj/BSMultiBoundAABB.h"
+#include "../../include/obj/NiAdditionalGeometryData.h"
+#include "../../include/obj/BSWArray.h"
+#include "../../include/obj/bhkAabbPhantom.h"
+#include "../../include/obj/BSFrustumFOVController.h"
+#include "../../include/obj/BSDebrisNode.h"
+#include "../../include/obj/bhkBreakableConstraint.h"
+#include "../../include/obj/bhkOrientHingedBodyAction.h"
 
 namespace Niflib {
 	void RegisterObjects() {
@@ -600,6 +646,52 @@ namespace Niflib {
 		ObjectRegistry::RegisterObject( "NiRoomGroup", NiRoomGroup::Create );
 		ObjectRegistry::RegisterObject( "NiRoom", NiRoom::Create );
 		ObjectRegistry::RegisterObject( "NiPortal", NiPortal::Create );
+		ObjectRegistry::RegisterObject( "BSFadeNode", BSFadeNode::Create );
+		ObjectRegistry::RegisterObject( "BSShaderLightingProperty", BSShaderLightingProperty::Create );
+		ObjectRegistry::RegisterObject( "BSShaderNoLightingProperty", BSShaderNoLightingProperty::Create );
+		ObjectRegistry::RegisterObject( "BSShaderPPLightingProperty", BSShaderPPLightingProperty::Create );
+		ObjectRegistry::RegisterObject( "BSShaderTextureSet", BSShaderTextureSet::Create );
+		ObjectRegistry::RegisterObject( "BSDismemberSkinInstance", BSDismemberSkinInstance::Create );
+		ObjectRegistry::RegisterObject( "BSDecalPlacementVectorExtraData", BSDecalPlacementVectorExtraData::Create );
+		ObjectRegistry::RegisterObject( "WaterShaderProperty", WaterShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "SkyShaderProperty", SkyShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "BSPSysSimpleColorModifier", BSPSysSimpleColorModifier::Create );
+		ObjectRegistry::RegisterObject( "BSValueNode", BSValueNode::Create );
+		ObjectRegistry::RegisterObject( "BSStripParticleSystem", BSStripParticleSystem::Create );
+		ObjectRegistry::RegisterObject( "BSStripPSysData", BSStripPSysData::Create );
+		ObjectRegistry::RegisterObject( "BSPSysStripUpdateModifier", BSPSysStripUpdateModifier::Create );
+		ObjectRegistry::RegisterObject( "BSMaterialEmittanceMultController", BSMaterialEmittanceMultController::Create );
+		ObjectRegistry::RegisterObject( "BSMasterParticleSystem", BSMasterParticleSystem::Create );
+		ObjectRegistry::RegisterObject( "BSPSysMultiTargetEmitterCtlr", BSPSysMultiTargetEmitterCtlr::Create );
+		ObjectRegistry::RegisterObject( "BSRefractionStrengthController", BSRefractionStrengthController::Create );
+		ObjectRegistry::RegisterObject( "BSOrderedNode", BSOrderedNode::Create );
+		ObjectRegistry::RegisterObject( "BSBlastNode", BSBlastNode::Create );
+		ObjectRegistry::RegisterObject( "BSDamageStage", BSDamageStage::Create );
+		ObjectRegistry::RegisterObject( "BSShaderProperty", BSShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "TileShaderProperty", TileShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "DistantLODShaderProperty", DistantLODShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "BSDistantTreeShaderProperty", BSDistantTreeShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "TallGrassShaderProperty", TallGrassShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "VolumetricFogShaderProperty", VolumetricFogShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "HairShaderProperty", HairShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "Lighting30ShaderProperty", Lighting30ShaderProperty::Create );
+		ObjectRegistry::RegisterObject( "BSRefractionFirePeriodController", BSRefractionFirePeriodController::Create );
+		ObjectRegistry::RegisterObject( "bhkConvexListShape", bhkConvexListShape::Create );
+		ObjectRegistry::RegisterObject( "BSTreadTransfInterpolator", BSTreadTransfInterpolator::Create );
+		ObjectRegistry::RegisterObject( "BSAnimNotes", BSAnimNotes::Create );
+		ObjectRegistry::RegisterObject( "bhkLiquidAction", bhkLiquidAction::Create );
+		ObjectRegistry::RegisterObject( "BSMultiBoundNode", BSMultiBoundNode::Create );
+		ObjectRegistry::RegisterObject( "BSMultiBound", BSMultiBound::Create );
+		ObjectRegistry::RegisterObject( "BSMultiBoundSphere", BSMultiBoundSphere::Create );
+		ObjectRegistry::RegisterObject( "BSSegmentedTriShape", BSSegmentedTriShape::Create );
+		ObjectRegistry::RegisterObject( "BSMultiBoundAABB", BSMultiBoundAABB::Create );
+		ObjectRegistry::RegisterObject( "NiAdditionalGeometryData", NiAdditionalGeometryData::Create );
+		ObjectRegistry::RegisterObject( "BSWArray", BSWArray::Create );
+		ObjectRegistry::RegisterObject( "bhkAabbPhantom", bhkAabbPhantom::Create );
+		ObjectRegistry::RegisterObject( "BSFrustumFOVController", BSFrustumFOVController::Create );
+		ObjectRegistry::RegisterObject( "BSDebrisNode", BSDebrisNode::Create );
+		ObjectRegistry::RegisterObject( "bhkBreakableConstraint", bhkBreakableConstraint::Create );
+		ObjectRegistry::RegisterObject( "bhkOrientHingedBodyAction", bhkOrientHingedBodyAction::Create );
 
 	}
 }
diff --git a/src/niflib.cpp b/src/niflib.cpp
index 3e8a2092..4153ff52 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -1092,6 +1092,7 @@ bool IsSupportedVersion( unsigned int version ) {
 		case VER_20_0_0_4:
 		case VER_20_0_0_5:
 		case VER_20_1_0_3:
+		case VER_20_2_0_7:
 		case VER_20_3_0_3:
 		case VER_20_3_0_6:
 			return true;
diff --git a/src/obj/BSAnimNotes.cpp b/src/obj/BSAnimNotes.cpp
new file mode 100644
index 00000000..cf0697df
--- /dev/null
+++ b/src/obj/BSAnimNotes.cpp
@@ -0,0 +1,105 @@
+/* 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/BSAnimNotes.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSAnimNotes::TYPE("BSAnimNotes", &NiObject::TYPE );
+
+BSAnimNotes::BSAnimNotes() : unknownShort1((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSAnimNotes::~BSAnimNotes() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSAnimNotes::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSAnimNotes::Create() {
+	return new BSAnimNotes;
+}
+
+void BSAnimNotes::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 );
+	NifStream( unknownShort1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSAnimNotes::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 );
+	NifStream( unknownShort1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSAnimNotes::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSAnimNotes::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> BSAnimNotes::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSBlastNode.cpp b/src/obj/BSBlastNode.cpp
new file mode 100644
index 00000000..cccc7271
--- /dev/null
+++ b/src/obj/BSBlastNode.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/BSBlastNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSBlastNode::TYPE("BSBlastNode", &NiNode::TYPE );
+
+BSBlastNode::BSBlastNode() : unknownByte1((byte)0), unknownShort1((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSBlastNode::~BSBlastNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSBlastNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSBlastNode::Create() {
+	return new BSBlastNode;
+}
+
+void BSBlastNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownShort1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSBlastNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownShort1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSBlastNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Unknown byte 1:  " << unknownByte1 << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSBlastNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSBlastNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSDamageStage.cpp b/src/obj/BSDamageStage.cpp
new file mode 100644
index 00000000..03ce914d
--- /dev/null
+++ b/src/obj/BSDamageStage.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/BSDamageStage.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSDamageStage::TYPE("BSDamageStage", &NiNode::TYPE );
+
+BSDamageStage::BSDamageStage() : unknownByte1((byte)0), unknownShort1((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSDamageStage::~BSDamageStage() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSDamageStage::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSDamageStage::Create() {
+	return new BSDamageStage;
+}
+
+void BSDamageStage::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownShort1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDamageStage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownShort1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSDamageStage::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Unknown byte 1:  " << unknownByte1 << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDamageStage::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSDamageStage::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSDebrisNode.cpp b/src/obj/BSDebrisNode.cpp
new file mode 100644
index 00000000..1c493fce
--- /dev/null
+++ b/src/obj/BSDebrisNode.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/BSDebrisNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSDebrisNode::TYPE("BSDebrisNode", &NiNode::TYPE );
+
+BSDebrisNode::BSDebrisNode() : unknownByte1((byte)0), unknownShort1((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSDebrisNode::~BSDebrisNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSDebrisNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSDebrisNode::Create() {
+	return new BSDebrisNode;
+}
+
+void BSDebrisNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownShort1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDebrisNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownShort1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSDebrisNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Unknown byte 1:  " << unknownByte1 << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDebrisNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSDebrisNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSDecalPlacementVectorExtraData.cpp b/src/obj/BSDecalPlacementVectorExtraData.cpp
new file mode 100644
index 00000000..04cd1297
--- /dev/null
+++ b/src/obj/BSDecalPlacementVectorExtraData.cpp
@@ -0,0 +1,166 @@
+/* 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/BSDecalPlacementVectorExtraData.h"
+#include "../../include/gen/DecalVectorArray.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSDecalPlacementVectorExtraData::TYPE("BSDecalPlacementVectorExtraData", &NiExtraData::TYPE );
+
+BSDecalPlacementVectorExtraData::BSDecalPlacementVectorExtraData() : unknownFloat1(0.0f), numVectorBlocks((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSDecalPlacementVectorExtraData::~BSDecalPlacementVectorExtraData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSDecalPlacementVectorExtraData::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSDecalPlacementVectorExtraData::Create() {
+	return new BSDecalPlacementVectorExtraData;
+}
+
+void BSDecalPlacementVectorExtraData::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( unknownFloat1, in, info );
+	NifStream( numVectorBlocks, in, info );
+	vectorBlocks.resize(numVectorBlocks);
+	for (unsigned int i1 = 0; i1 < vectorBlocks.size(); i1++) {
+		NifStream( vectorBlocks[i1].numVectors, in, info );
+		vectorBlocks[i1].points.resize(vectorBlocks[i1].numVectors);
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].points.size(); i2++) {
+			NifStream( vectorBlocks[i1].points[i2], in, info );
+		};
+		vectorBlocks[i1].normals.resize(vectorBlocks[i1].numVectors);
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].normals.size(); i2++) {
+			NifStream( vectorBlocks[i1].normals[i2], in, info );
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDecalPlacementVectorExtraData::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 );
+	numVectorBlocks = (short)(vectorBlocks.size());
+	NifStream( unknownFloat1, out, info );
+	NifStream( numVectorBlocks, out, info );
+	for (unsigned int i1 = 0; i1 < vectorBlocks.size(); i1++) {
+		vectorBlocks[i1].numVectors = (short)(vectorBlocks[i1].points.size());
+		NifStream( vectorBlocks[i1].numVectors, out, info );
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].points.size(); i2++) {
+			NifStream( vectorBlocks[i1].points[i2], out, info );
+		};
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].normals.size(); i2++) {
+			NifStream( vectorBlocks[i1].normals[i2], out, info );
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSDecalPlacementVectorExtraData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	numVectorBlocks = (short)(vectorBlocks.size());
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Num Vector Blocks:  " << numVectorBlocks << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < vectorBlocks.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		vectorBlocks[i1].numVectors = (short)(vectorBlocks[i1].points.size());
+		out << "    Num Vectors:  " << vectorBlocks[i1].numVectors << endl;
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].points.size(); 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 << "      Points[" << i2 << "]:  " << vectorBlocks[i1].points[i2] << endl;
+			array_output_count++;
+		};
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < vectorBlocks[i1].normals.size(); 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 << "      Normals[" << i2 << "]:  " << vectorBlocks[i1].normals[i2] << endl;
+			array_output_count++;
+		};
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDecalPlacementVectorExtraData::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> BSDecalPlacementVectorExtraData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSDismemberSkinInstance.cpp b/src/obj/BSDismemberSkinInstance.cpp
new file mode 100644
index 00000000..e1db1abd
--- /dev/null
+++ b/src/obj/BSDismemberSkinInstance.cpp
@@ -0,0 +1,126 @@
+/* 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/BSDismemberSkinInstance.h"
+#include "../../include/gen/BodyPartList.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSDismemberSkinInstance::TYPE("BSDismemberSkinInstance", &NiSkinInstance::TYPE );
+
+BSDismemberSkinInstance::BSDismemberSkinInstance() : numPartitions((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSDismemberSkinInstance::~BSDismemberSkinInstance() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSDismemberSkinInstance::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSDismemberSkinInstance::Create() {
+	return new BSDismemberSkinInstance;
+}
+
+void BSDismemberSkinInstance::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiSkinInstance::Read( in, link_stack, info );
+	NifStream( numPartitions, in, info );
+	partitions.resize(numPartitions);
+	for (unsigned int i1 = 0; i1 < partitions.size(); i1++) {
+		NifStream( partitions[i1].unknownShort, in, info );
+		NifStream( partitions[i1].bodyPart, in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDismemberSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiSkinInstance::Write( out, link_map, info );
+	numPartitions = (int)(partitions.size());
+	NifStream( numPartitions, out, info );
+	for (unsigned int i1 = 0; i1 < partitions.size(); i1++) {
+		NifStream( partitions[i1].unknownShort, out, info );
+		NifStream( partitions[i1].bodyPart, out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSDismemberSkinInstance::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiSkinInstance::asString();
+	numPartitions = (int)(partitions.size());
+	out << "  Num Partitions:  " << numPartitions << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < partitions.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Unknown Short:  " << partitions[i1].unknownShort << endl;
+		out << "    Body Part:  " << partitions[i1].bodyPart << endl;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDismemberSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiSkinInstance::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSDismemberSkinInstance::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiSkinInstance::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSDistantTreeShaderProperty.cpp b/src/obj/BSDistantTreeShaderProperty.cpp
new file mode 100644
index 00000000..53390547
--- /dev/null
+++ b/src/obj/BSDistantTreeShaderProperty.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/BSDistantTreeShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSDistantTreeShaderProperty::TYPE("BSDistantTreeShaderProperty", &NiShadeProperty::TYPE );
+
+BSDistantTreeShaderProperty::BSDistantTreeShaderProperty() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSDistantTreeShaderProperty::~BSDistantTreeShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSDistantTreeShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSDistantTreeShaderProperty::Create() {
+	return new BSDistantTreeShaderProperty;
+}
+
+void BSDistantTreeShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDistantTreeShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSDistantTreeShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSDistantTreeShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSDistantTreeShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSFadeNode.cpp b/src/obj/BSFadeNode.cpp
new file mode 100644
index 00000000..b4bc8cd3
--- /dev/null
+++ b/src/obj/BSFadeNode.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/BSFadeNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSFadeNode::TYPE("BSFadeNode", &NiNode::TYPE );
+
+BSFadeNode::BSFadeNode() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSFadeNode::~BSFadeNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSFadeNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSFadeNode::Create() {
+	return new BSFadeNode;
+}
+
+void BSFadeNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSFadeNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSFadeNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSFadeNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSFadeNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSFrustumFOVController.cpp b/src/obj/BSFrustumFOVController.cpp
new file mode 100644
index 00000000..2375fa37
--- /dev/null
+++ b/src/obj/BSFrustumFOVController.cpp
@@ -0,0 +1,105 @@
+/* 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/BSFrustumFOVController.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSFrustumFOVController::TYPE("BSFrustumFOVController", &NiTimeController::TYPE );
+
+BSFrustumFOVController::BSFrustumFOVController() : unknownInt1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSFrustumFOVController::~BSFrustumFOVController() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSFrustumFOVController::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSFrustumFOVController::Create() {
+	return new BSFrustumFOVController;
+}
+
+void BSFrustumFOVController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSFrustumFOVController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSFrustumFOVController::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiTimeController::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSFrustumFOVController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSFrustumFOVController::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiTimeController::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMasterParticleSystem.cpp b/src/obj/BSMasterParticleSystem.cpp
new file mode 100644
index 00000000..a3781d9f
--- /dev/null
+++ b/src/obj/BSMasterParticleSystem.cpp
@@ -0,0 +1,147 @@
+/* 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/BSMasterParticleSystem.h"
+#include "../../include/obj/NiAVObject.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMasterParticleSystem::TYPE("BSMasterParticleSystem", &NiNode::TYPE );
+
+BSMasterParticleSystem::BSMasterParticleSystem() : maxEmitterObjects((unsigned short)0), numParticleSystems((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMasterParticleSystem::~BSMasterParticleSystem() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMasterParticleSystem::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMasterParticleSystem::Create() {
+	return new BSMasterParticleSystem;
+}
+
+void BSMasterParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	unsigned int block_num;
+	NiNode::Read( in, link_stack, info );
+	NifStream( maxEmitterObjects, in, info );
+	NifStream( numParticleSystems, in, info );
+	particleSystems.resize(numParticleSystems);
+	for (unsigned int i1 = 0; i1 < particleSystems.size(); i1++) {
+		NifStream( block_num, in, info );
+		link_stack.push_back( block_num );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMasterParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	numParticleSystems = (int)(particleSystems.size());
+	NifStream( maxEmitterObjects, out, info );
+	NifStream( numParticleSystems, out, info );
+	for (unsigned int i1 = 0; i1 < particleSystems.size(); i1++) {
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*particleSystems[i1]), out, info );
+		} else {
+			if ( particleSystems[i1] != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(particleSystems[i1]) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMasterParticleSystem::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	numParticleSystems = (int)(particleSystems.size());
+	out << "  Max Emitter Objects:  " << maxEmitterObjects << endl;
+	out << "  Num Particle Systems:  " << numParticleSystems << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < particleSystems.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 << "    Particle Systems[" << i1 << "]:  " << particleSystems[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMasterParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+	for (unsigned int i1 = 0; i1 < particleSystems.size(); i1++) {
+		particleSystems[i1] = FixLink<NiAVObject>( objects, link_stack, info );
+	};
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSMasterParticleSystem::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	for (unsigned int i1 = 0; i1 < particleSystems.size(); i1++) {
+		if ( particleSystems[i1] != NULL )
+			refs.push_back(StaticCast<NiObject>(particleSystems[i1]));
+	};
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMaterialEmittanceMultController.cpp b/src/obj/BSMaterialEmittanceMultController.cpp
new file mode 100644
index 00000000..5c733eb2
--- /dev/null
+++ b/src/obj/BSMaterialEmittanceMultController.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/BSMaterialEmittanceMultController.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMaterialEmittanceMultController::TYPE("BSMaterialEmittanceMultController", &NiFloatInterpController::TYPE );
+
+BSMaterialEmittanceMultController::BSMaterialEmittanceMultController() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMaterialEmittanceMultController::~BSMaterialEmittanceMultController() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMaterialEmittanceMultController::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMaterialEmittanceMultController::Create() {
+	return new BSMaterialEmittanceMultController;
+}
+
+void BSMaterialEmittanceMultController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMaterialEmittanceMultController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMaterialEmittanceMultController::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiFloatInterpController::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMaterialEmittanceMultController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSMaterialEmittanceMultController::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiFloatInterpController::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMultiBound.cpp b/src/obj/BSMultiBound.cpp
new file mode 100644
index 00000000..5adfe0f6
--- /dev/null
+++ b/src/obj/BSMultiBound.cpp
@@ -0,0 +1,105 @@
+/* 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/BSMultiBound.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMultiBound::TYPE("BSMultiBound", &NiObject::TYPE );
+
+BSMultiBound::BSMultiBound() : unknownInt1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMultiBound::~BSMultiBound() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMultiBound::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMultiBound::Create() {
+	return new BSMultiBound;
+}
+
+void BSMultiBound::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 );
+	NifStream( unknownInt1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBound::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 );
+	NifStream( unknownInt1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMultiBound::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBound::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> BSMultiBound::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMultiBoundAABB.cpp b/src/obj/BSMultiBoundAABB.cpp
new file mode 100644
index 00000000..043cea04
--- /dev/null
+++ b/src/obj/BSMultiBoundAABB.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/BSMultiBoundAABB.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMultiBoundAABB::TYPE("BSMultiBoundAABB", &NiObject::TYPE );
+
+BSMultiBoundAABB::BSMultiBoundAABB() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMultiBoundAABB::~BSMultiBoundAABB() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMultiBoundAABB::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMultiBoundAABB::Create() {
+	return new BSMultiBoundAABB;
+}
+
+void BSMultiBoundAABB::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 );
+	for (unsigned int i1 = 0; i1 < 6; i1++) {
+		NifStream( unknownFloats1[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundAABB::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 );
+	for (unsigned int i1 = 0; i1 < 6; i1++) {
+		NifStream( unknownFloats1[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMultiBoundAABB::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 < 6; 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 1[" << i1 << "]:  " << unknownFloats1[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundAABB::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> BSMultiBoundAABB::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMultiBoundNode.cpp b/src/obj/BSMultiBoundNode.cpp
new file mode 100644
index 00000000..51e88d73
--- /dev/null
+++ b/src/obj/BSMultiBoundNode.cpp
@@ -0,0 +1,105 @@
+/* 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/BSMultiBoundNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMultiBoundNode::TYPE("BSMultiBoundNode", &NiNode::TYPE );
+
+BSMultiBoundNode::BSMultiBoundNode() : unknownInt1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMultiBoundNode::~BSMultiBoundNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMultiBoundNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMultiBoundNode::Create() {
+	return new BSMultiBoundNode;
+}
+
+void BSMultiBoundNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMultiBoundNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSMultiBoundNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSMultiBoundSphere.cpp b/src/obj/BSMultiBoundSphere.cpp
new file mode 100644
index 00000000..0016636c
--- /dev/null
+++ b/src/obj/BSMultiBoundSphere.cpp
@@ -0,0 +1,114 @@
+/* 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/BSMultiBoundSphere.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSMultiBoundSphere::TYPE("BSMultiBoundSphere", &NiObject::TYPE );
+
+BSMultiBoundSphere::BSMultiBoundSphere() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), radius(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSMultiBoundSphere::~BSMultiBoundSphere() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSMultiBoundSphere::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSMultiBoundSphere::Create() {
+	return new BSMultiBoundSphere;
+}
+
+void BSMultiBoundSphere::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 );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( radius, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundSphere::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 );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( radius, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSMultiBoundSphere::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Radius:  " << radius << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSMultiBoundSphere::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> BSMultiBoundSphere::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSOrderedNode.cpp b/src/obj/BSOrderedNode.cpp
new file mode 100644
index 00000000..cc7ff015
--- /dev/null
+++ b/src/obj/BSOrderedNode.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/BSOrderedNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSOrderedNode::TYPE("BSOrderedNode", &NiNode::TYPE );
+
+BSOrderedNode::BSOrderedNode() : isStaticBound((byte)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSOrderedNode::~BSOrderedNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSOrderedNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSOrderedNode::Create() {
+	return new BSOrderedNode;
+}
+
+void BSOrderedNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( alphaSortBound, in, info );
+	NifStream( isStaticBound, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSOrderedNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( alphaSortBound, out, info );
+	NifStream( isStaticBound, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSOrderedNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Alpha Sort Bound:  " << alphaSortBound << endl;
+	out << "  Is Static Bound:  " << isStaticBound << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSOrderedNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSOrderedNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSPSysMultiTargetEmitterCtlr.cpp b/src/obj/BSPSysMultiTargetEmitterCtlr.cpp
new file mode 100644
index 00000000..40960ca5
--- /dev/null
+++ b/src/obj/BSPSysMultiTargetEmitterCtlr.cpp
@@ -0,0 +1,153 @@
+/* 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/BSPSysMultiTargetEmitterCtlr.h"
+#include "../../include/obj/NiPSysEmitterCtlrData.h"
+#include "../../include/obj/NiInterpolator.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSPSysMultiTargetEmitterCtlr::TYPE("BSPSysMultiTargetEmitterCtlr", &NiPSysModifierCtlr::TYPE );
+
+BSPSysMultiTargetEmitterCtlr::BSPSysMultiTargetEmitterCtlr() : data(NULL), visibilityInterpolator(NULL), unknownShort1((short)0), unknownInt1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSPSysMultiTargetEmitterCtlr::~BSPSysMultiTargetEmitterCtlr() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSPSysMultiTargetEmitterCtlr::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSPSysMultiTargetEmitterCtlr::Create() {
+	return new BSPSysMultiTargetEmitterCtlr;
+}
+
+void BSPSysMultiTargetEmitterCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	unsigned int block_num;
+	NiPSysModifierCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
+		link_stack.push_back( block_num );
+	};
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
+		link_stack.push_back( block_num );
+	};
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownInt1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysMultiTargetEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifierCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*data), out, info );
+		} else {
+			if ( data != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
+	};
+	if ( info.version >= 0x0A020000 ) {
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*visibilityInterpolator), out, info );
+		} else {
+			if ( visibilityInterpolator != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
+	};
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownInt1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSPSysMultiTargetEmitterCtlr::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiPSysModifierCtlr::asString();
+	out << "  Data:  " << data << endl;
+	out << "  Visibility Interpolator:  " << visibilityInterpolator << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysMultiTargetEmitterCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifierCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, info );
+	};
+	if ( info.version >= 0x0A020000 ) {
+		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, info );
+	};
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSPSysMultiTargetEmitterCtlr::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiPSysModifierCtlr::GetRefs();
+	if ( data != NULL )
+		refs.push_back(StaticCast<NiObject>(data));
+	if ( visibilityInterpolator != NULL )
+		refs.push_back(StaticCast<NiObject>(visibilityInterpolator));
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSPSysSimpleColorModifier.cpp b/src/obj/BSPSysSimpleColorModifier.cpp
new file mode 100644
index 00000000..02c2f593
--- /dev/null
+++ b/src/obj/BSPSysSimpleColorModifier.cpp
@@ -0,0 +1,138 @@
+/* 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/BSPSysSimpleColorModifier.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSPSysSimpleColorModifier::TYPE("BSPSysSimpleColorModifier", &NiPSysModifier::TYPE );
+
+BSPSysSimpleColorModifier::BSPSysSimpleColorModifier() : fadeInPercent(0.0f), fadeOutPercent(0.0f), color1EndPercent((int)0), color1StartPercent((int)0), color2EndPercent((int)0), color2StartPercent((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSPSysSimpleColorModifier::~BSPSysSimpleColorModifier() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSPSysSimpleColorModifier::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSPSysSimpleColorModifier::Create() {
+	return new BSPSysSimpleColorModifier;
+}
+
+void BSPSysSimpleColorModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( fadeInPercent, in, info );
+	NifStream( fadeOutPercent, in, info );
+	NifStream( color1EndPercent, in, info );
+	NifStream( color1StartPercent, in, info );
+	NifStream( color2EndPercent, in, info );
+	NifStream( color2StartPercent, in, info );
+	for (unsigned int i1 = 0; i1 < 3; i1++) {
+		NifStream( colors[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysSimpleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( fadeInPercent, out, info );
+	NifStream( fadeOutPercent, out, info );
+	NifStream( color1EndPercent, out, info );
+	NifStream( color1StartPercent, out, info );
+	NifStream( color2EndPercent, out, info );
+	NifStream( color2StartPercent, out, info );
+	for (unsigned int i1 = 0; i1 < 3; i1++) {
+		NifStream( colors[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSPSysSimpleColorModifier::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiPSysModifier::asString();
+	out << "  Fade In Percent:  " << fadeInPercent << endl;
+	out << "  Fade out Percent:  " << fadeOutPercent << endl;
+	out << "  Color 1 End Percent:  " << color1EndPercent << endl;
+	out << "  Color 1 Start Percent:  " << color1StartPercent << endl;
+	out << "  Color 2 End Percent:  " << color2EndPercent << endl;
+	out << "  Color 2 Start Percent:  " << color2StartPercent << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 3; 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 << "    Colors[" << i1 << "]:  " << colors[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysSimpleColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSPSysSimpleColorModifier::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiPSysModifier::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSPSysStripUpdateModifier.cpp b/src/obj/BSPSysStripUpdateModifier.cpp
new file mode 100644
index 00000000..cddbd480
--- /dev/null
+++ b/src/obj/BSPSysStripUpdateModifier.cpp
@@ -0,0 +1,105 @@
+/* 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/BSPSysStripUpdateModifier.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSPSysStripUpdateModifier::TYPE("BSPSysStripUpdateModifier", &NiPSysModifier::TYPE );
+
+BSPSysStripUpdateModifier::BSPSysStripUpdateModifier() : updateDeltaTime(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSPSysStripUpdateModifier::~BSPSysStripUpdateModifier() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSPSysStripUpdateModifier::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSPSysStripUpdateModifier::Create() {
+	return new BSPSysStripUpdateModifier;
+}
+
+void BSPSysStripUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( updateDeltaTime, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysStripUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( updateDeltaTime, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSPSysStripUpdateModifier::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiPSysModifier::asString();
+	out << "  Update Delta Time:  " << updateDeltaTime << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSPSysStripUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSPSysStripUpdateModifier::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiPSysModifier::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSRefractionFirePeriodController.cpp b/src/obj/BSRefractionFirePeriodController.cpp
new file mode 100644
index 00000000..4320044e
--- /dev/null
+++ b/src/obj/BSRefractionFirePeriodController.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/BSRefractionFirePeriodController.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSRefractionFirePeriodController::TYPE("BSRefractionFirePeriodController", &NiTimeController::TYPE );
+
+BSRefractionFirePeriodController::BSRefractionFirePeriodController() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSRefractionFirePeriodController::~BSRefractionFirePeriodController() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSRefractionFirePeriodController::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSRefractionFirePeriodController::Create() {
+	return new BSRefractionFirePeriodController;
+}
+
+void BSRefractionFirePeriodController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSRefractionFirePeriodController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSRefractionFirePeriodController::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiTimeController::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSRefractionFirePeriodController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTimeController::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSRefractionFirePeriodController::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiTimeController::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSRefractionStrengthController.cpp b/src/obj/BSRefractionStrengthController.cpp
new file mode 100644
index 00000000..3c4d5d40
--- /dev/null
+++ b/src/obj/BSRefractionStrengthController.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/BSRefractionStrengthController.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSRefractionStrengthController::TYPE("BSRefractionStrengthController", &NiFloatInterpController::TYPE );
+
+BSRefractionStrengthController::BSRefractionStrengthController() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSRefractionStrengthController::~BSRefractionStrengthController() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSRefractionStrengthController::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSRefractionStrengthController::Create() {
+	return new BSRefractionStrengthController;
+}
+
+void BSRefractionStrengthController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSRefractionStrengthController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSRefractionStrengthController::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiFloatInterpController::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSRefractionStrengthController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiFloatInterpController::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSRefractionStrengthController::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiFloatInterpController::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSSegmentedTriShape.cpp b/src/obj/BSSegmentedTriShape.cpp
new file mode 100644
index 00000000..c0d21fab
--- /dev/null
+++ b/src/obj/BSSegmentedTriShape.cpp
@@ -0,0 +1,129 @@
+/* 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/BSSegmentedTriShape.h"
+#include "../../include/gen/BSSegmentedTriangle.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSSegmentedTriShape::TYPE("BSSegmentedTriShape", &NiTriShape::TYPE );
+
+BSSegmentedTriShape::BSSegmentedTriShape() : numSegTriangles((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSSegmentedTriShape::~BSSegmentedTriShape() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSSegmentedTriShape::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSSegmentedTriShape::Create() {
+	return new BSSegmentedTriShape;
+}
+
+void BSSegmentedTriShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriShape::Read( in, link_stack, info );
+	NifStream( numSegTriangles, in, info );
+	segTriangles.resize(numSegTriangles);
+	for (unsigned int i1 = 0; i1 < segTriangles.size(); i1++) {
+		NifStream( segTriangles[i1].unknownInt1, in, info );
+		NifStream( segTriangles[i1].unknownInt2, in, info );
+		NifStream( segTriangles[i1].unknownByte1, in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSSegmentedTriShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriShape::Write( out, link_map, info );
+	numSegTriangles = (int)(segTriangles.size());
+	NifStream( numSegTriangles, out, info );
+	for (unsigned int i1 = 0; i1 < segTriangles.size(); i1++) {
+		NifStream( segTriangles[i1].unknownInt1, out, info );
+		NifStream( segTriangles[i1].unknownInt2, out, info );
+		NifStream( segTriangles[i1].unknownByte1, out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSSegmentedTriShape::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiTriShape::asString();
+	numSegTriangles = (int)(segTriangles.size());
+	out << "  Num Seg Triangles:  " << numSegTriangles << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < segTriangles.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Unknown Int 1:  " << segTriangles[i1].unknownInt1 << endl;
+		out << "    Unknown Int 2:  " << segTriangles[i1].unknownInt2 << endl;
+		out << "    Unknown Byte 1:  " << segTriangles[i1].unknownByte1 << endl;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSSegmentedTriShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiTriShape::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSSegmentedTriShape::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiTriShape::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSShaderLightingProperty.cpp b/src/obj/BSShaderLightingProperty.cpp
new file mode 100644
index 00000000..78eb0ef3
--- /dev/null
+++ b/src/obj/BSShaderLightingProperty.cpp
@@ -0,0 +1,135 @@
+/* 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/BSShaderLightingProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSShaderLightingProperty::TYPE("BSShaderLightingProperty", &NiProperty::TYPE );
+
+BSShaderLightingProperty::BSShaderLightingProperty() : flags((unsigned short)0), unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownFloat1(0.0f), unknownInt5((int)0), unknownInt6((int)0), unknownInt7((int)0), unknownInt8((int)0), unknownFloat2(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSShaderLightingProperty::~BSShaderLightingProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSShaderLightingProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSShaderLightingProperty::Create() {
+	return new BSShaderLightingProperty;
+}
+
+void BSShaderLightingProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt5, in, info );
+	NifStream( fileName, in, info );
+	NifStream( unknownInt6, in, info );
+	NifStream( unknownInt7, in, info );
+	NifStream( unknownInt8, in, info );
+	NifStream( unknownFloat2, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderLightingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt5, out, info );
+	NifStream( fileName, out, info );
+	NifStream( unknownInt6, out, info );
+	NifStream( unknownInt7, out, info );
+	NifStream( unknownInt8, out, info );
+	NifStream( unknownFloat2, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSShaderLightingProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiProperty::asString();
+	out << "  Flags:  " << flags << endl;
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	out << "  File Name:  " << fileName << endl;
+	out << "  Unknown Int 6:  " << unknownInt6 << endl;
+	out << "  Unknown Int 7:  " << unknownInt7 << endl;
+	out << "  Unknown Int 8:  " << unknownInt8 << endl;
+	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderLightingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSShaderLightingProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSShaderNoLightingProperty.cpp b/src/obj/BSShaderNoLightingProperty.cpp
new file mode 100644
index 00000000..bbda3709
--- /dev/null
+++ b/src/obj/BSShaderNoLightingProperty.cpp
@@ -0,0 +1,139 @@
+/* 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/BSShaderNoLightingProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSShaderNoLightingProperty::TYPE("BSShaderNoLightingProperty", &NiProperty::TYPE );
+
+BSShaderNoLightingProperty::BSShaderNoLightingProperty() : flags((unsigned short)0), unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownFloat1(0.0f), unknownInt5((int)0), unknownInt6((int)0), unknownInt7((int)0), unknownInt8((int)0), unknownFloat2(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSShaderNoLightingProperty::~BSShaderNoLightingProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSShaderNoLightingProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSShaderNoLightingProperty::Create() {
+	return new BSShaderNoLightingProperty;
+}
+
+void BSShaderNoLightingProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt5, in, info );
+	NifStream( fileName, in, info );
+	if ( ((info.userVersion == 11) && (info.userVersion2 > 26)) ) {
+		NifStream( unknownInt6, in, info );
+		NifStream( unknownInt7, in, info );
+		NifStream( unknownInt8, in, info );
+		NifStream( unknownFloat2, in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderNoLightingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt5, out, info );
+	NifStream( fileName, out, info );
+	if ( ((info.userVersion == 11) && (info.userVersion2 > 26)) ) {
+		NifStream( unknownInt6, out, info );
+		NifStream( unknownInt7, out, info );
+		NifStream( unknownInt8, out, info );
+		NifStream( unknownFloat2, out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSShaderNoLightingProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiProperty::asString();
+	out << "  Flags:  " << flags << endl;
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	out << "  File Name:  " << fileName << endl;
+	out << "  Unknown Int 6:  " << unknownInt6 << endl;
+	out << "  Unknown Int 7:  " << unknownInt7 << endl;
+	out << "  Unknown Int 8:  " << unknownInt8 << endl;
+	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderNoLightingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSShaderNoLightingProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSShaderPPLightingProperty.cpp b/src/obj/BSShaderPPLightingProperty.cpp
new file mode 100644
index 00000000..a6d3718c
--- /dev/null
+++ b/src/obj/BSShaderPPLightingProperty.cpp
@@ -0,0 +1,150 @@
+/* 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/BSShaderPPLightingProperty.h"
+#include "../../include/obj/BSShaderTextureSet.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSShaderPPLightingProperty::TYPE("BSShaderPPLightingProperty", &NiShadeProperty::TYPE );
+
+BSShaderPPLightingProperty::BSShaderPPLightingProperty() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownInt4((int)0), unknownInt5((int)0), textureSet(NULL), unknownInt6((int)0), unknownInt7((int)0), unknownInt8((int)0), unknownInt9((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSShaderPPLightingProperty::~BSShaderPPLightingProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSShaderPPLightingProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSShaderPPLightingProperty::Create() {
+	return new BSShaderPPLightingProperty;
+}
+
+void BSShaderPPLightingProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	unsigned int block_num;
+	NiShadeProperty::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownInt4, in, info );
+	NifStream( unknownInt5, in, info );
+	NifStream( block_num, in, info );
+	link_stack.push_back( block_num );
+	if ( ((info.userVersion == 11) && (info.userVersion2 > 14)) ) {
+		NifStream( unknownInt6, in, info );
+		NifStream( unknownInt7, in, info );
+		NifStream( unknownInt8, in, info );
+		NifStream( unknownInt9, in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderPPLightingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownInt4, out, info );
+	NifStream( unknownInt5, out, info );
+	if ( info.version < VER_3_3_0_13 ) {
+		NifStream( (unsigned int)&(*textureSet), out, info );
+	} else {
+		if ( textureSet != NULL ) {
+			NifStream( link_map.find( StaticCast<NiObject>(textureSet) )->second, out, info );
+		} else {
+			NifStream( 0xFFFFFFFF, out, info );
+		}
+	}
+	if ( ((info.userVersion == 11) && (info.userVersion2 > 14)) ) {
+		NifStream( unknownInt6, out, info );
+		NifStream( unknownInt7, out, info );
+		NifStream( unknownInt8, out, info );
+		NifStream( unknownInt9, out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSShaderPPLightingProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Int 4:  " << unknownInt4 << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	out << "  Texture Set:  " << textureSet << endl;
+	out << "  Unknown Int 6:  " << unknownInt6 << endl;
+	out << "  Unknown Int 7:  " << unknownInt7 << endl;
+	out << "  Unknown Int 8:  " << unknownInt8 << endl;
+	out << "  Unknown Int 9:  " << unknownInt9 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderPPLightingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+	textureSet = FixLink<BSShaderTextureSet>( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSShaderPPLightingProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	if ( textureSet != NULL )
+		refs.push_back(StaticCast<NiObject>(textureSet));
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSShaderProperty.cpp b/src/obj/BSShaderProperty.cpp
new file mode 100644
index 00000000..6641c44e
--- /dev/null
+++ b/src/obj/BSShaderProperty.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/BSShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSShaderProperty::TYPE("BSShaderProperty", &NiProperty::TYPE );
+
+BSShaderProperty::BSShaderProperty() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSShaderProperty::~BSShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSShaderProperty::Create() {
+	return new BSShaderProperty;
+}
+
+void BSShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiProperty::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSShaderTextureSet.cpp b/src/obj/BSShaderTextureSet.cpp
new file mode 100644
index 00000000..d25c77c5
--- /dev/null
+++ b/src/obj/BSShaderTextureSet.cpp
@@ -0,0 +1,126 @@
+/* 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/BSShaderTextureSet.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSShaderTextureSet::TYPE("BSShaderTextureSet", &NiObject::TYPE );
+
+BSShaderTextureSet::BSShaderTextureSet() : numTextures((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSShaderTextureSet::~BSShaderTextureSet() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSShaderTextureSet::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSShaderTextureSet::Create() {
+	return new BSShaderTextureSet;
+}
+
+void BSShaderTextureSet::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 );
+	NifStream( numTextures, in, info );
+	textures.resize(numTextures);
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		NifStream( textures[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderTextureSet::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 );
+	numTextures = (int)(textures.size());
+	NifStream( numTextures, out, info );
+	for (unsigned int i1 = 0; i1 < textures.size(); i1++) {
+		NifStream( textures[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSShaderTextureSet::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	numTextures = (int)(textures.size());
+	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;
+		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
+		out << "    Textures[" << i1 << "]:  " << textures[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSShaderTextureSet::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> BSShaderTextureSet::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSStripPSysData.cpp b/src/obj/BSStripPSysData.cpp
new file mode 100644
index 00000000..21605dab
--- /dev/null
+++ b/src/obj/BSStripPSysData.cpp
@@ -0,0 +1,114 @@
+/* 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/BSStripPSysData.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSStripPSysData::TYPE("BSStripPSysData", &NiPSysData::TYPE );
+
+BSStripPSysData::BSStripPSysData() : unknownShort1((short)0), unknownByte1((byte)0), unknownInt2((int)0), unknownInt3((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSStripPSysData::~BSStripPSysData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSStripPSysData::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSStripPSysData::Create() {
+	return new BSStripPSysData;
+}
+
+void BSStripPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysData::Read( in, link_stack, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSStripPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysData::Write( out, link_map, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSStripPSysData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiPSysData::asString();
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	out << "  Unknown byte 1:  " << unknownByte1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSStripPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiPSysData::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSStripPSysData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiPSysData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSStripParticleSystem.cpp b/src/obj/BSStripParticleSystem.cpp
new file mode 100644
index 00000000..bd3c2fa9
--- /dev/null
+++ b/src/obj/BSStripParticleSystem.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/BSStripParticleSystem.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSStripParticleSystem::TYPE("BSStripParticleSystem", &NiParticleSystem::TYPE );
+
+BSStripParticleSystem::BSStripParticleSystem() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSStripParticleSystem::~BSStripParticleSystem() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSStripParticleSystem::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSStripParticleSystem::Create() {
+	return new BSStripParticleSystem;
+}
+
+void BSStripParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiParticleSystem::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSStripParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiParticleSystem::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSStripParticleSystem::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiParticleSystem::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSStripParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiParticleSystem::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSStripParticleSystem::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiParticleSystem::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSTreadTransfInterpolator.cpp b/src/obj/BSTreadTransfInterpolator.cpp
new file mode 100644
index 00000000..0a8ba6be
--- /dev/null
+++ b/src/obj/BSTreadTransfInterpolator.cpp
@@ -0,0 +1,162 @@
+/* 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/BSTreadTransfInterpolator.h"
+#include "../../include/gen/BSTreadTransfInfo.h"
+#include "../../include/gen/BSTreadTransfSubInfo.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSTreadTransfInterpolator::TYPE("BSTreadTransfInterpolator", &NiInterpolator::TYPE );
+
+BSTreadTransfInterpolator::BSTreadTransfInterpolator() : numTransfers((int)0), unknownInt1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSTreadTransfInterpolator::~BSTreadTransfInterpolator() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSTreadTransfInterpolator::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSTreadTransfInterpolator::Create() {
+	return new BSTreadTransfInterpolator;
+}
+
+void BSTreadTransfInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( numTransfers, in, info );
+	treadTransferInfo.resize(numTransfers);
+	for (unsigned int i1 = 0; i1 < treadTransferInfo.size(); i1++) {
+		NifStream( treadTransferInfo[i1].unknownFloat1, in, info );
+		for (unsigned int i2 = 0; i2 < 2; i2++) {
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt1, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt2, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt3, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt4, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt5, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt6, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt7, in, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt8, in, info );
+		};
+	};
+	NifStream( unknownInt1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSTreadTransfInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiInterpolator::Write( out, link_map, info );
+	numTransfers = (int)(treadTransferInfo.size());
+	NifStream( numTransfers, out, info );
+	for (unsigned int i1 = 0; i1 < treadTransferInfo.size(); i1++) {
+		NifStream( treadTransferInfo[i1].unknownFloat1, out, info );
+		for (unsigned int i2 = 0; i2 < 2; i2++) {
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt1, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt2, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt3, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt4, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt5, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt6, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt7, out, info );
+			NifStream( treadTransferInfo[i1].data[i2].unknownInt8, out, info );
+		};
+	};
+	NifStream( unknownInt1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSTreadTransfInterpolator::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiInterpolator::asString();
+	numTransfers = (int)(treadTransferInfo.size());
+	out << "  Num Transfers:  " << numTransfers << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < treadTransferInfo.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Unknown Float 1:  " << treadTransferInfo[i1].unknownFloat1 << endl;
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < 2; i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
+			out << "      Unknown Int 1:  " << treadTransferInfo[i1].data[i2].unknownInt1 << endl;
+			out << "      Unknown Int 2:  " << treadTransferInfo[i1].data[i2].unknownInt2 << endl;
+			out << "      Unknown Int 3:  " << treadTransferInfo[i1].data[i2].unknownInt3 << endl;
+			out << "      Unknown Int 4:  " << treadTransferInfo[i1].data[i2].unknownInt4 << endl;
+			out << "      Unknown Int 5:  " << treadTransferInfo[i1].data[i2].unknownInt5 << endl;
+			out << "      Unknown Int 6:  " << treadTransferInfo[i1].data[i2].unknownInt6 << endl;
+			out << "      Unknown Int 7:  " << treadTransferInfo[i1].data[i2].unknownInt7 << endl;
+			out << "      Unknown Int 8:  " << treadTransferInfo[i1].data[i2].unknownInt8 << endl;
+		};
+	};
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSTreadTransfInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiInterpolator::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSTreadTransfInterpolator::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiInterpolator::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSValueNode.cpp b/src/obj/BSValueNode.cpp
new file mode 100644
index 00000000..3433524e
--- /dev/null
+++ b/src/obj/BSValueNode.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/BSValueNode.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSValueNode::TYPE("BSValueNode", &NiNode::TYPE );
+
+BSValueNode::BSValueNode() : value((int)0), unknownByte((byte)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSValueNode::~BSValueNode() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSValueNode::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSValueNode::Create() {
+	return new BSValueNode;
+}
+
+void BSValueNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Read( in, link_stack, info );
+	NifStream( value, in, info );
+	NifStream( unknownByte, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSValueNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::Write( out, link_map, info );
+	NifStream( value, out, info );
+	NifStream( unknownByte, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSValueNode::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiNode::asString();
+	out << "  Value:  " << value << endl;
+	out << "  Unknown byte:  " << unknownByte << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSValueNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiNode::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> BSValueNode::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiNode::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/BSWArray.cpp b/src/obj/BSWArray.cpp
new file mode 100644
index 00000000..4ec64c1c
--- /dev/null
+++ b/src/obj/BSWArray.cpp
@@ -0,0 +1,126 @@
+/* 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/BSWArray.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type BSWArray::TYPE("BSWArray", &NiExtraData::TYPE );
+
+BSWArray::BSWArray() : numItems((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+BSWArray::~BSWArray() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & BSWArray::GetType() const {
+	return TYPE;
+}
+
+NiObject * BSWArray::Create() {
+	return new BSWArray;
+}
+
+void BSWArray::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( numItems, in, info );
+	items.resize(numItems);
+	for (unsigned int i1 = 0; i1 < items.size(); i1++) {
+		NifStream( items[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSWArray::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 );
+	numItems = (int)(items.size());
+	NifStream( numItems, out, info );
+	for (unsigned int i1 = 0; i1 < items.size(); i1++) {
+		NifStream( items[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string BSWArray::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiExtraData::asString();
+	numItems = (int)(items.size());
+	out << "  Num Items:  " << numItems << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < items.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 << "    Items[" << i1 << "]:  " << items[i1] << endl;
+		array_output_count++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void BSWArray::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> BSWArray::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiExtraData::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/DistantLODShaderProperty.cpp b/src/obj/DistantLODShaderProperty.cpp
new file mode 100644
index 00000000..6f37d551
--- /dev/null
+++ b/src/obj/DistantLODShaderProperty.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/DistantLODShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type DistantLODShaderProperty::TYPE("DistantLODShaderProperty", &NiShadeProperty::TYPE );
+
+DistantLODShaderProperty::DistantLODShaderProperty() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+DistantLODShaderProperty::~DistantLODShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & DistantLODShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * DistantLODShaderProperty::Create() {
+	return new DistantLODShaderProperty;
+}
+
+void DistantLODShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void DistantLODShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string DistantLODShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void DistantLODShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> DistantLODShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/HairShaderProperty.cpp b/src/obj/HairShaderProperty.cpp
new file mode 100644
index 00000000..efa1c9f4
--- /dev/null
+++ b/src/obj/HairShaderProperty.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/HairShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type HairShaderProperty::TYPE("HairShaderProperty", &NiShadeProperty::TYPE );
+
+HairShaderProperty::HairShaderProperty() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+HairShaderProperty::~HairShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & HairShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * HairShaderProperty::Create() {
+	return new HairShaderProperty;
+}
+
+void HairShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void HairShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string HairShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void HairShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> HairShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/Lighting30ShaderProperty.cpp b/src/obj/Lighting30ShaderProperty.cpp
new file mode 100644
index 00000000..71baf838
--- /dev/null
+++ b/src/obj/Lighting30ShaderProperty.cpp
@@ -0,0 +1,132 @@
+/* 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/Lighting30ShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type Lighting30ShaderProperty::TYPE("Lighting30ShaderProperty", &NiShadeProperty::TYPE );
+
+Lighting30ShaderProperty::Lighting30ShaderProperty() : unknownInt1((int)0), unknownFloat1(0.0f), unknownInt2((int)0), unknownFloat2(0.0f), unknownInt3((int)0), unknownInt4((int)0), unknownInt5((int)0), unknownInt6((int)0), unknownFloat3(0.0f), unknownFloat4(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+Lighting30ShaderProperty::~Lighting30ShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & Lighting30ShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * Lighting30ShaderProperty::Create() {
+	return new Lighting30ShaderProperty;
+}
+
+void Lighting30ShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownInt4, in, info );
+	NifStream( unknownInt5, in, info );
+	NifStream( unknownInt6, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void Lighting30ShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownInt4, out, info );
+	NifStream( unknownInt5, out, info );
+	NifStream( unknownInt6, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string Lighting30ShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Int 4:  " << unknownInt4 << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	out << "  Unknown Int 6:  " << unknownInt6 << endl;
+	out << "  Unknown Float 3:  " << unknownFloat3 << endl;
+	out << "  Unknown Float 4:  " << unknownFloat4 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void Lighting30ShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> Lighting30ShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/Ni3dsAnimationNode.cpp b/src/obj/Ni3dsAnimationNode.cpp
index 1c67c22f..2024d11b 100644
--- a/src/obj/Ni3dsAnimationNode.cpp
+++ b/src/obj/Ni3dsAnimationNode.cpp
@@ -70,13 +70,11 @@ void Ni3dsAnimationNode::Read( istream& in, list<unsigned int> & link_stack, con
 	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
-
 	//--END CUSTOM CODE--//
 }
 
 void Ni3dsAnimationNode::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 );
@@ -109,13 +107,11 @@ void Ni3dsAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int
 	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
-
 	//--END CUSTOM CODE--//
 }
 
 std::string Ni3dsAnimationNode::asString( bool verbose ) const {
 	//--BEGIN PRE-STRING CUSTOM CODE--//
-
 	//--END CUSTOM CODE--//
 
 	stringstream out;
@@ -170,13 +166,11 @@ std::string Ni3dsAnimationNode::asString( bool verbose ) const {
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
-
 	//--END CUSTOM CODE--//
 }
 
 void Ni3dsAnimationNode::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 );
@@ -185,7 +179,6 @@ void Ni3dsAnimationNode::FixLinks( const map<unsigned int,NiObjectRef> & objects
 	};
 
 	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
-
 	//--END CUSTOM CODE--//
 }
 
@@ -198,5 +191,4 @@ std::list<NiObjectRef> Ni3dsAnimationNode::GetRefs() const {
 }
 
 //--BEGIN MISC CUSTOM CODE--//
-
 //--END CUSTOM CODE--//
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index c5681137..f9570d2e 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -23,7 +23,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiAVObject::TYPE("NiAVObject", &NiObjectNET::TYPE );
 
-NiAVObject::NiAVObject() : flags((unsigned short)0), scale(1.0f), numProperties((unsigned int)0), unknown2((byte)0), hasBoundingBox(false), collisionObject(NULL) {
+NiAVObject::NiAVObject() : flags((unsigned short)0), unknownShort1((unsigned short)0), scale(1.0f), numProperties((unsigned int)0), unknown2((byte)0), hasBoundingBox(false), collisionObject(NULL) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 
 	parent = NULL;
@@ -62,6 +62,9 @@ void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, const NifIn
 	if ( info.version >= 0x03000000 ) {
 		NifStream( flags, in, info );
 	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && (info.userVersion2 > 26)) ) ) {
+		NifStream( unknownShort1, in, info );
+	};
 	NifStream( translation, in, info );
 	NifStream( rotation, in, info );
 	NifStream( scale, in, info );
@@ -107,6 +110,9 @@ void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	if ( info.version >= 0x03000000 ) {
 		NifStream( flags, out, info );
 	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && (info.userVersion2 > 26)) ) ) {
+		NifStream( unknownShort1, out, info );
+	};
 	NifStream( translation, out, info );
 	NifStream( rotation, out, info );
 	NifStream( scale, out, info );
@@ -165,6 +171,7 @@ std::string NiAVObject::asString( bool verbose ) const {
 	out << NiObjectNET::asString();
 	numProperties = (unsigned int)(properties.size());
 	out << "  Flags:  " << flags << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
 	out << "  Translation:  " << translation << endl;
 	out << "  Rotation:  " << rotation << endl;
 	out << "  Scale:  " << scale << endl;
diff --git a/src/obj/NiAdditionalGeometryData.cpp b/src/obj/NiAdditionalGeometryData.cpp
new file mode 100644
index 00000000..19ad9c93
--- /dev/null
+++ b/src/obj/NiAdditionalGeometryData.cpp
@@ -0,0 +1,250 @@
+/* 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/NiAdditionalGeometryData.h"
+#include "../../include/gen/AdditionalDataInfo.h"
+#include "../../include/gen/AdditionalDataBlock.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type NiAdditionalGeometryData::TYPE("NiAdditionalGeometryData", &NiObject::TYPE );
+
+NiAdditionalGeometryData::NiAdditionalGeometryData() : numVertices((unsigned short)0), numBlockInfos((unsigned int)0), numBlocks((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+NiAdditionalGeometryData::~NiAdditionalGeometryData() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & NiAdditionalGeometryData::GetType() const {
+	return TYPE;
+}
+
+NiObject * NiAdditionalGeometryData::Create() {
+	return new NiAdditionalGeometryData;
+}
+
+void NiAdditionalGeometryData::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 );
+	NifStream( numVertices, in, info );
+	NifStream( numBlockInfos, in, info );
+	blockInfos.resize(numBlockInfos);
+	for (unsigned int i1 = 0; i1 < blockInfos.size(); i1++) {
+		NifStream( blockInfos[i1].dataType, in, info );
+		NifStream( blockInfos[i1].blockSize, in, info );
+		NifStream( blockInfos[i1].numBlocks, in, info );
+		NifStream( blockInfos[i1].blockSize2, in, info );
+		NifStream( blockInfos[i1].blockIndex, in, info );
+		NifStream( blockInfos[i1].unknownInt1, in, info );
+		NifStream( blockInfos[i1].unknownByte1, in, info );
+	};
+	NifStream( numBlocks, in, info );
+	blocks.resize(numBlocks);
+	for (unsigned int i1 = 0; i1 < blocks.size(); i1++) {
+		NifStream( blocks[i1].hasData, in, info );
+		if ( blocks[i1].hasData ) {
+			NifStream( blocks[i1].blockSize, in, info );
+			NifStream( blocks[i1].numBlocks, in, info );
+			blocks[i1].blockOffsets.resize(blocks[i1].numBlocks);
+			for (unsigned int i3 = 0; i3 < blocks[i1].blockOffsets.size(); i3++) {
+				NifStream( blocks[i1].blockOffsets[i3], in, info );
+			};
+			NifStream( blocks[i1].numData, in, info );
+			blocks[i1].dataSizes.resize(blocks[i1].numData);
+			for (unsigned int i3 = 0; i3 < blocks[i1].dataSizes.size(); i3++) {
+				NifStream( blocks[i1].dataSizes[i3], in, info );
+			};
+			blocks[i1].data.resize(blocks[i1].numData);
+			for (unsigned int i3 = 0; i3 < blocks[i1].data.size(); i3++) {
+				blocks[i1].data[i3].resize(blocks[i1].blockSize);
+				for (unsigned int i4 = 0; i4 < blocks[i1].data[i3].size(); i4++) {
+					NifStream( blocks[i1].data[i3][i4], in, info );
+				};
+			};
+		};
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiAdditionalGeometryData::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 );
+	numBlocks = (int)(blocks.size());
+	numBlockInfos = (unsigned int)(blockInfos.size());
+	NifStream( numVertices, out, info );
+	NifStream( numBlockInfos, out, info );
+	for (unsigned int i1 = 0; i1 < blockInfos.size(); i1++) {
+		NifStream( blockInfos[i1].dataType, out, info );
+		NifStream( blockInfos[i1].blockSize, out, info );
+		NifStream( blockInfos[i1].numBlocks, out, info );
+		NifStream( blockInfos[i1].blockSize2, out, info );
+		NifStream( blockInfos[i1].blockIndex, out, info );
+		NifStream( blockInfos[i1].unknownInt1, out, info );
+		NifStream( blockInfos[i1].unknownByte1, out, info );
+	};
+	NifStream( numBlocks, out, info );
+	for (unsigned int i1 = 0; i1 < blocks.size(); i1++) {
+		blocks[i1].numData = (int)(blocks[i1].dataSizes.size());
+		blocks[i1].numBlocks = (int)(blocks[i1].blockOffsets.size());
+		blocks[i1].blockSize = (int)((blocks[i1].data.size() > 0) ? blocks[i1].data[0].size() : 0);
+		NifStream( blocks[i1].hasData, out, info );
+		if ( blocks[i1].hasData ) {
+			NifStream( blocks[i1].blockSize, out, info );
+			NifStream( blocks[i1].numBlocks, out, info );
+			for (unsigned int i3 = 0; i3 < blocks[i1].blockOffsets.size(); i3++) {
+				NifStream( blocks[i1].blockOffsets[i3], out, info );
+			};
+			NifStream( blocks[i1].numData, out, info );
+			for (unsigned int i3 = 0; i3 < blocks[i1].dataSizes.size(); i3++) {
+				NifStream( blocks[i1].dataSizes[i3], out, info );
+			};
+			for (unsigned int i3 = 0; i3 < blocks[i1].data.size(); i3++) {
+				for (unsigned int i4 = 0; i4 < blocks[i1].data[i3].size(); i4++) {
+					NifStream( blocks[i1].data[i3][i4], out, info );
+				};
+			};
+		};
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string NiAdditionalGeometryData::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiObject::asString();
+	numBlocks = (int)(blocks.size());
+	numBlockInfos = (unsigned int)(blockInfos.size());
+	out << "  Num Vertices:  " << numVertices << endl;
+	out << "  Num Block Infos:  " << numBlockInfos << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < blockInfos.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Data Type:  " << blockInfos[i1].dataType << endl;
+		out << "    Block Size:  " << blockInfos[i1].blockSize << endl;
+		out << "    Num Blocks:  " << blockInfos[i1].numBlocks << endl;
+		out << "    Block Size 2:  " << blockInfos[i1].blockSize2 << endl;
+		out << "    Block Index:  " << blockInfos[i1].blockIndex << endl;
+		out << "    Unknown Int 1:  " << blockInfos[i1].unknownInt1 << endl;
+		out << "    Unknown Byte 1:  " << blockInfos[i1].unknownByte1 << endl;
+	};
+	out << "  Num Blocks:  " << numBlocks << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < blocks.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		blocks[i1].numData = (int)(blocks[i1].dataSizes.size());
+		blocks[i1].numBlocks = (int)(blocks[i1].blockOffsets.size());
+		blocks[i1].blockSize = (int)((blocks[i1].data.size() > 0) ? blocks[i1].data[0].size() : 0);
+		out << "    Has Data:  " << blocks[i1].hasData << endl;
+		if ( blocks[i1].hasData ) {
+			out << "      Block Size:  " << blocks[i1].blockSize << endl;
+			out << "      Num Blocks:  " << blocks[i1].numBlocks << endl;
+			array_output_count = 0;
+			for (unsigned int i3 = 0; i3 < blocks[i1].blockOffsets.size(); i3++) {
+				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 << "        Block Offsets[" << i3 << "]:  " << blocks[i1].blockOffsets[i3] << endl;
+				array_output_count++;
+			};
+			out << "      Num Data:  " << blocks[i1].numData << endl;
+			array_output_count = 0;
+			for (unsigned int i3 = 0; i3 < blocks[i1].dataSizes.size(); i3++) {
+				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 << "        Data Sizes[" << i3 << "]:  " << blocks[i1].dataSizes[i3] << endl;
+				array_output_count++;
+			};
+			array_output_count = 0;
+			for (unsigned int i3 = 0; i3 < blocks[i1].data.size(); i3++) {
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+					break;
+				};
+				for (unsigned int i4 = 0; i4 < blocks[i1].data[i3].size(); i4++) {
+					if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+						break;
+					};
+					out << "          Data[" << i4 << "]:  " << blocks[i1].data[i3][i4] << endl;
+					array_output_count++;
+				};
+			};
+		};
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void NiAdditionalGeometryData::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> NiAdditionalGeometryData::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiObject::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/NiBoneLODController.cpp b/src/obj/NiBoneLODController.cpp
index ec5f4bd6..2cf34d27 100644
--- a/src/obj/NiBoneLODController.cpp
+++ b/src/obj/NiBoneLODController.cpp
@@ -63,7 +63,7 @@ void NiBoneLODController::Read( istream& in, list<unsigned int> & link_stack, co
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( ( info.version >= 0x04020200 ) && ( info.userVersion == 0 ) ) {
+	if ( info.version >= 0x04020200 ) {
 		NifStream( numShapeGroups, in, info );
 		shapeGroups1.resize(numShapeGroups);
 		for (unsigned int i2 = 0; i2 < shapeGroups1.size(); i2++) {
@@ -114,7 +114,7 @@ void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned in
 			}
 		};
 	};
-	if ( ( info.version >= 0x04020200 ) && ( info.userVersion == 0 ) ) {
+	if ( info.version >= 0x04020200 ) {
 		NifStream( numShapeGroups, out, info );
 		for (unsigned int i2 = 0; i2 < shapeGroups1.size(); i2++) {
 			shapeGroups1[i2].numLinkPairs = (unsigned int)(shapeGroups1[i2].linkPairs.size());
@@ -240,7 +240,7 @@ void NiBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & object
 			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, info );
 		};
 	};
-	if ( ( info.version >= 0x04020200 ) && ( info.userVersion == 0 ) ) {
+	if ( info.version >= 0x04020200 ) {
 		for (unsigned int i2 = 0; i2 < shapeGroups1.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < shapeGroups1[i2].linkPairs.size(); i3++) {
 				shapeGroups1[i2].linkPairs[i3].shape = FixLink<NiTriBasedGeom>( objects, link_stack, info );
diff --git a/src/obj/NiControllerSequence.cpp b/src/obj/NiControllerSequence.cpp
index 4f6aebda..30c8501f 100644
--- a/src/obj/NiControllerSequence.cpp
+++ b/src/obj/NiControllerSequence.cpp
@@ -26,7 +26,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiControllerSequence::TYPE("NiControllerSequence", &NiSequence::TYPE );
 
-NiControllerSequence::NiControllerSequence() : weight(1.0f), textKeys(NULL), unknownInt0((unsigned int)0), frequency(0.0f), startTime(0.0f), stopTime(0.0f), unknownFloat2(0.0f), unknownByte((byte)0), manager(NULL), stringPalette(NULL) {
+NiControllerSequence::NiControllerSequence() : weight(1.0f), textKeys(NULL), unknownInt0((unsigned int)0), frequency(0.0f), startTime(0.0f), stopTime(0.0f), unknownFloat2(0.0f), unknownByte((byte)0), manager(NULL), stringPalette(NULL), unknownShort1((short)0), unknownShort2((short)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -79,6 +79,12 @@ void NiControllerSequence::Read( istream& in, list<unsigned int> & link_stack, c
 		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && (info.userVersion2 >= 24)) ) ) {
+		NifStream( unknownShort1, in, info );
+	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && ((info.userVersion2 >= 24) && (info.userVersion2 <= 28))) ) ) {
+		NifStream( unknownShort2, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -139,6 +145,12 @@ void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned i
 			}
 		}
 	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && (info.userVersion2 >= 24)) ) ) {
+		NifStream( unknownShort1, out, info );
+	};
+	if ( ( info.version >= 0x14020007 ) && ( ((info.userVersion == 11) && ((info.userVersion2 >= 24) && (info.userVersion2 <= 28))) ) ) {
+		NifStream( unknownShort2, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -163,6 +175,8 @@ std::string NiControllerSequence::asString( bool verbose ) const {
 	out << "  Manager:  " << manager << endl;
 	out << "  Target Name:  " << targetName << endl;
 	out << "  String Palette:  " << stringPalette << endl;
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	out << "  Unknown Short 2:  " << unknownShort2 << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
@@ -300,7 +314,7 @@ void NiControllerSequence::AddInterpolator( NiSingleInterpController * obj, byte
 
 void NiControllerSequence::ClearControllerData() {
 	
-	throw runtime_error("The AddInterpolator function cannot be implemented until prolems in the XML are solved.");
+	throw runtime_error("The AddInterpolator function cannot be implemented until problems in the XML are solved.");
 
 	//Clear list
 	controlledBlocks.clear();
@@ -310,6 +324,13 @@ vector<ControllerLink> NiControllerSequence::GetControllerData() const {
 	return controlledBlocks;
 }
 
+void NiControllerSequence::SetControllerData(const vector<ControllerLink>& value) {
+	if ( value.size() != controlledBlocks.size() ) 
+		throw runtime_error("The SetControllerData requires the ControllerLink array size to match the existing array.");
+	controlledBlocks = value;
+}
+
+
 Ref<NiTextKeyExtraData> NiControllerSequence::GetTextKeyExtraData() const {
 	return textKeys;
 }
@@ -392,4 +413,12 @@ void NiControllerSequence::SetWeight( const float value ) {
 	weight = value;
 }
 
+
+Ref<NiStringPalette > Niflib::NiControllerSequence::GetStringPalette() const {
+	return stringPalette;
+}
+
+void Niflib::NiControllerSequence::SetStringPalette( const Ref<NiStringPalette >& value ) {
+	stringPalette = value;
+}
 //--END CUSTOM CODE--//
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index ed90a979..07a2dbe0 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -77,14 +77,7 @@ void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack
 			NifStream( interpolatorWeights[i2].weight_, in, info );
 		};
 	};
-	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 10 ) ) {
-		NifStream( numUnknownInts, in, info );
-		unknownInts.resize(numUnknownInts);
-		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], in, info );
-		};
-	};
-	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 11 ) ) {
+	if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14000005 ) && ( ((info.userVersion == 10) || (info.userVersion == 11)) ) ) {
 		NifStream( numUnknownInts, in, info );
 		unknownInts.resize(numUnknownInts);
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
@@ -165,13 +158,7 @@ void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigne
 			NifStream( interpolatorWeights[i2].weight_, out, info );
 		};
 	};
-	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 10 ) ) {
-		NifStream( numUnknownInts, out, info );
-		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], out, info );
-		};
-	};
-	if ( ( info.version >= 0x14000004 ) && ( info.userVersion == 11 ) ) {
+	if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14000005 ) && ( ((info.userVersion == 10) || (info.userVersion == 11)) ) ) {
 		NifStream( numUnknownInts, out, info );
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
 			NifStream( unknownInts[i2], out, info );
diff --git a/src/obj/NiGeometry.cpp b/src/obj/NiGeometry.cpp
index 378f9422..5d9411e3 100644
--- a/src/obj/NiGeometry.cpp
+++ b/src/obj/NiGeometry.cpp
@@ -17,7 +17,7 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/NiGeometry.h"
-#include "../../include/obj/NiGeometryData.h"
+#include "../../include/obj/NiObject.h"
 #include "../../include/obj/NiSkinInstance.h"
 using namespace Niflib;
 
@@ -200,7 +200,7 @@ void NiGeometry::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<u
 	//--END CUSTOM CODE--//
 
 	NiAVObject::FixLinks( objects, link_stack, info );
-	data = FixLink<NiGeometryData>( objects, link_stack, info );
+	data = FixLink<NiObject>( objects, link_stack, info );
 	if ( info.version >= 0x0303000D ) {
 		skinInstance = FixLink<NiSkinInstance>( objects, link_stack, info );
 	};
@@ -222,7 +222,7 @@ std::list<NiObjectRef> NiGeometry::GetRefs() const {
 //--BEGIN MISC CUSTOM CODE--//
 
 Ref<NiGeometryData> NiGeometry::GetData() const {
-	return data;
+	return DynamicCast<NiGeometryData>(data);
 }
 
 void NiGeometry::SetData( NiGeometryData * n ) {
diff --git a/src/obj/NiGeometryData.cpp b/src/obj/NiGeometryData.cpp
index a81cd0d8..8aedcdb9 100644
--- a/src/obj/NiGeometryData.cpp
+++ b/src/obj/NiGeometryData.cpp
@@ -14,13 +14,13 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/NiGeometryData.h"
-#include "../../include/obj/NiObject.h"
+#include "../../include/obj/NiAdditionalGeometryData.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
 const Type NiGeometryData::TYPE("NiGeometryData", &NiObject::TYPE );
 
-NiGeometryData::NiGeometryData() : numVertices((unsigned short)0), keepFlags((byte)0), compressFlags((byte)0), hasVertices(1), numUvSets((unsigned short)0), hasNormals(false), radius(0.0f), hasVertexColors(false), hasUv(false), consistencyFlags((ConsistencyType)0), unknownLink1(NULL) {
+NiGeometryData::NiGeometryData() : numVertices((unsigned short)0), keepFlags((byte)0), compressFlags((byte)0), hasVertices(1), numUvSets((unsigned short)0), hasNormals(false), radius(0.0f), hasVertexColors(false), hasUv(false), consistencyFlags((ConsistencyType)0), additionalData(NULL) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -96,11 +96,22 @@ void NiGeometryData::Read( istream& in, list<unsigned int> & link_stack, const N
 	if ( info.version <= 0x04000002 ) {
 		NifStream( hasUv, in, info );
 	};
-	uvSets.resize((numUvSets & 63));
-	for (unsigned int i1 = 0; i1 < uvSets.size(); i1++) {
-		uvSets[i1].resize(numVertices);
-		for (unsigned int i2 = 0; i2 < uvSets[i1].size(); i2++) {
-			NifStream( uvSets[i1][i2], in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		uvSets.resize((numUvSets & 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, info );
+			};
+		};
+	};
+	if ( ((info.version >= 0x14020007) && (info.userVersion == 11)) ) {
+		uvSets.resize((numUvSets & 1));
+		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, info );
+			};
 		};
 	};
 	if ( info.version >= 0x0A000100 ) {
@@ -169,9 +180,18 @@ void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	if ( info.version <= 0x04000002 ) {
 		NifStream( hasUv, out, info );
 	};
-	for (unsigned int i1 = 0; i1 < uvSets.size(); i1++) {
-		for (unsigned int i2 = 0; i2 < uvSets[i1].size(); i2++) {
-			NifStream( uvSets[i1][i2], out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
+			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
+				NifStream( uvSets[i2][i3], out, info );
+			};
+		};
+	};
+	if ( ((info.version >= 0x14020007) && (info.userVersion == 11)) ) {
+		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
+			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
+				NifStream( uvSets[i2][i3], out, info );
+			};
 		};
 	};
 	if ( info.version >= 0x0A000100 ) {
@@ -179,10 +199,10 @@ void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	};
 	if ( info.version >= 0x14000004 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*unknownLink1), out, info );
+			NifStream( (unsigned int)&(*additionalData), out, info );
 		} else {
-			if ( unknownLink1 != NULL ) {
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
+			if ( additionalData != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(additionalData) )->second, out, info );
 			} else {
 				NifStream( 0xFFFFFFFF, out, info );
 			}
@@ -296,7 +316,7 @@ std::string NiGeometryData::asString( bool verbose ) const {
 		};
 	};
 	out << "  Consistency Flags:  " << consistencyFlags << endl;
-	out << "  Unknown Link 1:  " << unknownLink1 << endl;
+	out << "  Additional Data:  " << additionalData << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
@@ -309,7 +329,7 @@ void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, li
 
 	NiObject::FixLinks( objects, link_stack, info );
 	if ( info.version >= 0x14000004 ) {
-		unknownLink1 = FixLink<NiObject>( objects, link_stack, info );
+		additionalData = FixLink<NiAdditionalGeometryData>( objects, link_stack, info );
 	};
 
 	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
@@ -319,8 +339,8 @@ void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, li
 std::list<NiObjectRef> NiGeometryData::GetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiObject::GetRefs();
-	if ( unknownLink1 != NULL )
-		refs.push_back(StaticCast<NiObject>(unknownLink1));
+	if ( additionalData != NULL )
+		refs.push_back(StaticCast<NiObject>(additionalData));
 	return refs;
 }
 
diff --git a/src/obj/NiMaterialProperty.cpp b/src/obj/NiMaterialProperty.cpp
index d84acd9b..0e68cdac 100644
--- a/src/obj/NiMaterialProperty.cpp
+++ b/src/obj/NiMaterialProperty.cpp
@@ -19,7 +19,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiMaterialProperty::TYPE("NiMaterialProperty", &NiProperty::TYPE );
 
-NiMaterialProperty::NiMaterialProperty() : flags((unsigned short)0), glossiness(0.0f), alpha(0.0f) {
+NiMaterialProperty::NiMaterialProperty() : flags((unsigned short)0), glossiness(0.0f), alpha(0.0f), emitmulti(0.0f) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -45,12 +45,17 @@ void NiMaterialProperty::Read( istream& in, list<unsigned int> & link_stack, con
 	if ( info.version <= 0x0A000102 ) {
 		NifStream( flags, in, info );
 	};
-	NifStream( ambientColor, in, info );
-	NifStream( diffuseColor, in, info );
+	if ( (!((info.version == 0x14020007) && ((info.userVersion == 11) && (info.userVersion2 > 21)))) ) {
+		NifStream( ambientColor, in, info );
+		NifStream( diffuseColor, in, info );
+	};
 	NifStream( specularColor, in, info );
 	NifStream( emissiveColor, in, info );
 	NifStream( glossiness, in, info );
 	NifStream( alpha, in, info );
+	if ( ((info.version == 0x14020007) && ((info.userVersion == 11) && (info.userVersion2 > 21))) ) {
+		NifStream( emitmulti, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -64,12 +69,17 @@ void NiMaterialProperty::Write( ostream& out, const map<NiObjectRef,unsigned int
 	if ( info.version <= 0x0A000102 ) {
 		NifStream( flags, out, info );
 	};
-	NifStream( ambientColor, out, info );
-	NifStream( diffuseColor, out, info );
+	if ( (!((info.version == 0x14020007) && ((info.userVersion == 11) && (info.userVersion2 > 21)))) ) {
+		NifStream( ambientColor, out, info );
+		NifStream( diffuseColor, out, info );
+	};
 	NifStream( specularColor, out, info );
 	NifStream( emissiveColor, out, info );
 	NifStream( glossiness, out, info );
 	NifStream( alpha, out, info );
+	if ( ((info.version == 0x14020007) && ((info.userVersion == 11) && (info.userVersion2 > 21))) ) {
+		NifStream( emitmulti, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -89,6 +99,7 @@ std::string NiMaterialProperty::asString( bool verbose ) const {
 	out << "  Emissive Color:  " << emissiveColor << endl;
 	out << "  Glossiness:  " << glossiness << endl;
 	out << "  Alpha:  " << alpha << endl;
+	out << "  EmitMulti:  " << emitmulti << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/NiMorphData.cpp b/src/obj/NiMorphData.cpp
index 09322294..29d794c6 100644
--- a/src/obj/NiMorphData.cpp
+++ b/src/obj/NiMorphData.cpp
@@ -62,7 +62,7 @@ void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, const NifI
 		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A020000 ) ) {
 			NifStream( morphs[i1].unknownInt, in, info );
 		};
-		if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14010003 ) && ( info.userVersion == 0 ) ) {
+		if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14010003 ) ) {
 			NifStream( morphs[i1].unknownInt, in, info );
 		};
 		morphs[i1].vectors.resize(numVertices);
@@ -99,7 +99,7 @@ void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A020000 ) ) {
 			NifStream( morphs[i1].unknownInt, out, info );
 		};
-		if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14010003 ) && ( info.userVersion == 0 ) ) {
+		if ( ( info.version >= 0x14000004 ) && ( info.version <= 0x14010003 ) ) {
 			NifStream( morphs[i1].unknownInt, out, info );
 		};
 		for (unsigned int i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
diff --git a/src/obj/NiPSysCollider.cpp b/src/obj/NiPSysCollider.cpp
index 6b5cab3e..c8ee6096 100644
--- a/src/obj/NiPSysCollider.cpp
+++ b/src/obj/NiPSysCollider.cpp
@@ -152,8 +152,6 @@ std::list<NiObjectRef> NiPSysCollider::GetRefs() const {
 		refs.push_back(StaticCast<NiObject>(spawnModifier));
 	if ( nextCollider != NULL )
 		refs.push_back(StaticCast<NiObject>(nextCollider));
-	if ( colliderObject != NULL )
-		refs.push_back(StaticCast<NiObject>(colliderObject));
 	return refs;
 }
 
diff --git a/src/obj/NiPSysData.cpp b/src/obj/NiPSysData.cpp
index dd0288d6..b60c1d7b 100644
--- a/src/obj/NiPSysData.cpp
+++ b/src/obj/NiPSysData.cpp
@@ -43,20 +43,22 @@ void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifIn
 	//--END CUSTOM CODE--//
 
 	NiRotatingParticlesData::Read( in, link_stack, info );
-	particleDescriptions.resize(numVertices);
-	for (unsigned int i1 = 0; i1 < particleDescriptions.size(); i1++) {
-		NifStream( particleDescriptions[i1].translation, in, info );
-		if ( info.version <= 0x0A020000 ) {
-			for (unsigned int i3 = 0; i3 < 3; i3++) {
-				NifStream( particleDescriptions[i1].unknownFloats1[i3], in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		particleDescriptions.resize(numVertices);
+		for (unsigned int i2 = 0; i2 < particleDescriptions.size(); i2++) {
+			NifStream( particleDescriptions[i2].translation, in, info );
+			if ( info.version <= 0x0A020000 ) {
+				for (unsigned int i4 = 0; i4 < 3; i4++) {
+					NifStream( particleDescriptions[i2].unknownFloats1[i4], in, info );
+				};
 			};
+			NifStream( particleDescriptions[i2].unknownFloat1, in, info );
+			NifStream( particleDescriptions[i2].unknownFloat2, in, info );
+			NifStream( particleDescriptions[i2].unknownFloat3, in, info );
+			NifStream( particleDescriptions[i2].unknownInt1, in, info );
 		};
-		NifStream( particleDescriptions[i1].unknownFloat1, in, info );
-		NifStream( particleDescriptions[i1].unknownFloat2, in, info );
-		NifStream( particleDescriptions[i1].unknownFloat3, in, info );
-		NifStream( particleDescriptions[i1].unknownInt1, in, info );
 	};
-	if ( info.version >= 0x14000004 ) {
+	if ( ( info.version >= 0x14000004 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
 		NifStream( hasUnknownFloats3, in, info );
 		if ( (hasUnknownFloats3 != 0) ) {
 			unknownFloats3.resize(numVertices);
@@ -65,8 +67,10 @@ void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifIn
 			};
 		};
 	};
-	NifStream( unknownShort1, in, info );
-	NifStream( unknownShort2, in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		NifStream( unknownShort1, in, info );
+		NifStream( unknownShort2, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -77,19 +81,21 @@ void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	//--END CUSTOM CODE--//
 
 	NiRotatingParticlesData::Write( out, link_map, info );
-	for (unsigned int i1 = 0; i1 < particleDescriptions.size(); i1++) {
-		NifStream( particleDescriptions[i1].translation, out, info );
-		if ( info.version <= 0x0A020000 ) {
-			for (unsigned int i3 = 0; i3 < 3; i3++) {
-				NifStream( particleDescriptions[i1].unknownFloats1[i3], out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		for (unsigned int i2 = 0; i2 < particleDescriptions.size(); i2++) {
+			NifStream( particleDescriptions[i2].translation, out, info );
+			if ( info.version <= 0x0A020000 ) {
+				for (unsigned int i4 = 0; i4 < 3; i4++) {
+					NifStream( particleDescriptions[i2].unknownFloats1[i4], out, info );
+				};
 			};
+			NifStream( particleDescriptions[i2].unknownFloat1, out, info );
+			NifStream( particleDescriptions[i2].unknownFloat2, out, info );
+			NifStream( particleDescriptions[i2].unknownFloat3, out, info );
+			NifStream( particleDescriptions[i2].unknownInt1, out, info );
 		};
-		NifStream( particleDescriptions[i1].unknownFloat1, out, info );
-		NifStream( particleDescriptions[i1].unknownFloat2, out, info );
-		NifStream( particleDescriptions[i1].unknownFloat3, out, info );
-		NifStream( particleDescriptions[i1].unknownInt1, out, info );
 	};
-	if ( info.version >= 0x14000004 ) {
+	if ( ( info.version >= 0x14000004 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
 		NifStream( hasUnknownFloats3, out, info );
 		if ( (hasUnknownFloats3 != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownFloats3.size(); i3++) {
@@ -97,8 +103,10 @@ void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 			};
 		};
 	};
-	NifStream( unknownShort1, out, info );
-	NifStream( unknownShort2, out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		NifStream( unknownShort1, out, info );
+		NifStream( unknownShort2, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
diff --git a/src/obj/NiPSysGravityModifier.cpp b/src/obj/NiPSysGravityModifier.cpp
index 4f86d85d..eedd0954 100644
--- a/src/obj/NiPSysGravityModifier.cpp
+++ b/src/obj/NiPSysGravityModifier.cpp
@@ -20,7 +20,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiPSysGravityModifier::TYPE("NiPSysGravityModifier", &NiPSysModifier::TYPE );
 
-NiPSysGravityModifier::NiPSysGravityModifier() : gravityObject(NULL), decay(0.0f), strength(0.0f), turbulence(0.0f), turbulenceScale(1.0f) {
+NiPSysGravityModifier::NiPSysGravityModifier() : gravityObject(NULL), decay(0.0f), strength(0.0f), turbulence(0.0f), turbulenceScale(1.0f), unknownByte((byte)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -52,6 +52,9 @@ void NiPSysGravityModifier::Read( istream& in, list<unsigned int> & link_stack,
 	NifStream( forceType, in, info );
 	NifStream( turbulence, in, info );
 	NifStream( turbulenceScale, in, info );
+	if ( ( info.version >= 0x14020007 ) && ( info.userVersion == 11 ) ) {
+		NifStream( unknownByte, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -77,6 +80,9 @@ void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( forceType, out, info );
 	NifStream( turbulence, out, info );
 	NifStream( turbulenceScale, out, info );
+	if ( ( info.version >= 0x14020007 ) && ( info.userVersion == 11 ) ) {
+		NifStream( unknownByte, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -96,6 +102,7 @@ std::string NiPSysGravityModifier::asString( bool verbose ) const {
 	out << "  Force Type:  " << forceType << endl;
 	out << "  Turbulence:  " << turbulence << endl;
 	out << "  Turbulence Scale:  " << turbulenceScale << endl;
+	out << "  Unknown Byte:  " << unknownByte << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/NiPSysGrowFadeModifier.cpp b/src/obj/NiPSysGrowFadeModifier.cpp
index b9fd23da..79b325ca 100644
--- a/src/obj/NiPSysGrowFadeModifier.cpp
+++ b/src/obj/NiPSysGrowFadeModifier.cpp
@@ -19,7 +19,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type NiPSysGrowFadeModifier::TYPE("NiPSysGrowFadeModifier", &NiPSysModifier::TYPE );
 
-NiPSysGrowFadeModifier::NiPSysGrowFadeModifier() : growTime(0.0f), growGeneration((unsigned short)0), fadeTime(0.0f), fadeGeneration((unsigned short)0) {
+NiPSysGrowFadeModifier::NiPSysGrowFadeModifier() : growTime(0.0f), growGeneration((unsigned short)0), fadeTime(0.0f), fadeGeneration((unsigned short)0), baseScale(0.0f) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -46,6 +46,9 @@ void NiPSysGrowFadeModifier::Read( istream& in, list<unsigned int> & link_stack,
 	NifStream( growGeneration, in, info );
 	NifStream( fadeTime, in, info );
 	NifStream( fadeGeneration, in, info );
+	if ( ( info.version >= 0x14020007 ) && ( info.userVersion == 11 ) ) {
+		NifStream( baseScale, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -60,6 +63,9 @@ void NiPSysGrowFadeModifier::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( growGeneration, out, info );
 	NifStream( fadeTime, out, info );
 	NifStream( fadeGeneration, out, info );
+	if ( ( info.version >= 0x14020007 ) && ( info.userVersion == 11 ) ) {
+		NifStream( baseScale, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -76,6 +82,7 @@ std::string NiPSysGrowFadeModifier::asString( bool verbose ) const {
 	out << "  Grow Generation:  " << growGeneration << endl;
 	out << "  Fade Time:  " << fadeTime << endl;
 	out << "  Fade Generation:  " << fadeGeneration << endl;
+	out << "  Base Scale:  " << baseScale << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/NiParticlesData.cpp b/src/obj/NiParticlesData.cpp
index dfa211f9..6ac81fea 100644
--- a/src/obj/NiParticlesData.cpp
+++ b/src/obj/NiParticlesData.cpp
@@ -14,12 +14,13 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/NiParticlesData.h"
+#include "../../include/obj/NiAdditionalGeometryData.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
-const Type NiParticlesData::TYPE("NiParticlesData", &NiGeometryData::TYPE );
+const Type NiParticlesData::TYPE("NiParticlesData", &NiObject::TYPE );
 
-NiParticlesData::NiParticlesData() : numParticles((unsigned short)0), size(0.0f), numActive((unsigned short)0), unknownShort((unsigned short)0), hasSizes(false), hasUnknownFloats1(false), hasRotations1(false), hasUnknownFloats2(false), hasUnknownVertices1(false) {
+NiParticlesData::NiParticlesData() : numVertices((unsigned short)0), keepFlags((byte)0), compressFlags((byte)0), hasVertices(1), numUvSets((unsigned short)0), hasNormals(false), radius(0.0f), hasVertexColors(false), hasUv(false), consistencyFlags((ConsistencyType)0), additionalData(NULL), numParticles((unsigned short)0), hasRadii(false), numActive((unsigned short)0), hasSizes1((int)0), hasSizes(false), hasRotations1(false), hasRotationAngles(false), hasRotationAxes(false), hasUnknownStuff1(false), numUnknownStuff1((short)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -41,38 +42,118 @@ void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, const
 	//--BEGIN PRE-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 
-	NiGeometryData::Read( in, link_stack, info );
+	unsigned int block_num;
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, in, info );
+	};
+	NifStream( numVertices, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( keepFlags, in, info );
+		NifStream( compressFlags, in, info );
+	};
+	NifStream( hasVertices, in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasVertices != 0) ) {
+			vertices.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < vertices.size(); i3++) {
+				NifStream( vertices[i3], in, info );
+			};
+		};
+	};
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets, in, info );
+	};
+	NifStream( hasNormals, in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasNormals != 0) ) {
+			normals.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < normals.size(); i3++) {
+				NifStream( normals[i3], in, info );
+			};
+		};
+	};
+	if ( ( info.version >= 0x0A010000 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( ((hasNormals != 0) && (numUvSets & 61440)) ) {
+			binormals.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < binormals.size(); i3++) {
+				NifStream( binormals[i3], in, info );
+			};
+			tangents.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < tangents.size(); i3++) {
+				NifStream( tangents[i3], in, info );
+			};
+		};
+	};
+	NifStream( center, in, info );
+	NifStream( radius, in, info );
+	NifStream( hasVertexColors, in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasVertexColors != 0) ) {
+			vertexColors.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < vertexColors.size(); i3++) {
+				NifStream( vertexColors[i3], in, info );
+			};
+		};
+	};
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, in, info );
+	};
 	if ( info.version <= 0x04000002 ) {
-		NifStream( numParticles, in, info );
+		NifStream( hasUv, in, info );
 	};
-	if ( info.version <= 0x0A000100 ) {
-		NifStream( size, in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		uvSets.resize((numUvSets & 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, info );
+			};
+		};
+	};
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( consistencyFlags, in, info );
+	};
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
+		link_stack.push_back( block_num );
 	};
 	if ( info.version <= 0x04000002 ) {
-		NifStream( numActive, in, info );
+		NifStream( numParticles, in, info );
 	};
-	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, in, info );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( radius, in, info );
 	};
-	NifStream( hasSizes, in, info );
-	if ( (hasSizes != 0) ) {
-		sizes.resize(numVertices);
-		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasRadii, in, info );
+	};
+	if ( ( info.version >= 0x0A010000 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( (hasRadii != 0) ) {
+			radii.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < radii.size(); i3++) {
+				NifStream( radii[i3], in, info );
+			};
 		};
 	};
+	NifStream( numActive, in, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasSizes1, in, info );
+	};
 	if ( info.version >= 0x0A010000 ) {
-		NifStream( numActive, in, info );
-		NifStream( hasUnknownFloats1, in, info );
-		if ( (hasUnknownFloats1 != 0) ) {
-			unknownFloats1.resize(numVertices);
-			for (unsigned int i3 = 0; i3 < unknownFloats1.size(); i3++) {
-				NifStream( unknownFloats1[i3], in, info );
+		NifStream( hasSizes, in, info );
+	};
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( ((hasSizes != 0) || (hasSizes1 != 0)) ) {
+			sizes.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < sizes.size(); i3++) {
+				NifStream( sizes[i3], in, info );
 			};
 		};
 	};
 	if ( info.version >= 0x0A000100 ) {
 		NifStream( hasRotations1, in, info );
+	};
+	if ( ( info.version >= 0x0A000100 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
 		if ( (hasRotations1 != 0) ) {
 			rotations1.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < rotations1.size(); i3++) {
@@ -81,20 +162,34 @@ void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, const
 		};
 	};
 	if ( info.version >= 0x14000004 ) {
-		NifStream( hasUnknownFloats2, in, info );
+		NifStream( hasRotationAngles, in, info );
 	};
-	if ( (hasUnknownFloats2 != 0) ) {
-		unknownFloats2.resize(numVertices);
-		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], in, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasRotationAngles != 0) ) {
+			rotationAngles.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < rotationAngles.size(); i3++) {
+				NifStream( rotationAngles[i3], in, info );
+			};
 		};
 	};
 	if ( info.version >= 0x14000004 ) {
-		NifStream( hasUnknownVertices1, in, info );
-		if ( (hasUnknownVertices1 != 0) ) {
-			unknownVertices1.resize(numVertices);
-			for (unsigned int i3 = 0; i3 < unknownVertices1.size(); i3++) {
-				NifStream( unknownVertices1[i3], in, info );
+		NifStream( hasRotationAxes, in, info );
+	};
+	if ( ( info.version >= 0x14000004 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( (hasRotationAxes != 0) ) {
+			rotationAxes.resize(numVertices);
+			for (unsigned int i3 = 0; i3 < rotationAxes.size(); i3++) {
+				NifStream( rotationAxes[i3], in, info );
+			};
+		};
+	};
+	if ( ((info.version >= 0x14020007) && (info.userVersion == 11)) ) {
+		NifStream( hasUnknownStuff1, in, info );
+		NifStream( numUnknownStuff1, in, info );
+		if ( (hasUnknownStuff1 >= 1) ) {
+			unknownStuff1.resize(numUnknownStuff1);
+			for (unsigned int i3 = 0; i3 < unknownStuff1.size(); i3++) {
+				NifStream( unknownStuff1[i3], in, info );
 			};
 		};
 	};
@@ -107,36 +202,118 @@ void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	//--BEGIN PRE-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 
-	NiGeometryData::Write( out, link_map, info );
+	NiObject::Write( out, link_map, info );
+	numUnknownStuff1 = (short)(unknownStuff1.size());
+	numUvSets = (unsigned short)(uvSets.size());
+	numVertices = (unsigned short)(vertices.size());
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, out, info );
+	};
+	NifStream( numVertices, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( keepFlags, out, info );
+		NifStream( compressFlags, out, info );
+	};
+	NifStream( hasVertices, out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasVertices != 0) ) {
+			for (unsigned int i3 = 0; i3 < vertices.size(); i3++) {
+				NifStream( vertices[i3], out, info );
+			};
+		};
+	};
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets, out, info );
+	};
+	NifStream( hasNormals, out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasNormals != 0) ) {
+			for (unsigned int i3 = 0; i3 < normals.size(); i3++) {
+				NifStream( normals[i3], out, info );
+			};
+		};
+	};
+	if ( ( info.version >= 0x0A010000 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( ((hasNormals != 0) && (numUvSets & 61440)) ) {
+			for (unsigned int i3 = 0; i3 < binormals.size(); i3++) {
+				NifStream( binormals[i3], out, info );
+			};
+			for (unsigned int i3 = 0; i3 < tangents.size(); i3++) {
+				NifStream( tangents[i3], out, info );
+			};
+		};
+	};
+	NifStream( center, out, info );
+	NifStream( radius, out, info );
+	NifStream( hasVertexColors, out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasVertexColors != 0) ) {
+			for (unsigned int i3 = 0; i3 < vertexColors.size(); i3++) {
+				NifStream( vertexColors[i3], out, info );
+			};
+		};
+	};
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, out, info );
+	};
 	if ( info.version <= 0x04000002 ) {
-		NifStream( numParticles, out, info );
+		NifStream( hasUv, out, info );
 	};
-	if ( info.version <= 0x0A000100 ) {
-		NifStream( size, out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
+			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
+				NifStream( uvSets[i2][i3], out, info );
+			};
+		};
+	};
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( consistencyFlags, out, info );
+	};
+	if ( info.version >= 0x14000004 ) {
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*additionalData), out, info );
+		} else {
+			if ( additionalData != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(additionalData) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
 	};
 	if ( info.version <= 0x04000002 ) {
-		NifStream( numActive, out, info );
+		NifStream( numParticles, out, info );
 	};
-	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, out, info );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( radius, out, info );
 	};
-	NifStream( hasSizes, out, info );
-	if ( (hasSizes != 0) ) {
-		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasRadii, out, info );
+	};
+	if ( ( info.version >= 0x0A010000 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( (hasRadii != 0) ) {
+			for (unsigned int i3 = 0; i3 < radii.size(); i3++) {
+				NifStream( radii[i3], out, info );
+			};
 		};
 	};
+	NifStream( numActive, out, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasSizes1, out, info );
+	};
 	if ( info.version >= 0x0A010000 ) {
-		NifStream( numActive, out, info );
-		NifStream( hasUnknownFloats1, out, info );
-		if ( (hasUnknownFloats1 != 0) ) {
-			for (unsigned int i3 = 0; i3 < unknownFloats1.size(); i3++) {
-				NifStream( unknownFloats1[i3], out, info );
+		NifStream( hasSizes, out, info );
+	};
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( ((hasSizes != 0) || (hasSizes1 != 0)) ) {
+			for (unsigned int i3 = 0; i3 < sizes.size(); i3++) {
+				NifStream( sizes[i3], out, info );
 			};
 		};
 	};
 	if ( info.version >= 0x0A000100 ) {
 		NifStream( hasRotations1, out, info );
+	};
+	if ( ( info.version >= 0x0A000100 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
 		if ( (hasRotations1 != 0) ) {
 			for (unsigned int i3 = 0; i3 < rotations1.size(); i3++) {
 				NifStream( rotations1[i3], out, info );
@@ -144,18 +321,31 @@ void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		};
 	};
 	if ( info.version >= 0x14000004 ) {
-		NifStream( hasUnknownFloats2, out, info );
+		NifStream( hasRotationAngles, out, info );
 	};
-	if ( (hasUnknownFloats2 != 0) ) {
-		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], out, info );
+	if ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) {
+		if ( (hasRotationAngles != 0) ) {
+			for (unsigned int i3 = 0; i3 < rotationAngles.size(); i3++) {
+				NifStream( rotationAngles[i3], out, info );
+			};
 		};
 	};
 	if ( info.version >= 0x14000004 ) {
-		NifStream( hasUnknownVertices1, out, info );
-		if ( (hasUnknownVertices1 != 0) ) {
-			for (unsigned int i3 = 0; i3 < unknownVertices1.size(); i3++) {
-				NifStream( unknownVertices1[i3], out, info );
+		NifStream( hasRotationAxes, out, info );
+	};
+	if ( ( info.version >= 0x14000004 ) && ( (!((info.version >= 0x14020007) && (info.userVersion == 11))) ) ) {
+		if ( (hasRotationAxes != 0) ) {
+			for (unsigned int i3 = 0; i3 < rotationAxes.size(); i3++) {
+				NifStream( rotationAxes[i3], out, info );
+			};
+		};
+	};
+	if ( ((info.version >= 0x14020007) && (info.userVersion == 11)) ) {
+		NifStream( hasUnknownStuff1, out, info );
+		NifStream( numUnknownStuff1, out, info );
+		if ( (hasUnknownStuff1 >= 1) ) {
+			for (unsigned int i3 = 0; i3 < unknownStuff1.size(); i3++) {
+				NifStream( unknownStuff1[i3], out, info );
 			};
 		};
 	};
@@ -170,15 +360,110 @@ std::string NiParticlesData::asString( bool verbose ) const {
 
 	stringstream out;
 	unsigned int array_output_count = 0;
-	out << NiGeometryData::asString();
+	out << NiObject::asString();
+	numUnknownStuff1 = (short)(unknownStuff1.size());
+	numUvSets = (unsigned short)(uvSets.size());
+	numVertices = (unsigned short)(vertices.size());
+	out << "  Name:  " << name << endl;
+	out << "  Num Vertices:  " << numVertices << endl;
+	out << "  Keep Flags:  " << keepFlags << endl;
+	out << "  Compress Flags:  " << compressFlags << endl;
+	out << "  Has Vertices:  " << hasVertices << endl;
+	if ( (hasVertices != 0) ) {
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < vertices.size(); 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 << "      Vertices[" << i2 << "]:  " << vertices[i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Num UV Sets:  " << numUvSets << endl;
+	out << "  Has Normals:  " << hasNormals << endl;
+	if ( (hasNormals != 0) ) {
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < normals.size(); 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 << "      Normals[" << i2 << "]:  " << normals[i2] << endl;
+			array_output_count++;
+		};
+	};
+	if ( ((hasNormals != 0) && (numUvSets & 61440)) ) {
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < binormals.size(); 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 << "      Binormals[" << i2 << "]:  " << binormals[i2] << endl;
+			array_output_count++;
+		};
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < tangents.size(); 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 << "      Tangents[" << i2 << "]:  " << tangents[i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Center:  " << center << endl;
+	out << "  Radius:  " << radius << endl;
+	out << "  Has Vertex Colors:  " << hasVertexColors << endl;
+	if ( (hasVertexColors != 0) ) {
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < vertexColors.size(); 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 << "      Vertex Colors[" << i2 << "]:  " << vertexColors[i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Has UV:  " << hasUv << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < uvSets.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		for (unsigned int i2 = 0; i2 < uvSets[i1].size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
+			out << "      UV Sets[" << i2 << "]:  " << uvSets[i1][i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Consistency Flags:  " << consistencyFlags << endl;
+	out << "  Additional Data:  " << additionalData << endl;
 	out << "  Num Particles:  " << numParticles << endl;
-	out << "  Size:  " << size << endl;
-	out << "  Num Active:  " << numActive << endl;
-	out << "  Unknown Short:  " << unknownShort << endl;
-	out << "  Has Sizes:  " << hasSizes << endl;
-	if ( (hasSizes != 0) ) {
+	out << "  Has Radii:  " << hasRadii << endl;
+	if ( (hasRadii != 0) ) {
 		array_output_count = 0;
-		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
+		for (unsigned int i2 = 0; i2 < radii.size(); i2++) {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
@@ -186,14 +471,16 @@ std::string NiParticlesData::asString( bool verbose ) const {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Sizes[" << i2 << "]:  " << sizes[i2] << endl;
+			out << "      Radii[" << i2 << "]:  " << radii[i2] << endl;
 			array_output_count++;
 		};
 	};
-	out << "  Has Unknown Floats 1:  " << hasUnknownFloats1 << endl;
-	if ( (hasUnknownFloats1 != 0) ) {
+	out << "  Num Active:  " << numActive << endl;
+	out << "  Has Sizes 1:  " << hasSizes1 << endl;
+	out << "  Has Sizes:  " << hasSizes << endl;
+	if ( ((hasSizes != 0) || (hasSizes1 != 0)) ) {
 		array_output_count = 0;
-		for (unsigned int i2 = 0; i2 < unknownFloats1.size(); i2++) {
+		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
@@ -201,7 +488,7 @@ std::string NiParticlesData::asString( bool verbose ) const {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 1[" << i2 << "]:  " << unknownFloats1[i2] << endl;
+			out << "      Sizes[" << i2 << "]:  " << sizes[i2] << endl;
 			array_output_count++;
 		};
 	};
@@ -220,10 +507,25 @@ std::string NiParticlesData::asString( bool verbose ) const {
 			array_output_count++;
 		};
 	};
-	out << "  Has Unknown Floats 2:  " << hasUnknownFloats2 << endl;
-	if ( (hasUnknownFloats2 != 0) ) {
+	out << "  Has Rotation Angles:  " << hasRotationAngles << endl;
+	if ( (hasRotationAngles != 0) ) {
+		array_output_count = 0;
+		for (unsigned int i2 = 0; i2 < rotationAngles.size(); 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 << "      Rotation Angles[" << i2 << "]:  " << rotationAngles[i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Has Rotation Axes:  " << hasRotationAxes << endl;
+	if ( (hasRotationAxes != 0) ) {
 		array_output_count = 0;
-		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
+		for (unsigned int i2 = 0; i2 < rotationAxes.size(); i2++) {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
@@ -231,14 +533,15 @@ std::string NiParticlesData::asString( bool verbose ) const {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 2[" << i2 << "]:  " << unknownFloats2[i2] << endl;
+			out << "      Rotation Axes[" << i2 << "]:  " << rotationAxes[i2] << endl;
 			array_output_count++;
 		};
 	};
-	out << "  Has Unknown Vertices 1:  " << hasUnknownVertices1 << endl;
-	if ( (hasUnknownVertices1 != 0) ) {
+	out << "  Has Unknown Stuff 1:  " << hasUnknownStuff1 << endl;
+	out << "  Num Unknown Stuff 1:  " << numUnknownStuff1 << endl;
+	if ( (hasUnknownStuff1 >= 1) ) {
 		array_output_count = 0;
-		for (unsigned int i2 = 0; i2 < unknownVertices1.size(); i2++) {
+		for (unsigned int i2 = 0; i2 < unknownStuff1.size(); i2++) {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
@@ -246,7 +549,7 @@ std::string NiParticlesData::asString( bool verbose ) const {
 			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Vertices 1[" << i2 << "]:  " << unknownVertices1[i2] << endl;
+			out << "      Unknown Stuff 1[" << i2 << "]:  " << unknownStuff1[i2] << endl;
 			array_output_count++;
 		};
 	};
@@ -260,7 +563,10 @@ void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, l
 	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 
-	NiGeometryData::FixLinks( objects, link_stack, info );
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		additionalData = FixLink<NiAdditionalGeometryData>( objects, link_stack, info );
+	};
 
 	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -268,7 +574,9 @@ void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, l
 
 std::list<NiObjectRef> NiParticlesData::GetRefs() const {
 	list<Ref<NiObject> > refs;
-	refs = NiGeometryData::GetRefs();
+	refs = NiObject::GetRefs();
+	if ( additionalData != NULL )
+		refs.push_back(StaticCast<NiObject>(additionalData));
 	return refs;
 }
 
diff --git a/src/obj/NiSequence.cpp b/src/obj/NiSequence.cpp
index 986a0098..d7a916b0 100644
--- a/src/obj/NiSequence.cpp
+++ b/src/obj/NiSequence.cpp
@@ -77,10 +77,7 @@ void NiSequence::Read( istream& in, list<unsigned int> & link_stack, const NifIn
 			link_stack.push_back( block_num );
 			NifStream( controlledBlocks[i1].unknownShort0, in, info );
 		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority, in, info );
-		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( ((info.userVersion == 10) || (info.userVersion == 11)) ) ) {
 			NifStream( controlledBlocks[i1].priority, in, info );
 		};
 		if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000005 ) ) {
@@ -206,10 +203,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 			}
 			NifStream( controlledBlocks[i1].unknownShort0, out, info );
 		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority, out, info );
-		};
-		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( ((info.userVersion == 10) || (info.userVersion == 11)) ) ) {
 			NifStream( controlledBlocks[i1].priority, out, info );
 		};
 		if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000005 ) ) {
diff --git a/src/obj/NiTexturingProperty.cpp b/src/obj/NiTexturingProperty.cpp
index fae86979..9a3f16c7 100644
--- a/src/obj/NiTexturingProperty.cpp
+++ b/src/obj/NiTexturingProperty.cpp
@@ -534,7 +534,7 @@ void NiTexturingProperty::Read( istream& in, list<unsigned int> & link_stack, co
 						NifStream( shaderTextures[i2].textureData.centerOffset, in, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, in, info );
+				NifStream( shaderTextures[i2].mapIndex, in, info );
 			};
 		};
 	};
@@ -1103,7 +1103,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 						NifStream( shaderTextures[i2].textureData.centerOffset, out, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, out, info );
+				NifStream( shaderTextures[i2].mapIndex, out, info );
 			};
 		};
 	};
@@ -1386,7 +1386,7 @@ std::string NiTexturingProperty::asString( bool verbose ) const {
 				out << "        Transform Type?:  " << shaderTextures[i1].textureData.transformType_ << endl;
 				out << "        Center Offset:  " << shaderTextures[i1].textureData.centerOffset << endl;
 			};
-			out << "      Unknown Int:  " << shaderTextures[i1].unknownInt << endl;
+			out << "      Map Index:  " << shaderTextures[i1].mapIndex << endl;
 		};
 	};
 	return out.str();
diff --git a/src/obj/SkyShaderProperty.cpp b/src/obj/SkyShaderProperty.cpp
new file mode 100644
index 00000000..a09e180d
--- /dev/null
+++ b/src/obj/SkyShaderProperty.cpp
@@ -0,0 +1,129 @@
+/* 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/SkyShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type SkyShaderProperty::TYPE("SkyShaderProperty", &NiProperty::TYPE );
+
+SkyShaderProperty::SkyShaderProperty() : unknownShort1((short)0), unknownShort2((short)0), unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownInt4((int)0), unknownShort3((short)0), unknownInt5((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+SkyShaderProperty::~SkyShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & SkyShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * SkyShaderProperty::Create() {
+	return new SkyShaderProperty;
+}
+
+void SkyShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Read( in, link_stack, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownInt4, in, info );
+	NifStream( unknownShort3, in, info );
+	NifStream( fileName, in, info );
+	NifStream( unknownInt5, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void SkyShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Write( out, link_map, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownInt4, out, info );
+	NifStream( unknownShort3, out, info );
+	NifStream( fileName, out, info );
+	NifStream( unknownInt5, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string SkyShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiProperty::asString();
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	out << "  Unknown Short 2:  " << unknownShort2 << endl;
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Int 4:  " << unknownInt4 << endl;
+	out << "  Unknown Short 3:  " << unknownShort3 << endl;
+	out << "  File Name:  " << fileName << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void SkyShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> SkyShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/TallGrassShaderProperty.cpp b/src/obj/TallGrassShaderProperty.cpp
new file mode 100644
index 00000000..975dbf6d
--- /dev/null
+++ b/src/obj/TallGrassShaderProperty.cpp
@@ -0,0 +1,117 @@
+/* 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/TallGrassShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type TallGrassShaderProperty::TYPE("TallGrassShaderProperty", &NiShadeProperty::TYPE );
+
+TallGrassShaderProperty::TallGrassShaderProperty() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownFloat1((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+TallGrassShaderProperty::~TallGrassShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & TallGrassShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * TallGrassShaderProperty::Create() {
+	return new TallGrassShaderProperty;
+}
+
+void TallGrassShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( fileName, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void TallGrassShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( fileName, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string TallGrassShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  File Name:  " << fileName << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void TallGrassShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> TallGrassShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/TileShaderProperty.cpp b/src/obj/TileShaderProperty.cpp
new file mode 100644
index 00000000..e42d9f55
--- /dev/null
+++ b/src/obj/TileShaderProperty.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/TileShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type TileShaderProperty::TYPE("TileShaderProperty", &NiShadeProperty::TYPE );
+
+TileShaderProperty::TileShaderProperty() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownFloat1(0.0f), unknownInt5((int)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+TileShaderProperty::~TileShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & TileShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * TileShaderProperty::Create() {
+	return new TileShaderProperty;
+}
+
+void TileShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt5, in, info );
+	NifStream( fileName, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void TileShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt5, out, info );
+	NifStream( fileName, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string TileShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Int 5:  " << unknownInt5 << endl;
+	out << "  File Name:  " << fileName << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void TileShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> TileShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/VolumetricFogShaderProperty.cpp b/src/obj/VolumetricFogShaderProperty.cpp
new file mode 100644
index 00000000..e801073a
--- /dev/null
+++ b/src/obj/VolumetricFogShaderProperty.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/VolumetricFogShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type VolumetricFogShaderProperty::TYPE("VolumetricFogShaderProperty", &NiShadeProperty::TYPE );
+
+VolumetricFogShaderProperty::VolumetricFogShaderProperty() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+VolumetricFogShaderProperty::~VolumetricFogShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & VolumetricFogShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * VolumetricFogShaderProperty::Create() {
+	return new VolumetricFogShaderProperty;
+}
+
+void VolumetricFogShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Read( in, link_stack, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void VolumetricFogShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::Write( out, link_map, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string VolumetricFogShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiShadeProperty::asString();
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void VolumetricFogShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiShadeProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> VolumetricFogShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiShadeProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/WaterShaderProperty.cpp b/src/obj/WaterShaderProperty.cpp
new file mode 100644
index 00000000..c2bea898
--- /dev/null
+++ b/src/obj/WaterShaderProperty.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/WaterShaderProperty.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type WaterShaderProperty::TYPE("WaterShaderProperty", &NiProperty::TYPE );
+
+WaterShaderProperty::WaterShaderProperty() : unknownShort1((short)0), unknownInt1((int)0), unknownShort2((short)0), unknownUshort1((unsigned short)0), unknownInt2((int)0), unknownFloat1(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+WaterShaderProperty::~WaterShaderProperty() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & WaterShaderProperty::GetType() const {
+	return TYPE;
+}
+
+NiObject * WaterShaderProperty::Create() {
+	return new WaterShaderProperty;
+}
+
+void WaterShaderProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Read( in, link_stack, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownUshort1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownFloat1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void WaterShaderProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::Write( out, link_map, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownUshort1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownFloat1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string WaterShaderProperty::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << NiProperty::asString();
+	out << "  Unknown Short 1:  " << unknownShort1 << endl;
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Short 2:  " << unknownShort2 << endl;
+	out << "  Unknown ushort 1:  " << unknownUshort1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void WaterShaderProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	NiProperty::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> WaterShaderProperty::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = NiProperty::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkAabbPhantom.cpp b/src/obj/bhkAabbPhantom.cpp
new file mode 100644
index 00000000..ca4869b6
--- /dev/null
+++ b/src/obj/bhkAabbPhantom.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/bhkAabbPhantom.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type bhkAabbPhantom::TYPE("bhkAabbPhantom", &bhkShapePhantom::TYPE );
+
+bhkAabbPhantom::bhkAabbPhantom() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+bhkAabbPhantom::~bhkAabbPhantom() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & bhkAabbPhantom::GetType() const {
+	return TYPE;
+}
+
+NiObject * bhkAabbPhantom::Create() {
+	return new bhkAabbPhantom;
+}
+
+void bhkAabbPhantom::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkShapePhantom::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 15; i1++) {
+		NifStream( unknownInts1[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkAabbPhantom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkShapePhantom::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < 15; i1++) {
+		NifStream( unknownInts1[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string bhkAabbPhantom::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << bhkShapePhantom::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 15; 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++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkAabbPhantom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkShapePhantom::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> bhkAabbPhantom::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = bhkShapePhantom::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkBreakableConstraint.cpp b/src/obj/bhkBreakableConstraint.cpp
new file mode 100644
index 00000000..c9c81171
--- /dev/null
+++ b/src/obj/bhkBreakableConstraint.cpp
@@ -0,0 +1,123 @@
+/* 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/bhkBreakableConstraint.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type bhkBreakableConstraint::TYPE("bhkBreakableConstraint", &bhkConstraint::TYPE );
+
+bhkBreakableConstraint::bhkBreakableConstraint() : unknownShort1((short)0) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+bhkBreakableConstraint::~bhkBreakableConstraint() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & bhkBreakableConstraint::GetType() const {
+	return TYPE;
+}
+
+NiObject * bhkBreakableConstraint::Create() {
+	return new bhkBreakableConstraint;
+}
+
+void bhkBreakableConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkConstraint::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 41; i1++) {
+		NifStream( unknownInts1[i1], in, info );
+	};
+	NifStream( unknownShort1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkBreakableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkConstraint::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < 41; i1++) {
+		NifStream( unknownInts1[i1], out, info );
+	};
+	NifStream( unknownShort1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string bhkBreakableConstraint::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << bhkConstraint::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 41; 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 Short 1:  " << unknownShort1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkBreakableConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkConstraint::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> bhkBreakableConstraint::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = bhkConstraint::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkConvexListShape.cpp b/src/obj/bhkConvexListShape.cpp
new file mode 100644
index 00000000..3215c6ff
--- /dev/null
+++ b/src/obj/bhkConvexListShape.cpp
@@ -0,0 +1,171 @@
+/* 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/bhkConvexListShape.h"
+#include "../../include/obj/bhkShape.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type bhkConvexListShape::TYPE("bhkConvexListShape", &bhkShape::TYPE );
+
+bhkConvexListShape::bhkConvexListShape() : numSubShapes((unsigned int)0), unknownByte1((byte)0), unknownFloat1(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+bhkConvexListShape::~bhkConvexListShape() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & bhkConvexListShape::GetType() const {
+	return TYPE;
+}
+
+NiObject * bhkConvexListShape::Create() {
+	return new bhkConvexListShape;
+}
+
+void bhkConvexListShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	unsigned int block_num;
+	bhkShape::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, info );
+		link_stack.push_back( block_num );
+	};
+	NifStream( material, in, info );
+	for (unsigned int i1 = 0; i1 < 6; i1++) {
+		NifStream( unknownFloats[i1], in, info );
+	};
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownFloat1, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkConvexListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkShape::Write( out, link_map, info );
+	numSubShapes = (unsigned int)(subShapes.size());
+	NifStream( numSubShapes, out, info );
+	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
+		if ( info.version < VER_3_3_0_13 ) {
+			NifStream( (unsigned int)&(*subShapes[i1]), out, info );
+		} else {
+			if ( subShapes[i1] != NULL ) {
+				NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, info );
+			} else {
+				NifStream( 0xFFFFFFFF, out, info );
+			}
+		}
+	};
+	NifStream( material, out, info );
+	for (unsigned int i1 = 0; i1 < 6; i1++) {
+		NifStream( unknownFloats[i1], out, info );
+	};
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownFloat1, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string bhkConvexListShape::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << bhkShape::asString();
+	numSubShapes = (unsigned int)(subShapes.size());
+	out << "  Num Sub Shapes:  " << numSubShapes << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < subShapes.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 << "    Sub Shapes[" << i1 << "]:  " << subShapes[i1] << endl;
+		array_output_count++;
+	};
+	out << "  Material:  " << material << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 6; 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++;
+	};
+	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkConvexListShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkShape::FixLinks( objects, link_stack, info );
+	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
+		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, info );
+	};
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> bhkConvexListShape::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = bhkShape::GetRefs();
+	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
+		if ( subShapes[i1] != NULL )
+			refs.push_back(StaticCast<NiObject>(subShapes[i1]));
+	};
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkHingeConstraint.cpp b/src/obj/bhkHingeConstraint.cpp
index 37e4695d..dcf1f940 100644
--- a/src/obj/bhkHingeConstraint.cpp
+++ b/src/obj/bhkHingeConstraint.cpp
@@ -14,12 +14,13 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/bhkHingeConstraint.h"
+#include "../../include/gen/HingeDescriptor.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
 const Type bhkHingeConstraint::TYPE("bhkHingeConstraint", &bhkConstraint::TYPE );
 
-bhkHingeConstraint::bhkHingeConstraint() {
+bhkHingeConstraint::bhkHingeConstraint() : unknownFloat1(0.0f), unknownByte1((byte)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -42,11 +43,30 @@ void bhkHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, con
 	//--END CUSTOM CODE--//
 
 	bhkConstraint::Read( in, link_stack, info );
-	NifStream( pivotA, in, info );
-	NifStream( perp2AxleInA1, in, info );
-	NifStream( perp2AxleInA2, in, info );
-	NifStream( pivotB, in, info );
-	NifStream( axleB, in, info );
+	NifStream( hinge.pivotA, in, info );
+	NifStream( hinge.perp2AxleInA1, in, info );
+	NifStream( hinge.perp2AxleInA2, in, info );
+	NifStream( hinge.pivotB, in, info );
+	NifStream( hinge.axleB, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( hinge.unknownFloat1, in, info );
+		NifStream( hinge.unknownInt2, in, info );
+		NifStream( hinge.unknownInt3, in, info );
+		NifStream( hinge.unknownInt4, in, info );
+		NifStream( hinge.unknownInt5, in, info );
+		NifStream( hinge.unknownInt6, in, info );
+		NifStream( hinge.unknownInt7, in, info );
+		NifStream( hinge.unknownInt8, in, info );
+		NifStream( hinge.unknownInt9, in, info );
+		NifStream( hinge.unknownInt10, in, info );
+		NifStream( hinge.unknownByte1, in, info );
+		NifStream( hinge.unknownByte2, in, info );
+		NifStream( hinge.unknownByte3, in, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, in, info );
+		NifStream( unknownByte1, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -57,11 +77,30 @@ void bhkHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int
 	//--END CUSTOM CODE--//
 
 	bhkConstraint::Write( out, link_map, info );
-	NifStream( pivotA, out, info );
-	NifStream( perp2AxleInA1, out, info );
-	NifStream( perp2AxleInA2, out, info );
-	NifStream( pivotB, out, info );
-	NifStream( axleB, out, info );
+	NifStream( hinge.pivotA, out, info );
+	NifStream( hinge.perp2AxleInA1, out, info );
+	NifStream( hinge.perp2AxleInA2, out, info );
+	NifStream( hinge.pivotB, out, info );
+	NifStream( hinge.axleB, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( hinge.unknownFloat1, out, info );
+		NifStream( hinge.unknownInt2, out, info );
+		NifStream( hinge.unknownInt3, out, info );
+		NifStream( hinge.unknownInt4, out, info );
+		NifStream( hinge.unknownInt5, out, info );
+		NifStream( hinge.unknownInt6, out, info );
+		NifStream( hinge.unknownInt7, out, info );
+		NifStream( hinge.unknownInt8, out, info );
+		NifStream( hinge.unknownInt9, out, info );
+		NifStream( hinge.unknownInt10, out, info );
+		NifStream( hinge.unknownByte1, out, info );
+		NifStream( hinge.unknownByte2, out, info );
+		NifStream( hinge.unknownByte3, out, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, out, info );
+		NifStream( unknownByte1, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -74,11 +113,26 @@ std::string bhkHingeConstraint::asString( bool verbose ) const {
 	stringstream out;
 	unsigned int array_output_count = 0;
 	out << bhkConstraint::asString();
-	out << "  Pivot A:  " << pivotA << endl;
-	out << "  Perp2 Axle In A1:  " << perp2AxleInA1 << endl;
-	out << "  Perp2 Axle In A2:  " << perp2AxleInA2 << endl;
-	out << "  Pivot B:  " << pivotB << endl;
-	out << "  Axle B:  " << axleB << endl;
+	out << "  Pivot A:  " << hinge.pivotA << endl;
+	out << "  Perp2 Axle In A1:  " << hinge.perp2AxleInA1 << endl;
+	out << "  Perp2 Axle In A2:  " << hinge.perp2AxleInA2 << endl;
+	out << "  Pivot B:  " << hinge.pivotB << endl;
+	out << "  Axle B:  " << hinge.axleB << endl;
+	out << "  Unknown Float 1:  " << hinge.unknownFloat1 << endl;
+	out << "  Unknown Int 2:  " << hinge.unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << hinge.unknownInt3 << endl;
+	out << "  Unknown Int 4:  " << hinge.unknownInt4 << endl;
+	out << "  Unknown Int 5:  " << hinge.unknownInt5 << endl;
+	out << "  Unknown Int 6:  " << hinge.unknownInt6 << endl;
+	out << "  Unknown Int 7:  " << hinge.unknownInt7 << endl;
+	out << "  Unknown Int 8:  " << hinge.unknownInt8 << endl;
+	out << "  Unknown Int 9:  " << hinge.unknownInt9 << endl;
+	out << "  Unknown Int 10:  " << hinge.unknownInt10 << endl;
+	out << "  Unknown Byte 1:  " << hinge.unknownByte1 << endl;
+	out << "  Unknown Byte 2:  " << hinge.unknownByte2 << endl;
+	out << "  Unknown Byte 3:  " << hinge.unknownByte3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/bhkLimitedHingeConstraint.cpp b/src/obj/bhkLimitedHingeConstraint.cpp
index cbb10617..c251a27f 100644
--- a/src/obj/bhkLimitedHingeConstraint.cpp
+++ b/src/obj/bhkLimitedHingeConstraint.cpp
@@ -20,7 +20,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type bhkLimitedHingeConstraint::TYPE("bhkLimitedHingeConstraint", &bhkConstraint::TYPE );
 
-bhkLimitedHingeConstraint::bhkLimitedHingeConstraint() {
+bhkLimitedHingeConstraint::bhkLimitedHingeConstraint() : unknownFloat1(0.0f), isDeathPose((byte)0), unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownInt4((int)0), unknownInt5((int)0), unknownInt6((int)0), unknownByte1((byte)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -53,6 +53,24 @@ void bhkLimitedHingeConstraint::Read( istream& in, list<unsigned int> & link_sta
 	NifStream( limitedHinge.minAngle, in, info );
 	NifStream( limitedHinge.maxAngle, in, info );
 	NifStream( limitedHinge.maxFriction, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( limitedHinge.unknownFloat1, in, info );
+		NifStream( limitedHinge.unknownFloat2, in, info );
+		NifStream( limitedHinge.unknownFloat3, in, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, in, info );
+		NifStream( isDeathPose, in, info );
+		if ( isDeathPose ) {
+			NifStream( unknownInt1, in, info );
+			NifStream( unknownInt2, in, info );
+			NifStream( unknownInt3, in, info );
+			NifStream( unknownInt4, in, info );
+			NifStream( unknownInt5, in, info );
+			NifStream( unknownInt6, in, info );
+			NifStream( unknownByte1, in, info );
+		};
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -73,6 +91,24 @@ void bhkLimitedHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsig
 	NifStream( limitedHinge.minAngle, out, info );
 	NifStream( limitedHinge.maxAngle, out, info );
 	NifStream( limitedHinge.maxFriction, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( limitedHinge.unknownFloat1, out, info );
+		NifStream( limitedHinge.unknownFloat2, out, info );
+		NifStream( limitedHinge.unknownFloat3, out, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, out, info );
+		NifStream( isDeathPose, out, info );
+		if ( isDeathPose ) {
+			NifStream( unknownInt1, out, info );
+			NifStream( unknownInt2, out, info );
+			NifStream( unknownInt3, out, info );
+			NifStream( unknownInt4, out, info );
+			NifStream( unknownInt5, out, info );
+			NifStream( unknownInt6, out, info );
+			NifStream( unknownByte1, out, info );
+		};
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -95,6 +131,20 @@ std::string bhkLimitedHingeConstraint::asString( bool verbose ) const {
 	out << "  Min Angle:  " << limitedHinge.minAngle << endl;
 	out << "  Max Angle:  " << limitedHinge.maxAngle << endl;
 	out << "  Max Friction:  " << limitedHinge.maxFriction << endl;
+	out << "  Unknown Float 1:  " << limitedHinge.unknownFloat1 << endl;
+	out << "  Unknown Float 2:  " << limitedHinge.unknownFloat2 << endl;
+	out << "  Unknown Float 3:  " << limitedHinge.unknownFloat3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Is Death Pose:  " << isDeathPose << endl;
+	if ( isDeathPose ) {
+		out << "    Unknown Int 1:  " << unknownInt1 << endl;
+		out << "    Unknown Int 2:  " << unknownInt2 << endl;
+		out << "    Unknown Int 3:  " << unknownInt3 << endl;
+		out << "    Unknown Int 4:  " << unknownInt4 << endl;
+		out << "    Unknown Int 5:  " << unknownInt5 << endl;
+		out << "    Unknown Int 6:  " << unknownInt6 << endl;
+		out << "    Unknown Byte 1:  " << unknownByte1 << endl;
+	};
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/bhkLiquidAction.cpp b/src/obj/bhkLiquidAction.cpp
new file mode 100644
index 00000000..3bbc3832
--- /dev/null
+++ b/src/obj/bhkLiquidAction.cpp
@@ -0,0 +1,123 @@
+/* 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/bhkLiquidAction.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type bhkLiquidAction::TYPE("bhkLiquidAction", &bhkSerializable::TYPE );
+
+bhkLiquidAction::bhkLiquidAction() : unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownFloat1(0.0f), unknownFloat2(0.0f), unknownFloat3(0.0f), unknownFloat4(0.0f) {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+bhkLiquidAction::~bhkLiquidAction() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & bhkLiquidAction::GetType() const {
+	return TYPE;
+}
+
+NiObject * bhkLiquidAction::Create() {
+	return new bhkLiquidAction;
+}
+
+void bhkLiquidAction::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkLiquidAction::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::Write( out, link_map, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string bhkLiquidAction::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << bhkSerializable::asString();
+	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	out << "  Unknown Int 2:  " << unknownInt2 << endl;
+	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
+	out << "  Unknown Float 3:  " << unknownFloat3 << endl;
+	out << "  Unknown Float 4:  " << unknownFloat4 << endl;
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkLiquidAction::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> bhkLiquidAction::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = bhkSerializable::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkMalleableConstraint.cpp b/src/obj/bhkMalleableConstraint.cpp
index 407be4a6..608ce26e 100644
--- a/src/obj/bhkMalleableConstraint.cpp
+++ b/src/obj/bhkMalleableConstraint.cpp
@@ -14,6 +14,7 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/ObjectRegistry.h"
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/bhkMalleableConstraint.h"
+#include "../../include/gen/HingeDescriptor.h"
 #include "../../include/gen/RagdollDescriptor.h"
 #include "../../include/gen/LimitedHingeDescriptor.h"
 #include "../../include/obj/NiObject.h"
@@ -22,7 +23,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type bhkMalleableConstraint::TYPE("bhkMalleableConstraint", &bhkConstraint::TYPE );
 
-bhkMalleableConstraint::bhkMalleableConstraint() : type((unsigned int)0), unknownInt2((unsigned int)0), unknownLink1(NULL), unknownLink2(NULL), unknownInt3((unsigned int)0), tau(0.0f), damping(0.0f) {
+bhkMalleableConstraint::bhkMalleableConstraint() : type((unsigned int)0), unknownInt2((unsigned int)0), unknownLink1(NULL), unknownLink2(NULL), unknownInt3((unsigned int)0), tau(0.0f), unknownByte1((byte)0), damping(0.0f) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -53,6 +54,28 @@ void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack,
 	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 	NifStream( unknownInt3, in, info );
+	if ( (type == 1) ) {
+		NifStream( hinge.pivotA, in, info );
+		NifStream( hinge.perp2AxleInA1, in, info );
+		NifStream( hinge.perp2AxleInA2, in, info );
+		NifStream( hinge.pivotB, in, info );
+		NifStream( hinge.axleB, in, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( hinge.unknownFloat1, in, info );
+			NifStream( hinge.unknownInt2, in, info );
+			NifStream( hinge.unknownInt3, in, info );
+			NifStream( hinge.unknownInt4, in, info );
+			NifStream( hinge.unknownInt5, in, info );
+			NifStream( hinge.unknownInt6, in, info );
+			NifStream( hinge.unknownInt7, in, info );
+			NifStream( hinge.unknownInt8, in, info );
+			NifStream( hinge.unknownInt9, in, info );
+			NifStream( hinge.unknownInt10, in, info );
+			NifStream( hinge.unknownByte1, in, info );
+			NifStream( hinge.unknownByte2, in, info );
+			NifStream( hinge.unknownByte3, in, info );
+		};
+	};
 	if ( (type == 7) ) {
 		NifStream( ragdoll.pivotA, in, info );
 		NifStream( ragdoll.planeA, in, info );
@@ -66,6 +89,15 @@ void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack,
 		NifStream( ragdoll.twistMinAngle, in, info );
 		NifStream( ragdoll.twistMaxAngle, in, info );
 		NifStream( ragdoll.maxFriction, in, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( ragdoll.unknownFloat1, in, info );
+			NifStream( ragdoll.unknownFloat2, in, info );
+			NifStream( ragdoll.unknownFloat3, in, info );
+			NifStream( ragdoll.unknownFloat4, in, info );
+			NifStream( ragdoll.unknownFloat5, in, info );
+			NifStream( ragdoll.unknownFloat6, in, info );
+			NifStream( ragdoll.unknownFloat7, in, info );
+		};
 	};
 	if ( (type == 2) ) {
 		NifStream( limitedHinge.pivotA, in, info );
@@ -78,8 +110,16 @@ void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack,
 		NifStream( limitedHinge.minAngle, in, info );
 		NifStream( limitedHinge.maxAngle, in, info );
 		NifStream( limitedHinge.maxFriction, in, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( limitedHinge.unknownFloat1, in, info );
+			NifStream( limitedHinge.unknownFloat2, in, info );
+			NifStream( limitedHinge.unknownFloat3, in, info );
+		};
 	};
 	NifStream( tau, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, in, info );
+	};
 	NifStream( damping, in, info );
 
 	//--BEGIN POST-READ CUSTOM CODE--//
@@ -112,6 +152,28 @@ void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 		}
 	}
 	NifStream( unknownInt3, out, info );
+	if ( (type == 1) ) {
+		NifStream( hinge.pivotA, out, info );
+		NifStream( hinge.perp2AxleInA1, out, info );
+		NifStream( hinge.perp2AxleInA2, out, info );
+		NifStream( hinge.pivotB, out, info );
+		NifStream( hinge.axleB, out, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( hinge.unknownFloat1, out, info );
+			NifStream( hinge.unknownInt2, out, info );
+			NifStream( hinge.unknownInt3, out, info );
+			NifStream( hinge.unknownInt4, out, info );
+			NifStream( hinge.unknownInt5, out, info );
+			NifStream( hinge.unknownInt6, out, info );
+			NifStream( hinge.unknownInt7, out, info );
+			NifStream( hinge.unknownInt8, out, info );
+			NifStream( hinge.unknownInt9, out, info );
+			NifStream( hinge.unknownInt10, out, info );
+			NifStream( hinge.unknownByte1, out, info );
+			NifStream( hinge.unknownByte2, out, info );
+			NifStream( hinge.unknownByte3, out, info );
+		};
+	};
 	if ( (type == 7) ) {
 		NifStream( ragdoll.pivotA, out, info );
 		NifStream( ragdoll.planeA, out, info );
@@ -125,6 +187,15 @@ void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 		NifStream( ragdoll.twistMinAngle, out, info );
 		NifStream( ragdoll.twistMaxAngle, out, info );
 		NifStream( ragdoll.maxFriction, out, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( ragdoll.unknownFloat1, out, info );
+			NifStream( ragdoll.unknownFloat2, out, info );
+			NifStream( ragdoll.unknownFloat3, out, info );
+			NifStream( ragdoll.unknownFloat4, out, info );
+			NifStream( ragdoll.unknownFloat5, out, info );
+			NifStream( ragdoll.unknownFloat6, out, info );
+			NifStream( ragdoll.unknownFloat7, out, info );
+		};
 	};
 	if ( (type == 2) ) {
 		NifStream( limitedHinge.pivotA, out, info );
@@ -137,8 +208,16 @@ void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 		NifStream( limitedHinge.minAngle, out, info );
 		NifStream( limitedHinge.maxAngle, out, info );
 		NifStream( limitedHinge.maxFriction, out, info );
+		if ( info.version >= 0x14020007 ) {
+			NifStream( limitedHinge.unknownFloat1, out, info );
+			NifStream( limitedHinge.unknownFloat2, out, info );
+			NifStream( limitedHinge.unknownFloat3, out, info );
+		};
 	};
 	NifStream( tau, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, out, info );
+	};
 	NifStream( damping, out, info );
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
@@ -157,6 +236,26 @@ std::string bhkMalleableConstraint::asString( bool verbose ) const {
 	out << "  Unknown Link 1:  " << unknownLink1 << endl;
 	out << "  Unknown Link 2:  " << unknownLink2 << endl;
 	out << "  Unknown Int 3:  " << unknownInt3 << endl;
+	if ( (type == 1) ) {
+		out << "    Pivot A:  " << hinge.pivotA << endl;
+		out << "    Perp2 Axle In A1:  " << hinge.perp2AxleInA1 << endl;
+		out << "    Perp2 Axle In A2:  " << hinge.perp2AxleInA2 << endl;
+		out << "    Pivot B:  " << hinge.pivotB << endl;
+		out << "    Axle B:  " << hinge.axleB << endl;
+		out << "    Unknown Float 1:  " << hinge.unknownFloat1 << endl;
+		out << "    Unknown Int 2:  " << hinge.unknownInt2 << endl;
+		out << "    Unknown Int 3:  " << hinge.unknownInt3 << endl;
+		out << "    Unknown Int 4:  " << hinge.unknownInt4 << endl;
+		out << "    Unknown Int 5:  " << hinge.unknownInt5 << endl;
+		out << "    Unknown Int 6:  " << hinge.unknownInt6 << endl;
+		out << "    Unknown Int 7:  " << hinge.unknownInt7 << endl;
+		out << "    Unknown Int 8:  " << hinge.unknownInt8 << endl;
+		out << "    Unknown Int 9:  " << hinge.unknownInt9 << endl;
+		out << "    Unknown Int 10:  " << hinge.unknownInt10 << endl;
+		out << "    Unknown Byte 1:  " << hinge.unknownByte1 << endl;
+		out << "    Unknown Byte 2:  " << hinge.unknownByte2 << endl;
+		out << "    Unknown Byte 3:  " << hinge.unknownByte3 << endl;
+	};
 	if ( (type == 7) ) {
 		out << "    Pivot A:  " << ragdoll.pivotA << endl;
 		out << "    Plane A:  " << ragdoll.planeA << endl;
@@ -170,6 +269,13 @@ std::string bhkMalleableConstraint::asString( bool verbose ) const {
 		out << "    Twist Min Angle:  " << ragdoll.twistMinAngle << endl;
 		out << "    Twist Max Angle:  " << ragdoll.twistMaxAngle << endl;
 		out << "    Max Friction:  " << ragdoll.maxFriction << endl;
+		out << "    Unknown Float 1:  " << ragdoll.unknownFloat1 << endl;
+		out << "    Unknown Float 2:  " << ragdoll.unknownFloat2 << endl;
+		out << "    Unknown Float 3:  " << ragdoll.unknownFloat3 << endl;
+		out << "    Unknown Float 4:  " << ragdoll.unknownFloat4 << endl;
+		out << "    Unknown Float 5:  " << ragdoll.unknownFloat5 << endl;
+		out << "    Unknown Float 6:  " << ragdoll.unknownFloat6 << endl;
+		out << "    Unknown Float 7:  " << ragdoll.unknownFloat7 << endl;
 	};
 	if ( (type == 2) ) {
 		out << "    Pivot A:  " << limitedHinge.pivotA << endl;
@@ -182,8 +288,12 @@ std::string bhkMalleableConstraint::asString( bool verbose ) const {
 		out << "    Min Angle:  " << limitedHinge.minAngle << endl;
 		out << "    Max Angle:  " << limitedHinge.maxAngle << endl;
 		out << "    Max Friction:  " << limitedHinge.maxFriction << endl;
+		out << "    Unknown Float 1:  " << limitedHinge.unknownFloat1 << endl;
+		out << "    Unknown Float 2:  " << limitedHinge.unknownFloat2 << endl;
+		out << "    Unknown Float 3:  " << limitedHinge.unknownFloat3 << endl;
 	};
 	out << "  Tau:  " << tau << endl;
+	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
 	out << "  Damping:  " << damping << endl;
 	return out.str();
 
diff --git a/src/obj/bhkOrientHingedBodyAction.cpp b/src/obj/bhkOrientHingedBodyAction.cpp
new file mode 100644
index 00000000..2132ca0a
--- /dev/null
+++ b/src/obj/bhkOrientHingedBodyAction.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/bhkOrientHingedBodyAction.h"
+using namespace Niflib;
+
+//Definition of TYPE constant
+const Type bhkOrientHingedBodyAction::TYPE("bhkOrientHingedBodyAction", &bhkSerializable::TYPE );
+
+bhkOrientHingedBodyAction::bhkOrientHingedBodyAction() {
+	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+bhkOrientHingedBodyAction::~bhkOrientHingedBodyAction() {
+	//--BEGIN DESTRUCTOR CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+const Type & bhkOrientHingedBodyAction::GetType() const {
+	return TYPE;
+}
+
+NiObject * bhkOrientHingedBodyAction::Create() {
+	return new bhkOrientHingedBodyAction;
+}
+
+void bhkOrientHingedBodyAction::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::Read( in, link_stack, info );
+	for (unsigned int i1 = 0; i1 < 17; i1++) {
+		NifStream( unknownInts1[i1], in, info );
+	};
+
+	//--BEGIN POST-READ CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkOrientHingedBodyAction::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	//--BEGIN PRE-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::Write( out, link_map, info );
+	for (unsigned int i1 = 0; i1 < 17; i1++) {
+		NifStream( unknownInts1[i1], out, info );
+	};
+
+	//--BEGIN POST-WRITE CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::string bhkOrientHingedBodyAction::asString( bool verbose ) const {
+	//--BEGIN PRE-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	stringstream out;
+	unsigned int array_output_count = 0;
+	out << bhkSerializable::asString();
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < 17; 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++;
+	};
+	return out.str();
+
+	//--BEGIN POST-STRING CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+void bhkOrientHingedBodyAction::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	//--BEGIN PRE-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+
+	bhkSerializable::FixLinks( objects, link_stack, info );
+
+	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
+
+	//--END CUSTOM CODE--//
+}
+
+std::list<NiObjectRef> bhkOrientHingedBodyAction::GetRefs() const {
+	list<Ref<NiObject> > refs;
+	refs = bhkSerializable::GetRefs();
+	return refs;
+}
+
+//--BEGIN MISC CUSTOM CODE--//
+
+//--END CUSTOM CODE--//
diff --git a/src/obj/bhkPackedNiTriStripsShape.cpp b/src/obj/bhkPackedNiTriStripsShape.cpp
index 5c6fc614..ac27f6ce 100644
--- a/src/obj/bhkPackedNiTriStripsShape.cpp
+++ b/src/obj/bhkPackedNiTriStripsShape.cpp
@@ -46,14 +46,16 @@ void bhkPackedNiTriStripsShape::Read( istream& in, list<unsigned int> & link_sta
 
 	unsigned int block_num;
 	bhkShapeCollection::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, info );
-		NifStream( subShapes[i1].colFilter, in, info );
-		NifStream( subShapes[i1].wieldingType_, in, info );
-		NifStream( subShapes[i1].numVertices, in, info );
-		NifStream( subShapes[i1].material, in, info );
+	if ( info.version <= 0x14000005 ) {
+		NifStream( numSubShapes, in, info );
+		subShapes.resize(numSubShapes);
+		for (unsigned int i2 = 0; i2 < subShapes.size(); i2++) {
+			NifStream( subShapes[i2].layer, in, info );
+			NifStream( subShapes[i2].colFilter, in, info );
+			NifStream( subShapes[i2].wieldingType_, in, info );
+			NifStream( subShapes[i2].numVertices, in, info );
+			NifStream( subShapes[i2].material, in, info );
+		};
 	};
 	NifStream( unknownInt1, in, info );
 	NifStream( unknownInt2, in, info );
@@ -77,13 +79,15 @@ void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsig
 
 	bhkShapeCollection::Write( out, link_map, info );
 	numSubShapes = (unsigned short)(subShapes.size());
-	NifStream( numSubShapes, out, info );
-	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( subShapes[i1].layer, out, info );
-		NifStream( subShapes[i1].colFilter, out, info );
-		NifStream( subShapes[i1].wieldingType_, out, info );
-		NifStream( subShapes[i1].numVertices, out, info );
-		NifStream( subShapes[i1].material, out, info );
+	if ( info.version <= 0x14000005 ) {
+		NifStream( numSubShapes, out, info );
+		for (unsigned int i2 = 0; i2 < subShapes.size(); i2++) {
+			NifStream( subShapes[i2].layer, out, info );
+			NifStream( subShapes[i2].colFilter, out, info );
+			NifStream( subShapes[i2].wieldingType_, out, info );
+			NifStream( subShapes[i2].numVertices, out, info );
+			NifStream( subShapes[i2].material, out, info );
+		};
 	};
 	NifStream( unknownInt1, out, info );
 	NifStream( unknownInt2, out, info );
diff --git a/src/obj/bhkPrismaticConstraint.cpp b/src/obj/bhkPrismaticConstraint.cpp
index 8eb7430e..03d54284 100644
--- a/src/obj/bhkPrismaticConstraint.cpp
+++ b/src/obj/bhkPrismaticConstraint.cpp
@@ -19,7 +19,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type bhkPrismaticConstraint::TYPE("bhkPrismaticConstraint", &bhkConstraint::TYPE );
 
-bhkPrismaticConstraint::bhkPrismaticConstraint() : minDistance(0.0f), maxDistance(0.0f), friction(0.0f) {
+bhkPrismaticConstraint::bhkPrismaticConstraint() : minDistance(0.0f), maxDistance(0.0f), friction(0.0f), unknownByte1((byte)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -52,6 +52,9 @@ void bhkPrismaticConstraint::Read( istream& in, list<unsigned int> & link_stack,
 	NifStream( minDistance, in, info );
 	NifStream( maxDistance, in, info );
 	NifStream( friction, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, in, info );
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -72,6 +75,9 @@ void bhkPrismaticConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( minDistance, out, info );
 	NifStream( maxDistance, out, info );
 	NifStream( friction, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, out, info );
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -103,6 +109,7 @@ std::string bhkPrismaticConstraint::asString( bool verbose ) const {
 	out << "  Min Distance:  " << minDistance << endl;
 	out << "  Max Distance:  " << maxDistance << endl;
 	out << "  Friction:  " << friction << endl;
+	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/bhkRagdollConstraint.cpp b/src/obj/bhkRagdollConstraint.cpp
index d9fcdd08..711f7905 100644
--- a/src/obj/bhkRagdollConstraint.cpp
+++ b/src/obj/bhkRagdollConstraint.cpp
@@ -20,7 +20,7 @@ using namespace Niflib;
 //Definition of TYPE constant
 const Type bhkRagdollConstraint::TYPE("bhkRagdollConstraint", &bhkConstraint::TYPE );
 
-bhkRagdollConstraint::bhkRagdollConstraint() {
+bhkRagdollConstraint::bhkRagdollConstraint() : unknownFloat1(0.0f), isDeathPose((byte)0), unknownInt1((int)0), unknownInt2((int)0), unknownInt3((int)0), unknownInt4((int)0), unknownInt5((int)0), unknownInt6((int)0), unknownByte1((byte)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -55,6 +55,28 @@ void bhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, c
 	NifStream( ragdoll.twistMinAngle, in, info );
 	NifStream( ragdoll.twistMaxAngle, in, info );
 	NifStream( ragdoll.maxFriction, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( ragdoll.unknownFloat1, in, info );
+		NifStream( ragdoll.unknownFloat2, in, info );
+		NifStream( ragdoll.unknownFloat3, in, info );
+		NifStream( ragdoll.unknownFloat4, in, info );
+		NifStream( ragdoll.unknownFloat5, in, info );
+		NifStream( ragdoll.unknownFloat6, in, info );
+		NifStream( ragdoll.unknownFloat7, in, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, in, info );
+		NifStream( isDeathPose, in, info );
+		if ( isDeathPose ) {
+			NifStream( unknownInt1, in, info );
+			NifStream( unknownInt2, in, info );
+			NifStream( unknownInt3, in, info );
+			NifStream( unknownInt4, in, info );
+			NifStream( unknownInt5, in, info );
+			NifStream( unknownInt6, in, info );
+			NifStream( unknownByte1, in, info );
+		};
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -77,6 +99,28 @@ void bhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NifStream( ragdoll.twistMinAngle, out, info );
 	NifStream( ragdoll.twistMaxAngle, out, info );
 	NifStream( ragdoll.maxFriction, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( ragdoll.unknownFloat1, out, info );
+		NifStream( ragdoll.unknownFloat2, out, info );
+		NifStream( ragdoll.unknownFloat3, out, info );
+		NifStream( ragdoll.unknownFloat4, out, info );
+		NifStream( ragdoll.unknownFloat5, out, info );
+		NifStream( ragdoll.unknownFloat6, out, info );
+		NifStream( ragdoll.unknownFloat7, out, info );
+	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownFloat1, out, info );
+		NifStream( isDeathPose, out, info );
+		if ( isDeathPose ) {
+			NifStream( unknownInt1, out, info );
+			NifStream( unknownInt2, out, info );
+			NifStream( unknownInt3, out, info );
+			NifStream( unknownInt4, out, info );
+			NifStream( unknownInt5, out, info );
+			NifStream( unknownInt6, out, info );
+			NifStream( unknownByte1, out, info );
+		};
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -101,6 +145,24 @@ std::string bhkRagdollConstraint::asString( bool verbose ) const {
 	out << "  Twist Min Angle:  " << ragdoll.twistMinAngle << endl;
 	out << "  Twist Max Angle:  " << ragdoll.twistMaxAngle << endl;
 	out << "  Max Friction:  " << ragdoll.maxFriction << endl;
+	out << "  Unknown Float 1:  " << ragdoll.unknownFloat1 << endl;
+	out << "  Unknown Float 2:  " << ragdoll.unknownFloat2 << endl;
+	out << "  Unknown Float 3:  " << ragdoll.unknownFloat3 << endl;
+	out << "  Unknown Float 4:  " << ragdoll.unknownFloat4 << endl;
+	out << "  Unknown Float 5:  " << ragdoll.unknownFloat5 << endl;
+	out << "  Unknown Float 6:  " << ragdoll.unknownFloat6 << endl;
+	out << "  Unknown Float 7:  " << ragdoll.unknownFloat7 << endl;
+	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
+	out << "  Is Death Pose:  " << isDeathPose << endl;
+	if ( isDeathPose ) {
+		out << "    Unknown Int 1:  " << unknownInt1 << endl;
+		out << "    Unknown Int 2:  " << unknownInt2 << endl;
+		out << "    Unknown Int 3:  " << unknownInt3 << endl;
+		out << "    Unknown Int 4:  " << unknownInt4 << endl;
+		out << "    Unknown Int 5:  " << unknownInt5 << endl;
+		out << "    Unknown Int 6:  " << unknownInt6 << endl;
+		out << "    Unknown Byte 1:  " << unknownByte1 << endl;
+	};
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
diff --git a/src/obj/bhkRigidBody.cpp b/src/obj/bhkRigidBody.cpp
index a02f167e..30b2ccbc 100644
--- a/src/obj/bhkRigidBody.cpp
+++ b/src/obj/bhkRigidBody.cpp
@@ -16,7 +16,7 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/bhkRigidBody.h"
 #include "../../include/gen/QuaternionXYZW.h"
-#include "../../include/obj/bhkConstraint.h"
+#include "../../include/obj/bhkSerializable.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
@@ -263,7 +263,7 @@ void bhkRigidBody::FixLinks( const map<unsigned int,NiObjectRef> & objects, list
 
 	bhkEntity::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
-		constraints[i1] = FixLink<bhkConstraint>( objects, link_stack, info );
+		constraints[i1] = FixLink<bhkSerializable>( objects, link_stack, info );
 	};
 
 	//--BEGIN POST-FIXLINKS CUSTOM CODE--//
diff --git a/src/obj/hkPackedNiTriStripsData.cpp b/src/obj/hkPackedNiTriStripsData.cpp
index 2fa54df8..2f43b8a4 100644
--- a/src/obj/hkPackedNiTriStripsData.cpp
+++ b/src/obj/hkPackedNiTriStripsData.cpp
@@ -15,12 +15,13 @@ All rights reserved.  Please see niflib.h for license. */
 #include "../../include/NIF_IO.h"
 #include "../../include/obj/hkPackedNiTriStripsData.h"
 #include "../../include/gen/hkTriangle.h"
+#include "../../include/gen/OblivionSubShape.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
 const Type hkPackedNiTriStripsData::TYPE("hkPackedNiTriStripsData", &bhkShapeCollection::TYPE );
 
-hkPackedNiTriStripsData::hkPackedNiTriStripsData() : numTriangles((unsigned int)0), numVertices((unsigned int)0) {
+hkPackedNiTriStripsData::hkPackedNiTriStripsData() : numTriangles((unsigned int)0), numVertices((unsigned int)0), unknownByte1((byte)0), numSubShapes((unsigned short)0) {
 	//--BEGIN CONSTRUCTOR CUSTOM CODE--//
 	//--END CUSTOM CODE--//
 }
@@ -48,13 +49,29 @@ void hkPackedNiTriStripsData::Read( istream& in, list<unsigned int> & link_stack
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
 		NifStream( triangles[i1].triangle, in, info );
 		NifStream( triangles[i1].weldingInformation_, in, info );
-		NifStream( triangles[i1].normal, in, info );
+		if ( info.version <= 0x14000005 ) {
+			NifStream( triangles[i1].normal, in, info );
+		};
 	};
 	NifStream( numVertices, in, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, in, info );
+	};
 	vertices.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
 		NifStream( vertices[i1], in, info );
 	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( numSubShapes, in, info );
+		subShapes.resize(numSubShapes);
+		for (unsigned int i2 = 0; i2 < subShapes.size(); i2++) {
+			NifStream( subShapes[i2].layer, in, info );
+			NifStream( subShapes[i2].colFilter, in, info );
+			NifStream( subShapes[i2].wieldingType_, in, info );
+			NifStream( subShapes[i2].numVertices, in, info );
+			NifStream( subShapes[i2].material, in, info );
+		};
+	};
 
 	//--BEGIN POST-READ CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -65,18 +82,34 @@ void hkPackedNiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigne
 	//--END CUSTOM CODE--//
 
 	bhkShapeCollection::Write( out, link_map, info );
+	numSubShapes = (unsigned short)(subShapes.size());
 	numVertices = (unsigned int)(vertices.size());
 	numTriangles = (unsigned int)(triangles.size());
 	NifStream( numTriangles, out, info );
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
 		NifStream( triangles[i1].triangle, out, info );
 		NifStream( triangles[i1].weldingInformation_, out, info );
-		NifStream( triangles[i1].normal, out, info );
+		if ( info.version <= 0x14000005 ) {
+			NifStream( triangles[i1].normal, out, info );
+		};
 	};
 	NifStream( numVertices, out, info );
+	if ( info.version >= 0x14020007 ) {
+		NifStream( unknownByte1, out, info );
+	};
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
 		NifStream( vertices[i1], out, info );
 	};
+	if ( info.version >= 0x14020007 ) {
+		NifStream( numSubShapes, out, info );
+		for (unsigned int i2 = 0; i2 < subShapes.size(); i2++) {
+			NifStream( subShapes[i2].layer, out, info );
+			NifStream( subShapes[i2].colFilter, out, info );
+			NifStream( subShapes[i2].wieldingType_, out, info );
+			NifStream( subShapes[i2].numVertices, out, info );
+			NifStream( subShapes[i2].material, out, info );
+		};
+	};
 
 	//--BEGIN POST-WRITE CUSTOM CODE--//
 	//--END CUSTOM CODE--//
@@ -89,6 +122,7 @@ std::string hkPackedNiTriStripsData::asString( bool verbose ) const {
 	stringstream out;
 	unsigned int array_output_count = 0;
 	out << bhkShapeCollection::asString();
+	numSubShapes = (unsigned short)(subShapes.size());
 	numVertices = (unsigned int)(vertices.size());
 	numTriangles = (unsigned int)(triangles.size());
 	out << "  Num Triangles:  " << numTriangles << endl;
@@ -103,6 +137,7 @@ std::string hkPackedNiTriStripsData::asString( bool verbose ) const {
 		out << "    Normal:  " << triangles[i1].normal << endl;
 	};
 	out << "  Num Vertices:  " << numVertices << endl;
+	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
 	array_output_count = 0;
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
 		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
@@ -115,6 +150,19 @@ std::string hkPackedNiTriStripsData::asString( bool verbose ) const {
 		out << "    Vertices[" << i1 << "]:  " << vertices[i1] << endl;
 		array_output_count++;
 	};
+	out << "  Num Sub Shapes:  " << numSubShapes << endl;
+	array_output_count = 0;
+	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
+		out << "    Layer:  " << subShapes[i1].layer << endl;
+		out << "    Col Filter:  " << subShapes[i1].colFilter << endl;
+		out << "    Wielding Type?:  " << subShapes[i1].wieldingType_ << endl;
+		out << "    Num Vertices:  " << subShapes[i1].numVertices << endl;
+		out << "    Material:  " << subShapes[i1].material << endl;
+	};
 	return out.str();
 
 	//--BEGIN POST-STRING CUSTOM CODE--//
-- 
GitLab