From 305c72bf5788b52042c524b9d9c636a398bdda40 Mon Sep 17 00:00:00 2001
From: Shon Ferguson <shonferg@users.sourceforge.net>
Date: Fri, 6 Apr 2007 02:44:47 +0000
Subject: [PATCH] Laying the groundwork for Niflib to be able to work on
 systems with different endian types.  All Read/Write functions now take
 NifInfo structures which are based by const reference.  These are also passed
 into the NifStream functions so they will have access to the requested endian
 type of the NIF as well.  Also added endian detection and swapping functions.

---
 include/NIF_IO.h                              |  108 +-
 include/gen/Footer.h                          |    4 +-
 include/gen/Header.h                          |    4 +-
 include/gen/enums_intl.h                      |   88 +-
 include/nif_basic_types.h                     |   35 +
 include/niflib.h                              |   34 +-
 include/obj/ABoneLODController.h              |   12 +-
 include/obj/AKeyedData.h                      |   12 +-
 include/obj/APSysCtlr.h                       |   12 +-
 include/obj/APSysData.h                       |   12 +-
 include/obj/AParticleModifier.h               |   12 +-
 include/obj/AbhkConstraint.h                  |   12 +-
 include/obj/AbhkRagdollConstraint.h           |   12 +-
 include/obj/AbhkShapeCollection.h             |   12 +-
 include/obj/AvoidNode.h                       |   12 +-
 include/obj/BSBound.h                         |   12 +-
 include/obj/BSFurnitureMarker.h               |   12 +-
 include/obj/BSKeyframeController.h            |   12 +-
 include/obj/BSPSysArrayEmitter.h              |   12 +-
 include/obj/BSParentVelocityModifier.h        |   12 +-
 include/obj/BSXFlags.h                        |   12 +-
 include/obj/FxButton.h                        |   12 +-
 include/obj/FxRadioButton.h                   |   12 +-
 include/obj/FxWidget.h                        |   12 +-
 include/obj/NiAVObject.h                      |   12 +-
 include/obj/NiAlphaController.h               |   12 +-
 include/obj/NiAlphaProperty.h                 |   12 +-
 include/obj/NiAmbientLight.h                  |   12 +-
 include/obj/NiAutoNormalParticles.h           |   12 +-
 include/obj/NiAutoNormalParticlesData.h       |   12 +-
 include/obj/NiBSAnimationNode.h               |   12 +-
 include/obj/NiBSBoneLODController.h           |   12 +-
 include/obj/NiBSPArrayController.h            |   12 +-
 include/obj/NiBSParticleNode.h                |   12 +-
 include/obj/NiBSplineBasisData.h              |   12 +-
 include/obj/NiBSplineCompFloatInterpolator.h  |   12 +-
 include/obj/NiBSplineCompPoint3Interpolator.h |   12 +-
 .../obj/NiBSplineCompTransformInterpolator.h  |   12 +-
 include/obj/NiBSplineData.h                   |   12 +-
 include/obj/NiBSplineInterpolator.h           |   12 +-
 include/obj/NiBillboardNode.h                 |   12 +-
 include/obj/NiBinaryExtraData.h               |   12 +-
 include/obj/NiBlendBoolInterpolator.h         |   12 +-
 include/obj/NiBlendFloatInterpolator.h        |   12 +-
 include/obj/NiBlendInterpolator.h             |   12 +-
 include/obj/NiBlendPoint3Interpolator.h       |   12 +-
 include/obj/NiBlendTransformInterpolator.h    |   12 +-
 include/obj/NiBoneLODController.h             |   12 +-
 include/obj/NiBoolData.h                      |   12 +-
 include/obj/NiBoolInterpolator.h              |   12 +-
 include/obj/NiBoolTimelineInterpolator.h      |   12 +-
 include/obj/NiBooleanExtraData.h              |   12 +-
 include/obj/NiCamera.h                        |   12 +-
 include/obj/NiClod.h                          |   12 +-
 include/obj/NiClodData.h                      |   12 +-
 include/obj/NiClodSkinInstance.h              |   12 +-
 include/obj/NiCollisionData.h                 |   12 +-
 include/obj/NiCollisionObject.h               |   12 +-
 include/obj/NiColorData.h                     |   12 +-
 include/obj/NiColorExtraData.h                |   12 +-
 include/obj/NiControllerManager.h             |   12 +-
 include/obj/NiControllerSequence.h            |   12 +-
 include/obj/NiDefaultAVObjectPalette.h        |   12 +-
 include/obj/NiDirectionalLight.h              |   12 +-
 include/obj/NiDitherProperty.h                |   12 +-
 include/obj/NiDynamicEffect.h                 |   12 +-
 include/obj/NiExtraData.h                     |   12 +-
 include/obj/NiFlipController.h                |   12 +-
 include/obj/NiFloatData.h                     |   12 +-
 include/obj/NiFloatExtraData.h                |   12 +-
 include/obj/NiFloatExtraDataController.h      |   12 +-
 include/obj/NiFloatInterpolator.h             |   12 +-
 include/obj/NiFloatsExtraData.h               |   12 +-
 include/obj/NiFogProperty.h                   |   12 +-
 include/obj/NiGeomMorpherController.h         |   12 +-
 include/obj/NiGeometry.h                      |   12 +-
 include/obj/NiGeometryData.h                  |   12 +-
 include/obj/NiGravity.h                       |   12 +-
 include/obj/NiImage.h                         |   12 +-
 include/obj/NiIntegerExtraData.h              |   12 +-
 include/obj/NiIntegersExtraData.h             |   12 +-
 include/obj/NiInterpolator.h                  |   12 +-
 include/obj/NiKeyframeController.h            |   12 +-
 include/obj/NiKeyframeData.h                  |   12 +-
 include/obj/NiLODData.h                       |   12 +-
 include/obj/NiLODNode.h                       |   12 +-
 include/obj/NiLight.h                         |   12 +-
 include/obj/NiLightColorController.h          |   12 +-
 include/obj/NiLightDimmerController.h         |   12 +-
 include/obj/NiLookAtController.h              |   12 +-
 include/obj/NiLookAtInterpolator.h            |   12 +-
 include/obj/NiMaterialColorController.h       |   12 +-
 include/obj/NiMaterialProperty.h              |   12 +-
 include/obj/NiMeshPSysData.h                  |   12 +-
 include/obj/NiMeshParticleSystem.h            |   12 +-
 include/obj/NiMorphData.h                     |   12 +-
 .../obj/NiMultiTargetTransformController.h    |   12 +-
 include/obj/NiNode.h                          |   12 +-
 include/obj/NiObject.h                        |   12 +-
 include/obj/NiObjectNET.h                     |   12 +-
 include/obj/NiPSysAgeDeathModifier.h          |   12 +-
 include/obj/NiPSysBombModifier.h              |   12 +-
 include/obj/NiPSysBoundUpdateModifier.h       |   12 +-
 include/obj/NiPSysBoxEmitter.h                |   12 +-
 include/obj/NiPSysColliderManager.h           |   12 +-
 include/obj/NiPSysColorModifier.h             |   12 +-
 include/obj/NiPSysCylinderEmitter.h           |   12 +-
 include/obj/NiPSysData.h                      |   12 +-
 include/obj/NiPSysDragModifier.h              |   12 +-
 include/obj/NiPSysEmitter.h                   |   12 +-
 include/obj/NiPSysEmitterCtlr.h               |   12 +-
 include/obj/NiPSysEmitterCtlrData.h           |   12 +-
 include/obj/NiPSysEmitterDeclinationCtlr.h    |   12 +-
 include/obj/NiPSysEmitterDeclinationVarCtlr.h |   12 +-
 include/obj/NiPSysEmitterInitialRadiusCtlr.h  |   12 +-
 include/obj/NiPSysEmitterLifeSpanCtlr.h       |   12 +-
 include/obj/NiPSysEmitterSpeedCtlr.h          |   12 +-
 include/obj/NiPSysGravityModifier.h           |   12 +-
 include/obj/NiPSysGravityStrengthCtlr.h       |   12 +-
 include/obj/NiPSysGrowFadeModifier.h          |   12 +-
 include/obj/NiPSysMeshEmitter.h               |   12 +-
 include/obj/NiPSysMeshUpdateModifier.h        |   12 +-
 include/obj/NiPSysModifier.h                  |   12 +-
 include/obj/NiPSysModifierActiveCtlr.h        |   12 +-
 include/obj/NiPSysPlanarCollider.h            |   12 +-
 include/obj/NiPSysPositionModifier.h          |   12 +-
 include/obj/NiPSysResetOnLoopCtlr.h           |   12 +-
 include/obj/NiPSysRotationModifier.h          |   12 +-
 include/obj/NiPSysSpawnModifier.h             |   12 +-
 include/obj/NiPSysSphereEmitter.h             |   12 +-
 include/obj/NiPSysUpdateCtlr.h                |   12 +-
 include/obj/NiPSysVolumeEmitter.h             |   12 +-
 include/obj/NiPalette.h                       |   12 +-
 include/obj/NiParticleBomb.h                  |   12 +-
 include/obj/NiParticleColorModifier.h         |   12 +-
 include/obj/NiParticleGrowFade.h              |   12 +-
 include/obj/NiParticleMeshModifier.h          |   12 +-
 include/obj/NiParticleMeshes.h                |   12 +-
 include/obj/NiParticleMeshesData.h            |   12 +-
 include/obj/NiParticleRotation.h              |   12 +-
 include/obj/NiParticleSystem.h                |   12 +-
 include/obj/NiParticleSystemController.h      |   12 +-
 include/obj/NiParticles.h                     |   12 +-
 include/obj/NiParticlesData.h                 |   12 +-
 include/obj/NiPathController.h                |   12 +-
 include/obj/NiPathInterpolator.h              |   12 +-
 include/obj/NiPixelData.h                     |   12 +-
 include/obj/NiPlanarCollider.h                |   12 +-
 include/obj/NiPoint3Interpolator.h            |   12 +-
 include/obj/NiPointLight.h                    |   12 +-
 include/obj/NiPosData.h                       |   12 +-
 include/obj/NiProperty.h                      |   12 +-
 include/obj/NiRangeLODData.h                  |   12 +-
 include/obj/NiRotatingParticles.h             |   12 +-
 include/obj/NiRotatingParticlesData.h         |   12 +-
 include/obj/NiScreenLODData.h                 |   12 +-
 include/obj/NiSequenceStreamHelper.h          |   12 +-
 include/obj/NiShadeProperty.h                 |   12 +-
 include/obj/NiSingleInterpolatorController.h  |   12 +-
 include/obj/NiSkinData.h                      |   12 +-
 include/obj/NiSkinInstance.h                  |   12 +-
 include/obj/NiSkinPartition.h                 |   12 +-
 include/obj/NiSourceTexture.h                 |   12 +-
 include/obj/NiSpecularProperty.h              |   12 +-
 include/obj/NiSphericalCollider.h             |   12 +-
 include/obj/NiSpotLight.h                     |   12 +-
 include/obj/NiStencilProperty.h               |   12 +-
 include/obj/NiStringExtraData.h               |   12 +-
 include/obj/NiStringPalette.h                 |   12 +-
 include/obj/NiStringsExtraData.h              |   12 +-
 include/obj/NiTextKeyExtraData.h              |   12 +-
 include/obj/NiTextureEffect.h                 |   12 +-
 include/obj/NiTextureModeProperty.h           |   12 +-
 include/obj/NiTextureProperty.h               |   12 +-
 include/obj/NiTextureTransformController.h    |   12 +-
 include/obj/NiTexturingProperty.h             |   12 +-
 include/obj/NiTimeController.h                |   12 +-
 include/obj/NiTransformController.h           |   12 +-
 include/obj/NiTransformData.h                 |   12 +-
 include/obj/NiTransformInterpolator.h         |   12 +-
 include/obj/NiTriBasedGeom.h                  |   12 +-
 include/obj/NiTriBasedGeomData.h              |   12 +-
 include/obj/NiTriShape.h                      |   12 +-
 include/obj/NiTriShapeData.h                  |   12 +-
 include/obj/NiTriStrips.h                     |   12 +-
 include/obj/NiTriStripsData.h                 |   12 +-
 include/obj/NiUVController.h                  |   12 +-
 include/obj/NiUVData.h                        |   12 +-
 include/obj/NiVectorExtraData.h               |   12 +-
 include/obj/NiVertWeightsExtraData.h          |   12 +-
 include/obj/NiVertexColorProperty.h           |   12 +-
 include/obj/NiVisController.h                 |   12 +-
 include/obj/NiVisData.h                       |   12 +-
 include/obj/NiWireframeProperty.h             |   12 +-
 include/obj/NiZBufferProperty.h               |   12 +-
 include/obj/RootCollisionNode.h               |   12 +-
 include/obj/bhkBlendCollisionObject.h         |   12 +-
 include/obj/bhkBlendController.h              |   12 +-
 include/obj/bhkBoxShape.h                     |   12 +-
 include/obj/bhkCapsuleShape.h                 |   12 +-
 include/obj/bhkCollisionObject.h              |   12 +-
 include/obj/bhkConvexShape.h                  |   12 +-
 include/obj/bhkConvexTransformShape.h         |   12 +-
 include/obj/bhkConvexVerticesShape.h          |   12 +-
 include/obj/bhkEntity.h                       |   12 +-
 include/obj/bhkHingeConstraint.h              |   12 +-
 include/obj/bhkLimitedHingeConstraint.h       |   12 +-
 include/obj/bhkListShape.h                    |   12 +-
 include/obj/bhkMalleableConstraint.h          |   12 +-
 include/obj/bhkMoppBvTreeShape.h              |   12 +-
 include/obj/bhkMultiSphereShape.h             |   12 +-
 include/obj/bhkNiTriStripsShape.h             |   12 +-
 include/obj/bhkPackedNiTriStripsShape.h       |   12 +-
 include/obj/bhkPrismaticConstraint.h          |   12 +-
 include/obj/bhkRagdollConstraint.h            |   12 +-
 include/obj/bhkRefObject.h                    |   12 +-
 include/obj/bhkRigidBody.h                    |   12 +-
 include/obj/bhkRigidBodyT.h                   |   12 +-
 include/obj/bhkSPCollisionObject.h            |   12 +-
 include/obj/bhkSerializable.h                 |   12 +-
 include/obj/bhkShape.h                        |   12 +-
 include/obj/bhkSimpleShapePhantom.h           |   12 +-
 include/obj/bhkSphereRepShape.h               |   12 +-
 include/obj/bhkSphereShape.h                  |   12 +-
 include/obj/bhkStiffSpringConstraint.h        |   12 +-
 include/obj/bhkTransformShape.h               |   12 +-
 include/obj/bhkWorldObject.h                  |   12 +-
 include/obj/hkPackedNiTriStripsData.h         |   12 +-
 src/NIF_IO.cpp                                |  175 +-
 src/gen/Footer.cpp                            |   18 +-
 src/gen/Header.cpp                            |  121 +-
 src/gen/enums.cpp                             |  176 +-
 src/gen/obj_impl.cpp                          | 8364 ++++++++---------
 src/niflib.cpp                                |   52 +-
 src/obj/ABoneLODController.cpp                |   12 +-
 src/obj/AKeyedData.cpp                        |   12 +-
 src/obj/APSysCtlr.cpp                         |   12 +-
 src/obj/APSysData.cpp                         |   12 +-
 src/obj/AParticleModifier.cpp                 |   12 +-
 src/obj/AbhkConstraint.cpp                    |   12 +-
 src/obj/AbhkRagdollConstraint.cpp             |   12 +-
 src/obj/AbhkShapeCollection.cpp               |   12 +-
 src/obj/AvoidNode.cpp                         |   12 +-
 src/obj/BSBound.cpp                           |   12 +-
 src/obj/BSFurnitureMarker.cpp                 |   12 +-
 src/obj/BSKeyframeController.cpp              |   12 +-
 src/obj/BSPSysArrayEmitter.cpp                |   12 +-
 src/obj/BSParentVelocityModifier.cpp          |   12 +-
 src/obj/BSXFlags.cpp                          |   12 +-
 src/obj/FxButton.cpp                          |   12 +-
 src/obj/FxRadioButton.cpp                     |   12 +-
 src/obj/FxWidget.cpp                          |   12 +-
 src/obj/NiAVObject.cpp                        |   12 +-
 src/obj/NiAlphaController.cpp                 |   12 +-
 src/obj/NiAlphaProperty.cpp                   |   12 +-
 src/obj/NiAmbientLight.cpp                    |   12 +-
 src/obj/NiAutoNormalParticles.cpp             |   12 +-
 src/obj/NiAutoNormalParticlesData.cpp         |   12 +-
 src/obj/NiBSAnimationNode.cpp                 |   12 +-
 src/obj/NiBSBoneLODController.cpp             |   12 +-
 src/obj/NiBSPArrayController.cpp              |   12 +-
 src/obj/NiBSParticleNode.cpp                  |   12 +-
 src/obj/NiBSplineBasisData.cpp                |   12 +-
 src/obj/NiBSplineCompFloatInterpolator.cpp    |   12 +-
 src/obj/NiBSplineCompPoint3Interpolator.cpp   |   12 +-
 .../NiBSplineCompTransformInterpolator.cpp    |   12 +-
 src/obj/NiBSplineData.cpp                     |   12 +-
 src/obj/NiBSplineInterpolator.cpp             |   12 +-
 src/obj/NiBillboardNode.cpp                   |   12 +-
 src/obj/NiBinaryExtraData.cpp                 |   12 +-
 src/obj/NiBlendBoolInterpolator.cpp           |   12 +-
 src/obj/NiBlendFloatInterpolator.cpp          |   12 +-
 src/obj/NiBlendInterpolator.cpp               |   12 +-
 src/obj/NiBlendPoint3Interpolator.cpp         |   12 +-
 src/obj/NiBlendTransformInterpolator.cpp      |   12 +-
 src/obj/NiBoneLODController.cpp               |   12 +-
 src/obj/NiBoolData.cpp                        |   12 +-
 src/obj/NiBoolInterpolator.cpp                |   12 +-
 src/obj/NiBoolTimelineInterpolator.cpp        |   12 +-
 src/obj/NiBooleanExtraData.cpp                |   12 +-
 src/obj/NiCamera.cpp                          |   12 +-
 src/obj/NiClod.cpp                            |   12 +-
 src/obj/NiClodData.cpp                        |   12 +-
 src/obj/NiClodSkinInstance.cpp                |   12 +-
 src/obj/NiCollisionData.cpp                   |   12 +-
 src/obj/NiCollisionObject.cpp                 |   12 +-
 src/obj/NiColorData.cpp                       |   12 +-
 src/obj/NiColorExtraData.cpp                  |   12 +-
 src/obj/NiControllerManager.cpp               |   12 +-
 src/obj/NiControllerSequence.cpp              |   12 +-
 src/obj/NiDefaultAVObjectPalette.cpp          |   12 +-
 src/obj/NiDirectionalLight.cpp                |   12 +-
 src/obj/NiDitherProperty.cpp                  |   12 +-
 src/obj/NiDynamicEffect.cpp                   |   12 +-
 src/obj/NiExtraData.cpp                       |   12 +-
 src/obj/NiFlipController.cpp                  |   12 +-
 src/obj/NiFloatData.cpp                       |   12 +-
 src/obj/NiFloatExtraData.cpp                  |   12 +-
 src/obj/NiFloatExtraDataController.cpp        |   12 +-
 src/obj/NiFloatInterpolator.cpp               |   12 +-
 src/obj/NiFloatsExtraData.cpp                 |   12 +-
 src/obj/NiFogProperty.cpp                     |   12 +-
 src/obj/NiGeomMorpherController.cpp           |   12 +-
 src/obj/NiGeometry.cpp                        |   12 +-
 src/obj/NiGeometryData.cpp                    |   12 +-
 src/obj/NiGravity.cpp                         |   12 +-
 src/obj/NiImage.cpp                           |   12 +-
 src/obj/NiIntegerExtraData.cpp                |   12 +-
 src/obj/NiIntegersExtraData.cpp               |   12 +-
 src/obj/NiInterpolator.cpp                    |   12 +-
 src/obj/NiKeyframeController.cpp              |   12 +-
 src/obj/NiKeyframeData.cpp                    |   12 +-
 src/obj/NiLODData.cpp                         |   12 +-
 src/obj/NiLODNode.cpp                         |   12 +-
 src/obj/NiLight.cpp                           |   12 +-
 src/obj/NiLightColorController.cpp            |   12 +-
 src/obj/NiLightDimmerController.cpp           |   12 +-
 src/obj/NiLookAtController.cpp                |   12 +-
 src/obj/NiLookAtInterpolator.cpp              |   12 +-
 src/obj/NiMaterialColorController.cpp         |   12 +-
 src/obj/NiMaterialProperty.cpp                |   12 +-
 src/obj/NiMeshPSysData.cpp                    |   12 +-
 src/obj/NiMeshParticleSystem.cpp              |   12 +-
 src/obj/NiMorphData.cpp                       |   12 +-
 src/obj/NiMultiTargetTransformController.cpp  |   12 +-
 src/obj/NiNode.cpp                            |   12 +-
 src/obj/NiObject.cpp                          |    5 +-
 src/obj/NiObjectNET.cpp                       |   12 +-
 src/obj/NiPSysAgeDeathModifier.cpp            |   12 +-
 src/obj/NiPSysBombModifier.cpp                |   12 +-
 src/obj/NiPSysBoundUpdateModifier.cpp         |   12 +-
 src/obj/NiPSysBoxEmitter.cpp                  |   12 +-
 src/obj/NiPSysColliderManager.cpp             |   12 +-
 src/obj/NiPSysColorModifier.cpp               |   12 +-
 src/obj/NiPSysCylinderEmitter.cpp             |   12 +-
 src/obj/NiPSysData.cpp                        |   12 +-
 src/obj/NiPSysDragModifier.cpp                |   12 +-
 src/obj/NiPSysEmitter.cpp                     |   12 +-
 src/obj/NiPSysEmitterCtlr.cpp                 |   12 +-
 src/obj/NiPSysEmitterCtlrData.cpp             |   12 +-
 src/obj/NiPSysEmitterDeclinationCtlr.cpp      |   12 +-
 src/obj/NiPSysEmitterDeclinationVarCtlr.cpp   |   12 +-
 src/obj/NiPSysEmitterInitialRadiusCtlr.cpp    |   12 +-
 src/obj/NiPSysEmitterLifeSpanCtlr.cpp         |   12 +-
 src/obj/NiPSysEmitterSpeedCtlr.cpp            |   12 +-
 src/obj/NiPSysGravityModifier.cpp             |   12 +-
 src/obj/NiPSysGravityStrengthCtlr.cpp         |   12 +-
 src/obj/NiPSysGrowFadeModifier.cpp            |   12 +-
 src/obj/NiPSysMeshEmitter.cpp                 |   12 +-
 src/obj/NiPSysMeshUpdateModifier.cpp          |   12 +-
 src/obj/NiPSysModifier.cpp                    |   12 +-
 src/obj/NiPSysModifierActiveCtlr.cpp          |   12 +-
 src/obj/NiPSysPlanarCollider.cpp              |   12 +-
 src/obj/NiPSysPositionModifier.cpp            |   12 +-
 src/obj/NiPSysResetOnLoopCtlr.cpp             |   12 +-
 src/obj/NiPSysRotationModifier.cpp            |   12 +-
 src/obj/NiPSysSpawnModifier.cpp               |   12 +-
 src/obj/NiPSysSphereEmitter.cpp               |   12 +-
 src/obj/NiPSysUpdateCtlr.cpp                  |   12 +-
 src/obj/NiPSysVolumeEmitter.cpp               |   12 +-
 src/obj/NiPalette.cpp                         |   12 +-
 src/obj/NiParticleBomb.cpp                    |   12 +-
 src/obj/NiParticleColorModifier.cpp           |   12 +-
 src/obj/NiParticleGrowFade.cpp                |   12 +-
 src/obj/NiParticleMeshModifier.cpp            |   12 +-
 src/obj/NiParticleMeshes.cpp                  |   12 +-
 src/obj/NiParticleMeshesData.cpp              |   12 +-
 src/obj/NiParticleRotation.cpp                |   12 +-
 src/obj/NiParticleSystem.cpp                  |   12 +-
 src/obj/NiParticleSystemController.cpp        |   12 +-
 src/obj/NiParticles.cpp                       |   12 +-
 src/obj/NiParticlesData.cpp                   |   12 +-
 src/obj/NiPathController.cpp                  |   12 +-
 src/obj/NiPathInterpolator.cpp                |   12 +-
 src/obj/NiPixelData.cpp                       |   12 +-
 src/obj/NiPlanarCollider.cpp                  |   12 +-
 src/obj/NiPoint3Interpolator.cpp              |   12 +-
 src/obj/NiPointLight.cpp                      |   12 +-
 src/obj/NiPosData.cpp                         |   12 +-
 src/obj/NiProperty.cpp                        |   12 +-
 src/obj/NiRangeLODData.cpp                    |   12 +-
 src/obj/NiRotatingParticles.cpp               |   12 +-
 src/obj/NiRotatingParticlesData.cpp           |   12 +-
 src/obj/NiScreenLODData.cpp                   |   12 +-
 src/obj/NiSequenceStreamHelper.cpp            |   12 +-
 src/obj/NiShadeProperty.cpp                   |   12 +-
 src/obj/NiSingleInterpolatorController.cpp    |   12 +-
 src/obj/NiSkinData.cpp                        |   12 +-
 src/obj/NiSkinInstance.cpp                    |   12 +-
 src/obj/NiSkinPartition.cpp                   |   12 +-
 src/obj/NiSourceTexture.cpp                   |   12 +-
 src/obj/NiSpecularProperty.cpp                |   12 +-
 src/obj/NiSphericalCollider.cpp               |   12 +-
 src/obj/NiSpotLight.cpp                       |   12 +-
 src/obj/NiStencilProperty.cpp                 |   12 +-
 src/obj/NiStringExtraData.cpp                 |   12 +-
 src/obj/NiStringPalette.cpp                   |   12 +-
 src/obj/NiStringsExtraData.cpp                |   12 +-
 src/obj/NiTextKeyExtraData.cpp                |   12 +-
 src/obj/NiTextureEffect.cpp                   |   12 +-
 src/obj/NiTextureModeProperty.cpp             |   12 +-
 src/obj/NiTextureProperty.cpp                 |   12 +-
 src/obj/NiTextureTransformController.cpp      |   12 +-
 src/obj/NiTexturingProperty.cpp               |   12 +-
 src/obj/NiTimeController.cpp                  |   12 +-
 src/obj/NiTransformController.cpp             |   12 +-
 src/obj/NiTransformData.cpp                   |   12 +-
 src/obj/NiTransformInterpolator.cpp           |   12 +-
 src/obj/NiTriBasedGeom.cpp                    |   12 +-
 src/obj/NiTriBasedGeomData.cpp                |   12 +-
 src/obj/NiTriShape.cpp                        |   12 +-
 src/obj/NiTriShapeData.cpp                    |   12 +-
 src/obj/NiTriStrips.cpp                       |   12 +-
 src/obj/NiTriStripsData.cpp                   |   12 +-
 src/obj/NiUVController.cpp                    |   12 +-
 src/obj/NiUVData.cpp                          |   12 +-
 src/obj/NiVectorExtraData.cpp                 |   12 +-
 src/obj/NiVertWeightsExtraData.cpp            |   12 +-
 src/obj/NiVertexColorProperty.cpp             |   12 +-
 src/obj/NiVisController.cpp                   |   12 +-
 src/obj/NiVisData.cpp                         |   12 +-
 src/obj/NiWireframeProperty.cpp               |   12 +-
 src/obj/NiZBufferProperty.cpp                 |   12 +-
 src/obj/RootCollisionNode.cpp                 |   12 +-
 src/obj/bhkBlendCollisionObject.cpp           |   12 +-
 src/obj/bhkBlendController.cpp                |   12 +-
 src/obj/bhkBoxShape.cpp                       |   12 +-
 src/obj/bhkCapsuleShape.cpp                   |   12 +-
 src/obj/bhkCollisionObject.cpp                |   12 +-
 src/obj/bhkConvexShape.cpp                    |   12 +-
 src/obj/bhkConvexTransformShape.cpp           |   12 +-
 src/obj/bhkConvexVerticesShape.cpp            |   12 +-
 src/obj/bhkEntity.cpp                         |   12 +-
 src/obj/bhkHingeConstraint.cpp                |   12 +-
 src/obj/bhkLimitedHingeConstraint.cpp         |   12 +-
 src/obj/bhkListShape.cpp                      |   12 +-
 src/obj/bhkMalleableConstraint.cpp            |   12 +-
 src/obj/bhkMoppBvTreeShape.cpp                |   12 +-
 src/obj/bhkMultiSphereShape.cpp               |   12 +-
 src/obj/bhkNiTriStripsShape.cpp               |   12 +-
 src/obj/bhkPackedNiTriStripsShape.cpp         |   12 +-
 src/obj/bhkPrismaticConstraint.cpp            |   12 +-
 src/obj/bhkRagdollConstraint.cpp              |   12 +-
 src/obj/bhkRefObject.cpp                      |   12 +-
 src/obj/bhkRigidBody.cpp                      |   12 +-
 src/obj/bhkRigidBodyT.cpp                     |   12 +-
 src/obj/bhkSPCollisionObject.cpp              |   12 +-
 src/obj/bhkSerializable.cpp                   |   12 +-
 src/obj/bhkShape.cpp                          |   12 +-
 src/obj/bhkSimpleShapePhantom.cpp             |   12 +-
 src/obj/bhkSphereRepShape.cpp                 |   12 +-
 src/obj/bhkSphereShape.cpp                    |   12 +-
 src/obj/bhkStiffSpringConstraint.cpp          |   12 +-
 src/obj/bhkTransformShape.cpp                 |   12 +-
 src/obj/bhkWorldObject.cpp                    |   12 +-
 src/obj/hkPackedNiTriStripsData.cpp           |   12 +-
 456 files changed, 7304 insertions(+), 7196 deletions(-)

diff --git a/include/NIF_IO.h b/include/NIF_IO.h
index a53d34e6..228e5029 100644
--- a/include/NIF_IO.h
+++ b/include/NIF_IO.h
@@ -257,110 +257,110 @@ void WriteBool( bool val, ostream& out, unsigned int version );
 //--Basic Types--//
 
 //int
-void NifStream( int & val, istream& in, unsigned int version = 0 );
-void NifStream( int const & val, ostream& out, unsigned int version = 0  );
+void NifStream( int & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( int const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //unsigned int
-void NifStream( unsigned int & val, istream& in, unsigned int version = 0 );
-void NifStream( unsigned int const & val, ostream& out, unsigned int version = 0  );
+void NifStream( unsigned int & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( unsigned int const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //unsigned short
-void NifStream( unsigned short & val, istream& in, unsigned int version = 0 );
-void NifStream( unsigned short const & val, ostream& out, unsigned int version = 0  );
+void NifStream( unsigned short & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( unsigned short const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //short
-void NifStream( short & val, istream& in, unsigned int version = 0 );
-void NifStream( short const & val, ostream& out, unsigned int version = 0  );
+void NifStream( short & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( short const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //byte
-void NifStream( byte & val, istream& in, unsigned int version = 0 );
-void NifStream( byte const & val, ostream& out, unsigned int version = 0  );
+void NifStream( byte & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( byte const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //bool
-void NifStream( bool & val, istream& in, unsigned int version );  // version is significant
-void NifStream( bool const & val, ostream& out, unsigned int version ); // version is significant
+void NifStream( bool & val, istream& in, const NifInfo & info = NifInfo() );  // version is significant
+void NifStream( bool const & val, ostream& out, const NifInfo & info = NifInfo() ); // version is significant
 
 //float
-void NifStream( float & val, istream& in, unsigned int version = 0 );
-void NifStream( float const & val, ostream& out, unsigned int version = 0  );
+void NifStream( float & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( float const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //string
-void NifStream( string & val, istream& in, unsigned int version = 0 );
-void NifStream( string const & val, ostream& out, unsigned int version = 0  );
+void NifStream( string & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( string const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //--Structs--//
 
 //TexCoord
-void NifStream( TexCoord & val, istream& in, unsigned int version = 0 );
-void NifStream( TexCoord const & val, ostream& out, unsigned int version = 0 );
+void NifStream( TexCoord & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexCoord const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Triangle
-void NifStream( Triangle & val, istream& in, unsigned int version = 0 );
-void NifStream( Triangle const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Triangle & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Triangle const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Vector3
-void NifStream( Vector3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Vector3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Vector3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Vector3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Float2
-void NifStream( Float2 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float2 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float2 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float2 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix22
-void NifStream( Matrix22 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix22 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix22 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix22 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Float3
-void NifStream( Float3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix33
-void NifStream( Matrix33 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix33 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix33 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix33 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Float4
-void NifStream( Float4 & val, istream& in, unsigned int version = 0 );
-void NifStream( Float4 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Float4 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Float4 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Matrix44
-void NifStream( Matrix44 & val, istream& in, unsigned int version = 0 );
-void NifStream( Matrix44 const & val, ostream& out, unsigned int version = 0 );
+void NifStream( Matrix44 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Matrix44 const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 //Color3
-void NifStream( Color3 & val, istream& in, unsigned int version = 0 );
-void NifStream( Color3 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Color3 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Color3 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Color4
-void NifStream( Color4 & val, istream& in, unsigned int version = 0 );
-void NifStream( Color4 const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Color4 & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Color4 const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //Quaternion
-void NifStream( Quaternion & val, istream& in, unsigned int version = 0 );
-void NifStream( Quaternion const & val, ostream& out, unsigned int version = 0  );
+void NifStream( Quaternion & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( Quaternion const & val, ostream& out, const NifInfo & info = NifInfo()  );
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, unsigned int & version ); //Sets the passed in version varible
-void NifStream( HeaderString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( HeaderString & val, istream& in, NifInfo & info ); //Sets the passed in info
+void NifStream( HeaderString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, HeaderString const & val );
 
 //LineString
-void NifStream( LineString & val, istream& in, unsigned int version );
-void NifStream( LineString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( LineString & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( LineString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, LineString const & val );
 
 //ShortString
-void NifStream( ShortString & val, istream& in, unsigned int version = 0 );
-void NifStream( ShortString const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ShortString & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ShortString const & val, ostream& out, const NifInfo & info = NifInfo()  );
 ostream & operator<<( ostream & out, ShortString const & val );
 
 //--Templates--//
 
-void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyType type );
-void NifStream( Key<Quaternion> const & key, ostream& file, unsigned int version,  KeyType type );
+void NifStream( Key<Quaternion> & key, istream& file, const NifInfo & info, KeyType type );
+void NifStream( Key<Quaternion> const & key, ostream& file, const NifInfo & info,  KeyType type );
 
 //Key<T>
 template <class T> 
-void NifStream( Key<T> & key, istream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<T> & key, istream& file, const NifInfo & info, KeyType type ) {
 	key.time = ReadFloat( file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -384,12 +384,12 @@ void NifStream( Key<T> & key, istream& file, unsigned int version, KeyType type
 }
 
 template <class T> 
-void NifStream( Key<T> & key, istream & file, unsigned int version, int type ) {
-	NifStream( key, file, version, (KeyType)type );
+void NifStream( Key<T> & key, istream & file, const NifInfo & info, int type ) {
+	NifStream( key, file, info, (KeyType)type );
 }
 
 template <class T> 
-void NifStream( Key<T> const & key, ostream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<T> const & key, ostream& file, const NifInfo & info, KeyType type ) {
 	WriteFloat( key.time, file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -413,8 +413,8 @@ void NifStream( Key<T> const & key, ostream& file, unsigned int version, KeyType
 }
 
 template <class T> 
-void NifStream( Key<T> const & key, ostream & file, unsigned int version, int type ) {
-	NifStream( key, file, version, (KeyType)type );
+void NifStream( Key<T> const & key, ostream & file, const NifInfo & info, int type ) {
+	NifStream( key, file, info, (KeyType)type );
 }
 
 //The HexString function creates a formatted hex display of the given data for use in printing
diff --git a/include/gen/Footer.h b/include/gen/Footer.h
index 32bb6a29..908ddb4d 100644
--- a/include/gen/Footer.h
+++ b/include/gen/Footer.h
@@ -44,8 +44,8 @@ struct Footer {
 	 * Bip Head node).
 	 */
 	vector<Ref<NiObject > > roots;
-	NIFLIB_HIDDEN void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_HIDDEN string asString( bool verbose = false ) const;
 };
 
diff --git a/include/gen/Header.h b/include/gen/Header.h
index 03856697..1fc59eb4 100644
--- a/include/gen/Header.h
+++ b/include/gen/Header.h
@@ -95,8 +95,8 @@ struct Header {
 	 * Unknown.
 	 */
 	unsigned int unknownInt2;
-	NIFLIB_HIDDEN void Read( istream& in );
-	NIFLIB_HIDDEN void Write( ostream& out ) const;
+	NIFLIB_HIDDEN NifInfo Read( istream& in );
+	NIFLIB_HIDDEN void Write( ostream& out, const NifInfo & info = NifInfo() ) const;
 	NIFLIB_HIDDEN string asString( bool verbose = false ) const;
 };
 
diff --git a/include/gen/enums_intl.h b/include/gen/enums_intl.h
index 67cef47d..1d4d0908 100644
--- a/include/gen/enums_intl.h
+++ b/include/gen/enums_intl.h
@@ -18,134 +18,134 @@ namespace Niflib {
 
 //---ForceType---//
 
-void NifStream( ForceType & val, istream& in, unsigned int version = 0 );
-void NifStream( ForceType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ForceType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ForceType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---HavokMaterial---//
 
-void NifStream( HavokMaterial & val, istream& in, unsigned int version = 0 );
-void NifStream( HavokMaterial const & val, ostream& out, unsigned int version = 0  );
+void NifStream( HavokMaterial & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( HavokMaterial const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---CompareMode---//
 
-void NifStream( CompareMode & val, istream& in, unsigned int version = 0 );
-void NifStream( CompareMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( CompareMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( CompareMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexFilterMode---//
 
-void NifStream( TexFilterMode & val, istream& in, unsigned int version = 0 );
-void NifStream( TexFilterMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexFilterMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexFilterMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---LightMode---//
 
-void NifStream( LightMode & val, istream& in, unsigned int version = 0 );
-void NifStream( LightMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( LightMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( LightMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MipMapFormat---//
 
-void NifStream( MipMapFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( MipMapFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MipMapFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MipMapFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---StencilAction---//
 
-void NifStream( StencilAction & val, istream& in, unsigned int version = 0 );
-void NifStream( StencilAction const & val, ostream& out, unsigned int version = 0  );
+void NifStream( StencilAction & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( StencilAction const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---OblivionLayer---//
 
-void NifStream( OblivionLayer & val, istream& in, unsigned int version = 0 );
-void NifStream( OblivionLayer const & val, ostream& out, unsigned int version = 0  );
+void NifStream( OblivionLayer & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( OblivionLayer const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---FaceDrawMode---//
 
-void NifStream( FaceDrawMode & val, istream& in, unsigned int version = 0 );
-void NifStream( FaceDrawMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( FaceDrawMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( FaceDrawMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---AlphaFormat---//
 
-void NifStream( AlphaFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( AlphaFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( AlphaFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( AlphaFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---KeyType---//
 
-void NifStream( KeyType & val, istream& in, unsigned int version = 0 );
-void NifStream( KeyType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( KeyType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( KeyType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---VertMode---//
 
-void NifStream( VertMode & val, istream& in, unsigned int version = 0 );
-void NifStream( VertMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( VertMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( VertMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---ApplyMode---//
 
-void NifStream( ApplyMode & val, istream& in, unsigned int version = 0 );
-void NifStream( ApplyMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( ApplyMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( ApplyMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MotionSystem---//
 
-void NifStream( MotionSystem & val, istream& in, unsigned int version = 0 );
-void NifStream( MotionSystem const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MotionSystem & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MotionSystem const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---BillboardMode---//
 
-void NifStream( BillboardMode & val, istream& in, unsigned int version = 0 );
-void NifStream( BillboardMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( BillboardMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( BillboardMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexType---//
 
-void NifStream( TexType & val, istream& in, unsigned int version = 0 );
-void NifStream( TexType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---PixelLayout---//
 
-void NifStream( PixelLayout & val, istream& in, unsigned int version = 0 );
-void NifStream( PixelLayout const & val, ostream& out, unsigned int version = 0  );
+void NifStream( PixelLayout & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( PixelLayout const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---TexClampMode---//
 
-void NifStream( TexClampMode & val, istream& in, unsigned int version = 0 );
-void NifStream( TexClampMode const & val, ostream& out, unsigned int version = 0  );
+void NifStream( TexClampMode & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( TexClampMode const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---MotionQuality---//
 
-void NifStream( MotionQuality & val, istream& in, unsigned int version = 0 );
-void NifStream( MotionQuality const & val, ostream& out, unsigned int version = 0  );
+void NifStream( MotionQuality & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( MotionQuality const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---PixelFormat---//
 
-void NifStream( PixelFormat & val, istream& in, unsigned int version = 0 );
-void NifStream( PixelFormat const & val, ostream& out, unsigned int version = 0  );
+void NifStream( PixelFormat & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( PixelFormat const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---CycleType---//
 
-void NifStream( CycleType & val, istream& in, unsigned int version = 0 );
-void NifStream( CycleType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( CycleType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( CycleType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 
 //---FieldType---//
 
-void NifStream( FieldType & val, istream& in, unsigned int version = 0 );
-void NifStream( FieldType const & val, ostream& out, unsigned int version = 0  );
+void NifStream( FieldType & val, istream& in, const NifInfo & info = NifInfo() );
+void NifStream( FieldType const & val, ostream& out, const NifInfo & info = NifInfo() );
 
 }
 #endif
diff --git a/include/nif_basic_types.h b/include/nif_basic_types.h
index 946b625b..ef1b7191 100644
--- a/include/nif_basic_types.h
+++ b/include/nif_basic_types.h
@@ -6,6 +6,8 @@ All rights reserved.  Please see niflib.h for licence. */
 
 #include <string>
 #include "gen/enums.h"
+#include "nif_versions.h"
+
 namespace Niflib {
 using namespace std;
 
@@ -26,6 +28,39 @@ struct LineString {
 typedef unsigned char	byte;
 #endif
 
+/*! Specifies the low-level nature of the storage process */
+enum EndianType {
+	BIG_ENDIAN = 0, /*!< Big Endian storage, such as that used by PowerPC processors */
+	LITTLE_ENDIAN = 1 /*!< Little Endian storage, such as that used by x86 processors */
+};
+
+//--Structures--//
+
+/*! 
+ * Used to specify optional ways the NIF file is to be written or retrieve information about
+ * the way an existing file was stored. 
+ */
+struct NifInfo {
+	NifInfo() : version(VER_4_0_0_2), userVersion(0), userVersion2(0), endian(LITTLE_ENDIAN) {}
+	NifInfo( unsigned version, unsigned userVersion = 0, unsigned userVersion2 = 0) {
+		this->version = version;
+		this->userVersion = userVersion;
+		this->userVersion2 = userVersion2;
+		endian = LITTLE_ENDIAN;
+	}
+	unsigned version;
+	unsigned userVersion;
+	unsigned userVersion2;
+	/*! Specifies which low-level number storage format to use. Should match the processor type for the target system. */
+	EndianType endian;
+	/*! This is only supported in Oblivion.  It contains the name of the person who created the NIF file. */
+	string creator;
+	/*! This is only supported in Oblivion.  It seems to contiain the type of script or program used to export the file. */
+	string exportInfo1;
+	/*! This is only supported in Oblivion.  It seems to contain the more specific script or options of the above. */
+	string exportInfo2;
+};
+
 //TODO:  This is temporary to make it compile.  Should eventually be adjusted to display 1's and 0's insted of as an int.
 typedef unsigned short Flags;
 }
diff --git a/include/niflib.h b/include/niflib.h
index 2177a51c..c8a8110b 100644
--- a/include/niflib.h
+++ b/include/niflib.h
@@ -84,34 +84,6 @@ enum ExportOptions {
 	EXPORT_KF_MULTI = 4 /*!< multiple KF */
 };
 
-//--Structures--//
-
-struct NifInfo {
-	NifInfo() : version(VER_4_0_0_2), userVersion(0), userVersion2(0), endian(INFO_LITTLE_ENDIAN) {}
-	NifInfo( unsigned version, unsigned userVersion = 0, unsigned userVersion2 = 0) {
-		this->version = version;
-		this->userVersion = userVersion;
-		this->userVersion2 = userVersion2;
-		endian = INFO_LITTLE_ENDIAN;
-	}
-	//TODO: Implement endian support
-	enum EndianType {
-		INFO_BIG_ENDIAN = 0,
-		INFO_LITTLE_ENDIAN = 1
-	}; 
-	unsigned version;
-	unsigned userVersion;
-	unsigned  userVersion2;
-	/*! This is not yet supported. */
-	EndianType endian;
-	/*! This is only supported in Oblivion.  It contains the name of the person who created the NIF file. */
-	string creator;
-	/*! This is only supported in Oblivion.  It seems to contiain the type of script or program used to export the file. */
-	string exportInfo1;
-	/*! This is only supported in Oblivion.  It seems to contain the more specific script or options of the above. */
-	string exportInfo2;
-};
-
 //--Main Functions--//
 
 /*!
@@ -219,7 +191,7 @@ NIFLIB_API Ref<NiObject> ReadNifTree( istream & in, NifInfo * info = NULL );
  * 
  * \sa ReadNifList, WriteNifTree
  */
-NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const NifInfo & info );
+NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const NifInfo & info = NifInfo() );
 
 /*!
  * Writes a nif tree to an ostream starting at the given root block.
@@ -227,7 +199,7 @@ NIFLIB_API void WriteNifTree( string const & file_name, NiObject * root, const N
  * \param[in] root The root block to start from when writing out the NIF data.  All decedents of this block will be written to the stream in tree-descending order.
  * \param[in] info A NifInfo structure that contains information such as the version of the NIF file to create.
  */
-NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & info );
+NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & info = NifInfo() );
 
 /*!
  * Writes a bunch of files given a base file name, and a pointer to the root block of the Nif file tree.
@@ -237,7 +209,7 @@ NIFLIB_API void WriteNifTree( ostream & in, NiObject * root, const NifInfo & inf
  * \param[in] export_files What files to write: NIF, NIF + KF + KFM, NIF + KF's + KFM, KF only, KF's only
  * \param[in] kf_type The KF type (Morrowind style, DAoC style, CivIV style, ...)
  */
-NIFLIB_API void WriteFileGroup( string const & file_name, NiObject * root, const NifInfo & info, ExportOptions export_files = EXPORT_NIF, NifGame kf_type = KF_MW);
+NIFLIB_API void WriteFileGroup( string const & file_name, NiObject * root, const NifInfo & info = NifInfo(), ExportOptions export_files = EXPORT_NIF, NifGame kf_type = KF_MW);
 
 /*!
  * Creates a clone of an entire tree of objects.
diff --git a/include/obj/ABoneLODController.h b/include/obj/ABoneLODController.h
index 59e1b11c..6175d21d 100644
--- a/include/obj/ABoneLODController.h
+++ b/include/obj/ABoneLODController.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -75,10 +75,10 @@ public:
 protected:
 	A_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AKeyedData.h b/include/obj/AKeyedData.h
index 10690090..394e9798 100644
--- a/include/obj/AKeyedData.h
+++ b/include/obj/AKeyedData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_KEYED_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/APSysCtlr.h b/include/obj/APSysCtlr.h
index 683c3869..706ee54c 100644
--- a/include/obj/APSysCtlr.h
+++ b/include/obj/APSysCtlr.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	A_P_SYS_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/APSysData.h b/include/obj/APSysData.h
index 30cde046..acbf4ef6 100644
--- a/include/obj/APSysData.h
+++ b/include/obj/APSysData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AParticleModifier.h b/include/obj/AParticleModifier.h
index c462d4a3..101be6f8 100644
--- a/include/obj/AParticleModifier.h
+++ b/include/obj/AParticleModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	A_PARTICLE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkConstraint.h b/include/obj/AbhkConstraint.h
index c3f5a7b3..7014cf2c 100644
--- a/include/obj/AbhkConstraint.h
+++ b/include/obj/AbhkConstraint.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkRagdollConstraint.h b/include/obj/AbhkRagdollConstraint.h
index c0010df5..11f2a52c 100644
--- a/include/obj/AbhkRagdollConstraint.h
+++ b/include/obj/AbhkRagdollConstraint.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_RAGDOLL_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AbhkShapeCollection.h b/include/obj/AbhkShapeCollection.h
index b714762d..3e13baf5 100644
--- a/include/obj/AbhkShapeCollection.h
+++ b/include/obj/AbhkShapeCollection.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ABHK_SHAPE_COLLECTION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/AvoidNode.h b/include/obj/AvoidNode.h
index c4fa25e7..486ca001 100644
--- a/include/obj/AvoidNode.h
+++ b/include/obj/AvoidNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	AVOID_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSBound.h b/include/obj/BSBound.h
index 5be87a32..7db2acb2 100644
--- a/include/obj/BSBound.h
+++ b/include/obj/BSBound.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	B_S_BOUND_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSFurnitureMarker.h b/include/obj/BSFurnitureMarker.h
index 38802c2b..f944626e 100644
--- a/include/obj/BSFurnitureMarker.h
+++ b/include/obj/BSFurnitureMarker.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<FurniturePosition> GetFurniturePositions() const;
@@ -42,10 +42,10 @@ public:
 protected:
 	B_S_FURNITURE_MARKER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSKeyframeController.h b/include/obj/BSKeyframeController.h
index 742521b5..ad05e261 100644
--- a/include/obj/BSKeyframeController.h
+++ b/include/obj/BSKeyframeController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_KEYFRAME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSPSysArrayEmitter.h b/include/obj/BSPSysArrayEmitter.h
index 088276a8..2d56fdca 100644
--- a/include/obj/BSPSysArrayEmitter.h
+++ b/include/obj/BSPSysArrayEmitter.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_P_SYS_ARRAY_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSParentVelocityModifier.h b/include/obj/BSParentVelocityModifier.h
index 391d54dd..8a7ae38a 100644
--- a/include/obj/BSParentVelocityModifier.h
+++ b/include/obj/BSParentVelocityModifier.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	B_S_PARENT_VELOCITY_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/BSXFlags.h b/include/obj/BSXFlags.h
index 965fc552..4027ffcd 100644
--- a/include/obj/BSXFlags.h
+++ b/include/obj/BSXFlags.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	B_S_X_FLAGS_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxButton.h b/include/obj/FxButton.h
index 55700594..e7b1c3a9 100644
--- a/include/obj/FxButton.h
+++ b/include/obj/FxButton.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_BUTTON_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxRadioButton.h b/include/obj/FxRadioButton.h
index 336db71f..a1b0deb8 100644
--- a/include/obj/FxRadioButton.h
+++ b/include/obj/FxRadioButton.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_RADIO_BUTTON_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/FxWidget.h b/include/obj/FxWidget.h
index e1e9efd4..a1e864ff 100644
--- a/include/obj/FxWidget.h
+++ b/include/obj/FxWidget.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	FX_WIDGET_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAVObject.h b/include/obj/NiAVObject.h
index 66b64141..bd5c896f 100644
--- a/include/obj/NiAVObject.h
+++ b/include/obj/NiAVObject.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  What to do with newer files that have a link for a bounding box?  Wrap this in a function and translate?
@@ -125,10 +125,10 @@ protected:
 	NiNode * parent;
 	NI_A_V_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAlphaController.h b/include/obj/NiAlphaController.h
index f64387cb..5e17e9cb 100644
--- a/include/obj/NiAlphaController.h
+++ b/include/obj/NiAlphaController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ALPHA_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAlphaProperty.h b/include/obj/NiAlphaProperty.h
index f7200f89..43ee9777 100644
--- a/include/obj/NiAlphaProperty.h
+++ b/include/obj/NiAlphaProperty.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	enum BlendMode {
@@ -83,10 +83,10 @@ public:
 protected:
 	NI_ALPHA_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAmbientLight.h b/include/obj/NiAmbientLight.h
index e337e648..4ede5052 100644
--- a/include/obj/NiAmbientLight.h
+++ b/include/obj/NiAmbientLight.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AMBIENT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAutoNormalParticles.h b/include/obj/NiAutoNormalParticles.h
index 7e5c7a25..e51334ee 100644
--- a/include/obj/NiAutoNormalParticles.h
+++ b/include/obj/NiAutoNormalParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AUTO_NORMAL_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiAutoNormalParticlesData.h b/include/obj/NiAutoNormalParticlesData.h
index 3e2a75a8..4aa91707 100644
--- a/include/obj/NiAutoNormalParticlesData.h
+++ b/include/obj/NiAutoNormalParticlesData.h
@@ -28,19 +28,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_AUTO_NORMAL_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSAnimationNode.h b/include/obj/NiBSAnimationNode.h
index 39ffb4d8..122ed7a7 100644
--- a/include/obj/NiBSAnimationNode.h
+++ b/include/obj/NiBSAnimationNode.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_ANIMATION_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSBoneLODController.h b/include/obj/NiBSBoneLODController.h
index b8c09ddb..e906e340 100644
--- a/include/obj/NiBSBoneLODController.h
+++ b/include/obj/NiBSBoneLODController.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSPArrayController.h b/include/obj/NiBSPArrayController.h
index c6d1fc18..a16437ed 100644
--- a/include/obj/NiBSPArrayController.h
+++ b/include/obj/NiBSPArrayController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_P_ARRAY_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSParticleNode.h b/include/obj/NiBSParticleNode.h
index ec08c973..2223fb3a 100644
--- a/include/obj/NiBSParticleNode.h
+++ b/include/obj/NiBSParticleNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_S_PARTICLE_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineBasisData.h b/include/obj/NiBSplineBasisData.h
index 04f46b1b..c5b09baa 100644
--- a/include/obj/NiBSplineBasisData.h
+++ b/include/obj/NiBSplineBasisData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_B_SPLINE_BASIS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompFloatInterpolator.h b/include/obj/NiBSplineCompFloatInterpolator.h
index 1ed8d5c8..9e7cf5e5 100644
--- a/include/obj/NiBSplineCompFloatInterpolator.h
+++ b/include/obj/NiBSplineCompFloatInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompPoint3Interpolator.h b/include/obj/NiBSplineCompPoint3Interpolator.h
index b002d863..58a63ecc 100644
--- a/include/obj/NiBSplineCompPoint3Interpolator.h
+++ b/include/obj/NiBSplineCompPoint3Interpolator.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineCompTransformInterpolator.h b/include/obj/NiBSplineCompTransformInterpolator.h
index 7c158ccd..6349fd83 100644
--- a/include/obj/NiBSplineCompTransformInterpolator.h
+++ b/include/obj/NiBSplineCompTransformInterpolator.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -132,10 +132,10 @@ public:
 protected:
 	NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineData.h b/include/obj/NiBSplineData.h
index 1a80ac6c..53bf01fd 100644
--- a/include/obj/NiBSplineData.h
+++ b/include/obj/NiBSplineData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    /*!
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_B_SPLINE_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBSplineInterpolator.h b/include/obj/NiBSplineInterpolator.h
index 4ccc17a1..ad574bfa 100644
--- a/include/obj/NiBSplineInterpolator.h
+++ b/include/obj/NiBSplineInterpolator.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -68,10 +68,10 @@ protected:
 protected:
 	NI_B_SPLINE_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBillboardNode.h b/include/obj/NiBillboardNode.h
index bbe23ef9..3a0bdf44 100644
--- a/include/obj/NiBillboardNode.h
+++ b/include/obj/NiBillboardNode.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -44,10 +44,10 @@ public:
 protected:
 	NI_BILLBOARD_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBinaryExtraData.h b/include/obj/NiBinaryExtraData.h
index e73694de..e02e8639 100644
--- a/include/obj/NiBinaryExtraData.h
+++ b/include/obj/NiBinaryExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<byte> GetData() const;
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_BINARY_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendBoolInterpolator.h b/include/obj/NiBlendBoolInterpolator.h
index e6a8d806..a8dc3867 100644
--- a/include/obj/NiBlendBoolInterpolator.h
+++ b/include/obj/NiBlendBoolInterpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_BOOL_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendFloatInterpolator.h b/include/obj/NiBlendFloatInterpolator.h
index f87b813d..f87ef461 100644
--- a/include/obj/NiBlendFloatInterpolator.h
+++ b/include/obj/NiBlendFloatInterpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendInterpolator.h b/include/obj/NiBlendInterpolator.h
index fefc686e..ef509b04 100644
--- a/include/obj/NiBlendInterpolator.h
+++ b/include/obj/NiBlendInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BLEND_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendPoint3Interpolator.h b/include/obj/NiBlendPoint3Interpolator.h
index e2a68221..a1aabef6 100644
--- a/include/obj/NiBlendPoint3Interpolator.h
+++ b/include/obj/NiBlendPoint3Interpolator.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	NI_BLEND_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBlendTransformInterpolator.h b/include/obj/NiBlendTransformInterpolator.h
index e97636ae..c0bfe09b 100644
--- a/include/obj/NiBlendTransformInterpolator.h
+++ b/include/obj/NiBlendTransformInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BLEND_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoneLODController.h b/include/obj/NiBoneLODController.h
index 44d6921e..65cb0573 100644
--- a/include/obj/NiBoneLODController.h
+++ b/include/obj/NiBoneLODController.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_BONE_L_O_D_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolData.h b/include/obj/NiBoolData.h
index f5dec030..0d1e6456 100644
--- a/include/obj/NiBoolData.h
+++ b/include/obj/NiBoolData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of boolean interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_BOOL_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolInterpolator.h b/include/obj/NiBoolInterpolator.h
index d34062d3..d0251a5e 100644
--- a/include/obj/NiBoolInterpolator.h
+++ b/include/obj/NiBoolInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_BOOL_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBoolTimelineInterpolator.h b/include/obj/NiBoolTimelineInterpolator.h
index 99255ccf..86c372b7 100644
--- a/include/obj/NiBoolTimelineInterpolator.h
+++ b/include/obj/NiBoolTimelineInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_BOOL_TIMELINE_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiBooleanExtraData.h b/include/obj/NiBooleanExtraData.h
index f2d4e5bd..8a5b31ae 100644
--- a/include/obj/NiBooleanExtraData.h
+++ b/include/obj/NiBooleanExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API bool GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_BOOLEAN_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCamera.h b/include/obj/NiCamera.h
index da24170d..f94c7f29 100644
--- a/include/obj/NiCamera.h
+++ b/include/obj/NiCamera.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -114,10 +114,10 @@ public:
 protected:
 	NI_CAMERA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClod.h b/include/obj/NiClod.h
index 8743e0b0..16682663 100644
--- a/include/obj/NiClod.h
+++ b/include/obj/NiClod.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClodData.h b/include/obj/NiClodData.h
index a10bc1a4..a055295b 100644
--- a/include/obj/NiClodData.h
+++ b/include/obj/NiClodData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiClodSkinInstance.h b/include/obj/NiClodSkinInstance.h
index 6fddf464..95a8d752 100644
--- a/include/obj/NiClodSkinInstance.h
+++ b/include/obj/NiClodSkinInstance.h
@@ -28,19 +28,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_CLOD_SKIN_INSTANCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCollisionData.h b/include/obj/NiCollisionData.h
index df6c8f08..c41686ae 100644
--- a/include/obj/NiCollisionData.h
+++ b/include/obj/NiCollisionData.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_COLLISION_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiCollisionObject.h b/include/obj/NiCollisionObject.h
index a5358722..07fefab4 100644
--- a/include/obj/NiCollisionObject.h
+++ b/include/obj/NiCollisionObject.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiColorData.h b/include/obj/NiColorData.h
index 8c6f98ff..5f3af773 100644
--- a/include/obj/NiColorData.h
+++ b/include/obj/NiColorData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of color interpolation being used.
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_COLOR_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiColorExtraData.h b/include/obj/NiColorExtraData.h
index 40c78428..6929ac90 100644
--- a/include/obj/NiColorExtraData.h
+++ b/include/obj/NiColorExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Color4 GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_COLOR_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiControllerManager.h b/include/obj/NiControllerManager.h
index e19f1dea..a9755dd6 100644
--- a/include/obj/NiControllerManager.h
+++ b/include/obj/NiControllerManager.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -63,10 +63,10 @@ public:
 protected:
 	NI_CONTROLLER_MANAGER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiControllerSequence.h b/include/obj/NiControllerSequence.h
index 8dc96021..ac62a068 100644
--- a/include/obj/NiControllerSequence.h
+++ b/include/obj/NiControllerSequence.h
@@ -36,10 +36,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -173,10 +173,10 @@ protected:
 
 	NI_CONTROLLER_SEQUENCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDefaultAVObjectPalette.h b/include/obj/NiDefaultAVObjectPalette.h
index 599a8d8a..ee73b713 100644
--- a/include/obj/NiDefaultAVObjectPalette.h
+++ b/include/obj/NiDefaultAVObjectPalette.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_DEFAULT_A_V_OBJECT_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDirectionalLight.h b/include/obj/NiDirectionalLight.h
index 04c73d39..4a2bc6de 100644
--- a/include/obj/NiDirectionalLight.h
+++ b/include/obj/NiDirectionalLight.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_DIRECTIONAL_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDitherProperty.h b/include/obj/NiDitherProperty.h
index 072d229e..d680c665 100644
--- a/include/obj/NiDitherProperty.h
+++ b/include/obj/NiDitherProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_DITHER_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiDynamicEffect.h b/include/obj/NiDynamicEffect.h
index 19d1864c..d790cbb3 100644
--- a/include/obj/NiDynamicEffect.h
+++ b/include/obj/NiDynamicEffect.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -62,10 +62,10 @@ public:
 protected:
 	NI_DYNAMIC_EFFECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiExtraData.h b/include/obj/NiExtraData.h
index d89badc7..47253b2c 100644
--- a/include/obj/NiExtraData.h
+++ b/include/obj/NiExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Returns a reference to the next extra data used in early version NIF
@@ -71,10 +71,10 @@ public:
 protected:
 	NI_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFlipController.h b/include/obj/NiFlipController.h
index 335d0b67..933f69dc 100644
--- a/include/obj/NiFlipController.h
+++ b/include/obj/NiFlipController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_FLIP_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatData.h b/include/obj/NiFloatData.h
index c952c53a..35a9fb7c 100644
--- a/include/obj/NiFloatData.h
+++ b/include/obj/NiFloatData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of float interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_FLOAT_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatExtraData.h b/include/obj/NiFloatExtraData.h
index 938f8f89..3b53c8a2 100644
--- a/include/obj/NiFloatExtraData.h
+++ b/include/obj/NiFloatExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API float GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_FLOAT_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatExtraDataController.h b/include/obj/NiFloatExtraDataController.h
index f85277b9..96b59b30 100644
--- a/include/obj/NiFloatExtraDataController.h
+++ b/include/obj/NiFloatExtraDataController.h
@@ -32,20 +32,20 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  The function of all data is currently unknown.
 protected:
 	NI_FLOAT_EXTRA_DATA_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatInterpolator.h b/include/obj/NiFloatInterpolator.h
index dc9842d9..a6a3ba20 100644
--- a/include/obj/NiFloatInterpolator.h
+++ b/include/obj/NiFloatInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_FLOAT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFloatsExtraData.h b/include/obj/NiFloatsExtraData.h
index 36e8c8e4..8ddb4db7 100644
--- a/include/obj/NiFloatsExtraData.h
+++ b/include/obj/NiFloatsExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<float> GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_FLOATS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiFogProperty.h b/include/obj/NiFogProperty.h
index 4a480094..1fe751c9 100644
--- a/include/obj/NiFogProperty.h
+++ b/include/obj/NiFogProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_FOG_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeomMorpherController.h b/include/obj/NiGeomMorpherController.h
index c4989c1e..4a752abb 100644
--- a/include/obj/NiGeomMorpherController.h
+++ b/include/obj/NiGeomMorpherController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO: lots of unknown data in this object
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_GEOM_MORPHER_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeometry.h b/include/obj/NiGeometry.h
index 4bbf843f..6f5688a5 100644
--- a/include/obj/NiGeometry.h
+++ b/include/obj/NiGeometry.h
@@ -38,10 +38,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -104,10 +104,10 @@ protected:
 	list< Ref<NiNode> > ListAncestors( const Ref<NiNode> & leaf ) const;
 	NI_GEOMETRY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGeometryData.h b/include/obj/NiGeometryData.h
index 120e9902..89aa7775 100644
--- a/include/obj/NiGeometryData.h
+++ b/include/obj/NiGeometryData.h
@@ -36,10 +36,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//--Counts--//
@@ -137,10 +137,10 @@ public:
 protected:
 	NI_GEOMETRY_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiGravity.h b/include/obj/NiGravity.h
index 998c9baf..dc7e2887 100644
--- a/include/obj/NiGravity.h
+++ b/include/obj/NiGravity.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_GRAVITY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiImage.h b/include/obj/NiImage.h
index 0abdc2e0..fff2826a 100644
--- a/include/obj/NiImage.h
+++ b/include/obj/NiImage.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_IMAGE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiIntegerExtraData.h b/include/obj/NiIntegerExtraData.h
index 6eb96be2..bdaf6668 100644
--- a/include/obj/NiIntegerExtraData.h
+++ b/include/obj/NiIntegerExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned int GetData() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_INTEGER_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiIntegersExtraData.h b/include/obj/NiIntegersExtraData.h
index 916e2bfb..bfb24461 100644
--- a/include/obj/NiIntegersExtraData.h
+++ b/include/obj/NiIntegersExtraData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_INTEGERS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiInterpolator.h b/include/obj/NiInterpolator.h
index 44b632b5..18324b9b 100644
--- a/include/obj/NiInterpolator.h
+++ b/include/obj/NiInterpolator.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiKeyframeController.h b/include/obj/NiKeyframeController.h
index e9588547..6835017f 100644
--- a/include/obj/NiKeyframeController.h
+++ b/include/obj/NiKeyframeController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Ref<NiKeyframeData> GetData() const;
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_KEYFRAME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiKeyframeData.h b/include/obj/NiKeyframeData.h
index f18fc492..24ad1eeb 100644
--- a/include/obj/NiKeyframeData.h
+++ b/include/obj/NiKeyframeData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//--Rotate--//
@@ -188,10 +188,10 @@ protected:
 	void UpdateRotationKeyCount();
 	NI_KEYFRAME_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLODData.h b/include/obj/NiLODData.h
index 0abed3f2..3bb3381c 100644
--- a/include/obj/NiLODData.h
+++ b/include/obj/NiLODData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLODNode.h b/include/obj/NiLODNode.h
index 58951cdc..1b9469ec 100644
--- a/include/obj/NiLODNode.h
+++ b/include/obj/NiLODNode.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -74,10 +74,10 @@ public:
 protected:
 	NI_L_O_D_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLight.h b/include/obj/NiLight.h
index 76114b2c..5df57bb2 100644
--- a/include/obj/NiLight.h
+++ b/include/obj/NiLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLightColorController.h b/include/obj/NiLightColorController.h
index 295419a2..04c66612 100644
--- a/include/obj/NiLightColorController.h
+++ b/include/obj/NiLightColorController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_LIGHT_COLOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLightDimmerController.h b/include/obj/NiLightDimmerController.h
index bb2b2eac..35e0b7a1 100644
--- a/include/obj/NiLightDimmerController.h
+++ b/include/obj/NiLightDimmerController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_LIGHT_DIMMER_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLookAtController.h b/include/obj/NiLookAtController.h
index 0db231cc..c494be87 100644
--- a/include/obj/NiLookAtController.h
+++ b/include/obj/NiLookAtController.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_LOOK_AT_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiLookAtInterpolator.h b/include/obj/NiLookAtInterpolator.h
index be404d65..5be94f15 100644
--- a/include/obj/NiLookAtInterpolator.h
+++ b/include/obj/NiLookAtInterpolator.h
@@ -34,10 +34,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -67,10 +67,10 @@ public:
 protected:
 	NI_LOOK_AT_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMaterialColorController.h b/include/obj/NiMaterialColorController.h
index 96af97a9..795eccd0 100644
--- a/include/obj/NiMaterialColorController.h
+++ b/include/obj/NiMaterialColorController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MATERIAL_COLOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMaterialProperty.h b/include/obj/NiMaterialProperty.h
index e00a0fa3..867e2c29 100644
--- a/include/obj/NiMaterialProperty.h
+++ b/include/obj/NiMaterialProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -58,10 +58,10 @@ public:
 protected:
 	NI_MATERIAL_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMeshPSysData.h b/include/obj/NiMeshPSysData.h
index 7c366a8d..99da15a9 100644
--- a/include/obj/NiMeshPSysData.h
+++ b/include/obj/NiMeshPSysData.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MESH_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMeshParticleSystem.h b/include/obj/NiMeshParticleSystem.h
index 43db165f..45620e43 100644
--- a/include/obj/NiMeshParticleSystem.h
+++ b/include/obj/NiMeshParticleSystem.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_MESH_PARTICLE_SYSTEM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMorphData.h b/include/obj/NiMorphData.h
index 0ed1c4cb..8704a8a3 100644
--- a/include/obj/NiMorphData.h
+++ b/include/obj/NiMorphData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the number of verticies used in the morph targets.  This must be the same as the number of verticies in the base mesh that the morph controller for which this block stores data is attatched.  This is not done automatically by Niflib.
@@ -102,10 +102,10 @@ public:
 protected:
 	NI_MORPH_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiMultiTargetTransformController.h b/include/obj/NiMultiTargetTransformController.h
index eaf2f41d..0d0fdd86 100644
--- a/include/obj/NiMultiTargetTransformController.h
+++ b/include/obj/NiMultiTargetTransformController.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_MULTI_TARGET_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiNode.h b/include/obj/NiNode.h
index e5fc84df..0367461e 100644
--- a/include/obj/NiNode.h
+++ b/include/obj/NiNode.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void AddChild( Ref<NiAVObject> obj );
@@ -106,10 +106,10 @@ protected:
 	list<NiSkinInstance*> skins;
 	NI_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiObject.h b/include/obj/NiObject.h
index 4a9a7200..98a8272b 100644
--- a/include/obj/NiObject.h
+++ b/include/obj/NiObject.h
@@ -63,9 +63,9 @@ public:
 	NIFLIB_API bool IsDerivedType( const NiObject * objct ) const;
 
 	//Streaming Functions
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {}
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {}
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {}
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {}
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {}
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {}
 
 	//Reference Counting
 	NIFLIB_API void AddRef() const; //Should not be called directly
@@ -140,10 +140,10 @@ private:
 	list<NiObject*> _cross_refs;
 	static unsigned int objectsInMemory;
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiObjectNET.h b/include/obj/NiObjectNET.h
index 8b7d180a..e48c1fd3 100644
--- a/include/obj/NiObjectNET.h
+++ b/include/obj/NiObjectNET.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetName();
@@ -62,10 +62,10 @@ public:
 private:
 	NI_OBJECT_N_E_T_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysAgeDeathModifier.h b/include/obj/NiPSysAgeDeathModifier.h
index 95082eda..90a27613 100644
--- a/include/obj/NiPSysAgeDeathModifier.h
+++ b/include/obj/NiPSysAgeDeathModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_AGE_DEATH_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBombModifier.h b/include/obj/NiPSysBombModifier.h
index eb328cd3..17008e4b 100644
--- a/include/obj/NiPSysBombModifier.h
+++ b/include/obj/NiPSysBombModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOMB_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBoundUpdateModifier.h b/include/obj/NiPSysBoundUpdateModifier.h
index da531353..56723f34 100644
--- a/include/obj/NiPSysBoundUpdateModifier.h
+++ b/include/obj/NiPSysBoundUpdateModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOUND_UPDATE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysBoxEmitter.h b/include/obj/NiPSysBoxEmitter.h
index 011d12c0..322baf14 100644
--- a/include/obj/NiPSysBoxEmitter.h
+++ b/include/obj/NiPSysBoxEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_BOX_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysColliderManager.h b/include/obj/NiPSysColliderManager.h
index 33d3ab2a..c2053595 100644
--- a/include/obj/NiPSysColliderManager.h
+++ b/include/obj/NiPSysColliderManager.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_COLLIDER_MANAGER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysColorModifier.h b/include/obj/NiPSysColorModifier.h
index bd1299f6..8d1a7e0b 100644
--- a/include/obj/NiPSysColorModifier.h
+++ b/include/obj/NiPSysColorModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_COLOR_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysCylinderEmitter.h b/include/obj/NiPSysCylinderEmitter.h
index d0f8b030..d58aeedc 100644
--- a/include/obj/NiPSysCylinderEmitter.h
+++ b/include/obj/NiPSysCylinderEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_CYLINDER_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysData.h b/include/obj/NiPSysData.h
index 0c981282..96489fe0 100644
--- a/include/obj/NiPSysData.h
+++ b/include/obj/NiPSysData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysDragModifier.h b/include/obj/NiPSysDragModifier.h
index 2c378296..ae6553c0 100644
--- a/include/obj/NiPSysDragModifier.h
+++ b/include/obj/NiPSysDragModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_DRAG_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitter.h b/include/obj/NiPSysEmitter.h
index a3d75f78..5b945e9d 100644
--- a/include/obj/NiPSysEmitter.h
+++ b/include/obj/NiPSysEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterCtlr.h b/include/obj/NiPSysEmitterCtlr.h
index 5823df60..c5c9fb0c 100644
--- a/include/obj/NiPSysEmitterCtlr.h
+++ b/include/obj/NiPSysEmitterCtlr.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_P_SYS_EMITTER_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterCtlrData.h b/include/obj/NiPSysEmitterCtlrData.h
index 2f0d59f1..f925bf8b 100644
--- a/include/obj/NiPSysEmitterCtlrData.h
+++ b/include/obj/NiPSysEmitterCtlrData.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -51,10 +51,10 @@ public:
 protected:
 	NI_P_SYS_EMITTER_CTLR_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterDeclinationCtlr.h b/include/obj/NiPSysEmitterDeclinationCtlr.h
index 13992062..c5fa2169 100644
--- a/include/obj/NiPSysEmitterDeclinationCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_DECLINATION_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterDeclinationVarCtlr.h b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
index 721785ba..89e5947a 100644
--- a/include/obj/NiPSysEmitterDeclinationVarCtlr.h
+++ b/include/obj/NiPSysEmitterDeclinationVarCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_DECLINATION_VAR_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterInitialRadiusCtlr.h b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
index e57ec268..11d6ced2 100644
--- a/include/obj/NiPSysEmitterInitialRadiusCtlr.h
+++ b/include/obj/NiPSysEmitterInitialRadiusCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_INITIAL_RADIUS_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterLifeSpanCtlr.h b/include/obj/NiPSysEmitterLifeSpanCtlr.h
index 5245f50b..0f92ef92 100644
--- a/include/obj/NiPSysEmitterLifeSpanCtlr.h
+++ b/include/obj/NiPSysEmitterLifeSpanCtlr.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysEmitterSpeedCtlr.h b/include/obj/NiPSysEmitterSpeedCtlr.h
index a3044ced..a45127f7 100644
--- a/include/obj/NiPSysEmitterSpeedCtlr.h
+++ b/include/obj/NiPSysEmitterSpeedCtlr.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_EMITTER_SPEED_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGravityModifier.h b/include/obj/NiPSysGravityModifier.h
index 79b45f26..091f51ef 100644
--- a/include/obj/NiPSysGravityModifier.h
+++ b/include/obj/NiPSysGravityModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GRAVITY_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGravityStrengthCtlr.h b/include/obj/NiPSysGravityStrengthCtlr.h
index 32ef22dd..0f3aa7e5 100644
--- a/include/obj/NiPSysGravityStrengthCtlr.h
+++ b/include/obj/NiPSysGravityStrengthCtlr.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GRAVITY_STRENGTH_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysGrowFadeModifier.h b/include/obj/NiPSysGrowFadeModifier.h
index d554bc8f..a4c930d8 100644
--- a/include/obj/NiPSysGrowFadeModifier.h
+++ b/include/obj/NiPSysGrowFadeModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_GROW_FADE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysMeshEmitter.h b/include/obj/NiPSysMeshEmitter.h
index da0e1bf7..a98aec53 100644
--- a/include/obj/NiPSysMeshEmitter.h
+++ b/include/obj/NiPSysMeshEmitter.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MESH_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysMeshUpdateModifier.h b/include/obj/NiPSysMeshUpdateModifier.h
index 34533167..6545240e 100644
--- a/include/obj/NiPSysMeshUpdateModifier.h
+++ b/include/obj/NiPSysMeshUpdateModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MESH_UPDATE_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysModifier.h b/include/obj/NiPSysModifier.h
index 7c9db3ab..2acafa5d 100644
--- a/include/obj/NiPSysModifier.h
+++ b/include/obj/NiPSysModifier.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysModifierActiveCtlr.h b/include/obj/NiPSysModifierActiveCtlr.h
index da7f7874..a0749ad7 100644
--- a/include/obj/NiPSysModifierActiveCtlr.h
+++ b/include/obj/NiPSysModifierActiveCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_MODIFIER_ACTIVE_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysPlanarCollider.h b/include/obj/NiPSysPlanarCollider.h
index 89643ed4..a6725448 100644
--- a/include/obj/NiPSysPlanarCollider.h
+++ b/include/obj/NiPSysPlanarCollider.h
@@ -34,19 +34,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_PLANAR_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysPositionModifier.h b/include/obj/NiPSysPositionModifier.h
index 249cb445..9c02f193 100644
--- a/include/obj/NiPSysPositionModifier.h
+++ b/include/obj/NiPSysPositionModifier.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_POSITION_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysResetOnLoopCtlr.h b/include/obj/NiPSysResetOnLoopCtlr.h
index 636fe9bd..c331bfd0 100644
--- a/include/obj/NiPSysResetOnLoopCtlr.h
+++ b/include/obj/NiPSysResetOnLoopCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_RESET_ON_LOOP_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysRotationModifier.h b/include/obj/NiPSysRotationModifier.h
index ac58a823..0c3ba6ca 100644
--- a/include/obj/NiPSysRotationModifier.h
+++ b/include/obj/NiPSysRotationModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_ROTATION_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysSpawnModifier.h b/include/obj/NiPSysSpawnModifier.h
index 0e6aaade..dfd7b707 100644
--- a/include/obj/NiPSysSpawnModifier.h
+++ b/include/obj/NiPSysSpawnModifier.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_SPAWN_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysSphereEmitter.h b/include/obj/NiPSysSphereEmitter.h
index 5c1341d9..43a0fe77 100644
--- a/include/obj/NiPSysSphereEmitter.h
+++ b/include/obj/NiPSysSphereEmitter.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_SPHERE_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysUpdateCtlr.h b/include/obj/NiPSysUpdateCtlr.h
index e1803af5..7e9995f4 100644
--- a/include/obj/NiPSysUpdateCtlr.h
+++ b/include/obj/NiPSysUpdateCtlr.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_UPDATE_CTLR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPSysVolumeEmitter.h b/include/obj/NiPSysVolumeEmitter.h
index 07899d10..d47ea75a 100644
--- a/include/obj/NiPSysVolumeEmitter.h
+++ b/include/obj/NiPSysVolumeEmitter.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_P_SYS_VOLUME_EMITTER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPalette.h b/include/obj/NiPalette.h
index 29cfbd8b..c6580807 100644
--- a/include/obj/NiPalette.h
+++ b/include/obj/NiPalette.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the palette data from this palette block.
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleBomb.h b/include/obj/NiParticleBomb.h
index 642c3939..a78d396c 100644
--- a/include/obj/NiParticleBomb.h
+++ b/include/obj/NiParticleBomb.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_BOMB_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleColorModifier.h b/include/obj/NiParticleColorModifier.h
index 1eab2310..4e331acd 100644
--- a/include/obj/NiParticleColorModifier.h
+++ b/include/obj/NiParticleColorModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_COLOR_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleGrowFade.h b/include/obj/NiParticleGrowFade.h
index 9fd0ed41..4468e835 100644
--- a/include/obj/NiParticleGrowFade.h
+++ b/include/obj/NiParticleGrowFade.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_GROW_FADE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshModifier.h b/include/obj/NiParticleMeshModifier.h
index 0901873a..0f8991b8 100644
--- a/include/obj/NiParticleMeshModifier.h
+++ b/include/obj/NiParticleMeshModifier.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESH_MODIFIER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshes.h b/include/obj/NiParticleMeshes.h
index bc67dd7a..d85a94cc 100644
--- a/include/obj/NiParticleMeshes.h
+++ b/include/obj/NiParticleMeshes.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESHES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleMeshesData.h b/include/obj/NiParticleMeshesData.h
index a72da38b..a4b2c32e 100644
--- a/include/obj/NiParticleMeshesData.h
+++ b/include/obj/NiParticleMeshesData.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_MESHES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleRotation.h b/include/obj/NiParticleRotation.h
index 377be562..842c0495 100644
--- a/include/obj/NiParticleRotation.h
+++ b/include/obj/NiParticleRotation.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_ROTATION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleSystem.h b/include/obj/NiParticleSystem.h
index 00a36682..375c2498 100644
--- a/include/obj/NiParticleSystem.h
+++ b/include/obj/NiParticleSystem.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLE_SYSTEM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticleSystemController.h b/include/obj/NiParticleSystemController.h
index 676f87f1..5563bf77 100644
--- a/include/obj/NiParticleSystemController.h
+++ b/include/obj/NiParticleSystemController.h
@@ -35,20 +35,20 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This controller is not a priority and it has a lot of unknown data.
 protected:
 	NI_PARTICLE_SYSTEM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticles.h b/include/obj/NiParticles.h
index a1b3957b..72c0d0f7 100644
--- a/include/obj/NiParticles.h
+++ b/include/obj/NiParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiParticlesData.h b/include/obj/NiParticlesData.h
index 6beecd78..fceadde1 100644
--- a/include/obj/NiParticlesData.h
+++ b/include/obj/NiParticlesData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPathController.h b/include/obj/NiPathController.h
index 5ded1879..f4602a80 100644
--- a/include/obj/NiPathController.h
+++ b/include/obj/NiPathController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This class has a lot of unknown data
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_PATH_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPathInterpolator.h b/include/obj/NiPathInterpolator.h
index b02c37bc..2e48e4c9 100644
--- a/include/obj/NiPathInterpolator.h
+++ b/include/obj/NiPathInterpolator.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_PATH_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPixelData.h b/include/obj/NiPixelData.h
index 9f9b67b3..d979a8ef 100644
--- a/include/obj/NiPixelData.h
+++ b/include/obj/NiPixelData.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the height of the texture image stored in this block.
@@ -81,10 +81,10 @@ public:
 protected:
 	NI_PIXEL_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPlanarCollider.h b/include/obj/NiPlanarCollider.h
index 3b8b1461..a2e0d244 100644
--- a/include/obj/NiPlanarCollider.h
+++ b/include/obj/NiPlanarCollider.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PLANAR_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPoint3Interpolator.h b/include/obj/NiPoint3Interpolator.h
index 45a78e41..201a4de0 100644
--- a/include/obj/NiPoint3Interpolator.h
+++ b/include/obj/NiPoint3Interpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -53,10 +53,10 @@ public:
 protected:
 	NI_POINT3_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPointLight.h b/include/obj/NiPointLight.h
index 5e631746..fcf59ba7 100644
--- a/include/obj/NiPointLight.h
+++ b/include/obj/NiPointLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -54,10 +54,10 @@ public:
 protected:
 	NI_POINT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiPosData.h b/include/obj/NiPosData.h
index db7eabf7..eaf4acff 100644
--- a/include/obj/NiPosData.h
+++ b/include/obj/NiPosData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the type of position interpolation being used.
@@ -61,10 +61,10 @@ public:
 protected:
 	NI_POS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiProperty.h b/include/obj/NiProperty.h
index 1a2bc88d..feed6803 100644
--- a/include/obj/NiProperty.h
+++ b/include/obj/NiProperty.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRangeLODData.h b/include/obj/NiRangeLODData.h
index 92c51523..c6d69fa5 100644
--- a/include/obj/NiRangeLODData.h
+++ b/include/obj/NiRangeLODData.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -60,10 +60,10 @@ public:
 protected:
 	NI_RANGE_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRotatingParticles.h b/include/obj/NiRotatingParticles.h
index aa016c8e..ab8a3240 100644
--- a/include/obj/NiRotatingParticles.h
+++ b/include/obj/NiRotatingParticles.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ROTATING_PARTICLES_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiRotatingParticlesData.h b/include/obj/NiRotatingParticlesData.h
index 5944c407..e88ab960 100644
--- a/include/obj/NiRotatingParticlesData.h
+++ b/include/obj/NiRotatingParticlesData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_ROTATING_PARTICLES_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiScreenLODData.h b/include/obj/NiScreenLODData.h
index 43fffcb3..67874bcf 100644
--- a/include/obj/NiScreenLODData.h
+++ b/include/obj/NiScreenLODData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -86,10 +86,10 @@ public:
 protected:
 	NI_SCREEN_L_O_D_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSequenceStreamHelper.h b/include/obj/NiSequenceStreamHelper.h
index eabbf6a1..f41a39e1 100644
--- a/include/obj/NiSequenceStreamHelper.h
+++ b/include/obj/NiSequenceStreamHelper.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_SEQUENCE_STREAM_HELPER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiShadeProperty.h b/include/obj/NiShadeProperty.h
index f73a21e4..c097ac25 100644
--- a/include/obj/NiShadeProperty.h
+++ b/include/obj/NiShadeProperty.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_SHADE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSingleInterpolatorController.h b/include/obj/NiSingleInterpolatorController.h
index d3c73344..ada6f8f9 100644
--- a/include/obj/NiSingleInterpolatorController.h
+++ b/include/obj/NiSingleInterpolatorController.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_SINGLE_INTERPOLATOR_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinData.h b/include/obj/NiSkinData.h
index c730b346..d4978f0c 100644
--- a/include/obj/NiSkinData.h
+++ b/include/obj/NiSkinData.h
@@ -41,10 +41,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void ResetOffsets( const Ref<NiGeometry> & owner );
@@ -63,10 +63,10 @@ public:
 protected:
 	NI_SKIN_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinInstance.h b/include/obj/NiSkinInstance.h
index 114f6bab..764ca5ec 100644
--- a/include/obj/NiSkinInstance.h
+++ b/include/obj/NiSkinInstance.h
@@ -43,10 +43,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned int GetBoneCount() const;
@@ -68,10 +68,10 @@ public:
 protected:
 	NI_SKIN_INSTANCE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSkinPartition.h b/include/obj/NiSkinPartition.h
index a7ec0769..9a18e8b4 100644
--- a/include/obj/NiSkinPartition.h
+++ b/include/obj/NiSkinPartition.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API int GetNumPartitions() const;
@@ -113,10 +113,10 @@ protected:
 protected:
 	NI_SKIN_PARTITION_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSourceTexture.h b/include/obj/NiSourceTexture.h
index 1ea12230..5c4549bc 100644
--- a/include/obj/NiSourceTexture.h
+++ b/include/obj/NiSourceTexture.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API bool IsTextureExternal ();
@@ -70,10 +70,10 @@ public:
 protected:
 	NI_SOURCE_TEXTURE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSpecularProperty.h b/include/obj/NiSpecularProperty.h
index 520b1552..39d1dcf6 100644
--- a/include/obj/NiSpecularProperty.h
+++ b/include/obj/NiSpecularProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_SPECULAR_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSphericalCollider.h b/include/obj/NiSphericalCollider.h
index 4888e7b4..763317c1 100644
--- a/include/obj/NiSphericalCollider.h
+++ b/include/obj/NiSphericalCollider.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_SPHERICAL_COLLIDER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiSpotLight.h b/include/obj/NiSpotLight.h
index 55641583..c9d2ab05 100644
--- a/include/obj/NiSpotLight.h
+++ b/include/obj/NiSpotLight.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_SPOT_LIGHT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStencilProperty.h b/include/obj/NiStencilProperty.h
index b72843f0..abee4c4d 100644
--- a/include/obj/NiStencilProperty.h
+++ b/include/obj/NiStencilProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -90,10 +90,10 @@ public:
 protected:
 	NI_STENCIL_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringExtraData.h b/include/obj/NiStringExtraData.h
index e978ec1d..a1f62ecf 100644
--- a/include/obj/NiStringExtraData.h
+++ b/include/obj/NiStringExtraData.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetData() const;
@@ -41,10 +41,10 @@ public:
 protected:
 	NI_STRING_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringPalette.h b/include/obj/NiStringPalette.h
index f2546924..329e25d6 100644
--- a/include/obj/NiStringPalette.h
+++ b/include/obj/NiStringPalette.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API string GetPaletteString() const;
@@ -46,10 +46,10 @@ public:
 protected:
 	NI_STRING_PALETTE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiStringsExtraData.h b/include/obj/NiStringsExtraData.h
index 76fcb15b..e1a3abbe 100644
--- a/include/obj/NiStringsExtraData.h
+++ b/include/obj/NiStringsExtraData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<string> GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_STRINGS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextKeyExtraData.h b/include/obj/NiTextKeyExtraData.h
index fa1dd0e5..ba61095f 100644
--- a/include/obj/NiTextKeyExtraData.h
+++ b/include/obj/NiTextKeyExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the text note key data.
@@ -50,10 +50,10 @@ public:
 protected:
 	NI_TEXT_KEY_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureEffect.h b/include/obj/NiTextureEffect.h
index baddb7ee..596ed37e 100644
--- a/include/obj/NiTextureEffect.h
+++ b/include/obj/NiTextureEffect.h
@@ -35,10 +35,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -109,10 +109,10 @@ public:
 protected:
 	NI_TEXTURE_EFFECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureModeProperty.h b/include/obj/NiTextureModeProperty.h
index 4d0fa46c..655622e1 100644
--- a/include/obj/NiTextureModeProperty.h
+++ b/include/obj/NiTextureModeProperty.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_MODE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureProperty.h b/include/obj/NiTextureProperty.h
index 7b62f286..03311048 100644
--- a/include/obj/NiTextureProperty.h
+++ b/include/obj/NiTextureProperty.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTextureTransformController.h b/include/obj/NiTextureTransformController.h
index cdc2561f..0bf12570 100644
--- a/include/obj/NiTextureTransformController.h
+++ b/include/obj/NiTextureTransformController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TEXTURE_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTexturingProperty.h b/include/obj/NiTexturingProperty.h
index 0a059401..787c8f53 100644
--- a/include/obj/NiTexturingProperty.h
+++ b/include/obj/NiTexturingProperty.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! Retrieves the number of texture slots defined by this texturing propery.  Texture slots may or may not actually contain textures, but each slot has a different meaning so the way a texture is used is dependant upon which slot it is in.
@@ -147,10 +147,10 @@ public:
 protected:
 	NI_TEXTURING_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTimeController.h b/include/obj/NiTimeController.h
index 11091478..b34a646b 100644
--- a/include/obj/NiTimeController.h
+++ b/include/obj/NiTimeController.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*! 
@@ -80,10 +80,10 @@ public:
 protected:
 	NI_TIME_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformController.h b/include/obj/NiTransformController.h
index f86a5a50..5a0a1c74 100644
--- a/include/obj/NiTransformController.h
+++ b/include/obj/NiTransformController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRANSFORM_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformData.h b/include/obj/NiTransformData.h
index 31e7546d..94f2dcb2 100644
--- a/include/obj/NiTransformData.h
+++ b/include/obj/NiTransformData.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRANSFORM_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTransformInterpolator.h b/include/obj/NiTransformInterpolator.h
index 9d4b2f06..4c6d852f 100644
--- a/include/obj/NiTransformInterpolator.h
+++ b/include/obj/NiTransformInterpolator.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -65,10 +65,10 @@ public:
 protected:
 	NI_TRANSFORM_INTERPOLATOR_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriBasedGeom.h b/include/obj/NiTriBasedGeom.h
index 85761776..98176509 100644
--- a/include/obj/NiTriBasedGeom.h
+++ b/include/obj/NiTriBasedGeom.h
@@ -31,10 +31,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API void GenHardwareSkinInfo( int max_bones_per_partition = 4, int max_bones_per_vertex = 4 );
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_TRI_BASED_GEOM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriBasedGeomData.h b/include/obj/NiTriBasedGeomData.h
index b599b811..b681ae6c 100644
--- a/include/obj/NiTriBasedGeomData.h
+++ b/include/obj/NiTriBasedGeomData.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 
@@ -55,10 +55,10 @@ public:
 protected:
 	NI_TRI_BASED_GEOM_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriShape.h b/include/obj/NiTriShape.h
index 565ec1b9..fb5ed0f9 100644
--- a/include/obj/NiTriShape.h
+++ b/include/obj/NiTriShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRI_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriShapeData.h b/include/obj/NiTriShapeData.h
index 3fce4bf1..ce02568d 100644
--- a/include/obj/NiTriShapeData.h
+++ b/include/obj/NiTriShapeData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 public:
 
@@ -78,10 +78,10 @@ public:
 protected:
 	NI_TRI_SHAPE_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriStrips.h b/include/obj/NiTriStrips.h
index 817db6cd..e3d71f47 100644
--- a/include/obj/NiTriStrips.h
+++ b/include/obj/NiTriStrips.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_TRI_STRIPS_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiTriStripsData.h b/include/obj/NiTriStripsData.h
index e59f78c4..e5e4a07d 100644
--- a/include/obj/NiTriStripsData.h
+++ b/include/obj/NiTriStripsData.h
@@ -26,10 +26,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API NiTriStripsData(const vector<Triangle> &tris, bool nvtristrips = true);
@@ -86,10 +86,10 @@ private:
 protected:
 	NI_TRI_STRIPS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiUVController.h b/include/obj/NiUVController.h
index ef363a08..b540a142 100644
--- a/include/obj/NiUVController.h
+++ b/include/obj/NiUVController.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	//TODO:  This class has an unknown member
@@ -45,10 +45,10 @@ public:
 protected:
 	NI_U_V_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiUVData.h b/include/obj/NiUVData.h
index 0528d630..128b52e9 100644
--- a/include/obj/NiUVData.h
+++ b/include/obj/NiUVData.h
@@ -29,19 +29,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_U_V_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVectorExtraData.h b/include/obj/NiVectorExtraData.h
index 78284f41..1e26b416 100644
--- a/include/obj/NiVectorExtraData.h
+++ b/include/obj/NiVectorExtraData.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API Vector3 GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_VECTOR_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVertWeightsExtraData.h b/include/obj/NiVertWeightsExtraData.h
index 148df32f..49006dbf 100644
--- a/include/obj/NiVertWeightsExtraData.h
+++ b/include/obj/NiVertWeightsExtraData.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API vector<float> GetData() const;
@@ -40,10 +40,10 @@ public:
 protected:
 	NI_VERT_WEIGHTS_EXTRA_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVertexColorProperty.h b/include/obj/NiVertexColorProperty.h
index 97bca861..e8efb86a 100644
--- a/include/obj/NiVertexColorProperty.h
+++ b/include/obj/NiVertexColorProperty.h
@@ -30,10 +30,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
    NIFLIB_API unsigned short GetFlags() const;
@@ -48,10 +48,10 @@ public:
 protected:
 	NI_VERTEX_COLOR_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVisController.h b/include/obj/NiVisController.h
index e6e29978..c308fc97 100644
--- a/include/obj/NiVisController.h
+++ b/include/obj/NiVisController.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_VIS_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiVisData.h b/include/obj/NiVisData.h
index 73fb18fc..d29dcf14 100644
--- a/include/obj/NiVisData.h
+++ b/include/obj/NiVisData.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	NI_VIS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiWireframeProperty.h b/include/obj/NiWireframeProperty.h
index 262bbf06..dcd70620 100644
--- a/include/obj/NiWireframeProperty.h
+++ b/include/obj/NiWireframeProperty.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -39,10 +39,10 @@ public:
 protected:
 	NI_WIREFRAME_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/NiZBufferProperty.h b/include/obj/NiZBufferProperty.h
index 43063199..38619733 100644
--- a/include/obj/NiZBufferProperty.h
+++ b/include/obj/NiZBufferProperty.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	NIFLIB_API unsigned short GetFlags() const;
@@ -43,10 +43,10 @@ public:
 protected:
 	NI_Z_BUFFER_PROPERTY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/RootCollisionNode.h b/include/obj/RootCollisionNode.h
index e04143a8..2b1755d6 100644
--- a/include/obj/RootCollisionNode.h
+++ b/include/obj/RootCollisionNode.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	ROOT_COLLISION_NODE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBlendCollisionObject.h b/include/obj/bhkBlendCollisionObject.h
index 6f5b305b..fb04d64f 100644
--- a/include/obj/bhkBlendCollisionObject.h
+++ b/include/obj/bhkBlendCollisionObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_BLEND_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBlendController.h b/include/obj/bhkBlendController.h
index 8ac43901..ade96a55 100644
--- a/include/obj/bhkBlendController.h
+++ b/include/obj/bhkBlendController.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_BLEND_CONTROLLER_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkBoxShape.h b/include/obj/bhkBoxShape.h
index ad96b7ec..13c081ae 100644
--- a/include/obj/bhkBoxShape.h
+++ b/include/obj/bhkBoxShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	BHK_BOX_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkCapsuleShape.h b/include/obj/bhkCapsuleShape.h
index a46e5200..50f1fc57 100644
--- a/include/obj/bhkCapsuleShape.h
+++ b/include/obj/bhkCapsuleShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -66,10 +66,10 @@ public:
 protected:
 	BHK_CAPSULE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkCollisionObject.h b/include/obj/bhkCollisionObject.h
index e27fe24a..db4d1b53 100644
--- a/include/obj/bhkCollisionObject.h
+++ b/include/obj/bhkCollisionObject.h
@@ -25,20 +25,20 @@ public:
 private:
 	static const Type TYPE;
 public:
-	virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_API virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_API virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_API virtual list<NiObjectRef> GetRefs() const;
 	NIFLIB_API virtual const Type & GetType() const;
 
 protected:
 	BHK_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexShape.h b/include/obj/bhkConvexShape.h
index bf0d686d..0ee275ab 100644
--- a/include/obj/bhkConvexShape.h
+++ b/include/obj/bhkConvexShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexTransformShape.h b/include/obj/bhkConvexTransformShape.h
index 1c15634f..46152171 100644
--- a/include/obj/bhkConvexTransformShape.h
+++ b/include/obj/bhkConvexTransformShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_TRANSFORM_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkConvexVerticesShape.h b/include/obj/bhkConvexVerticesShape.h
index f7064080..ae5b198b 100644
--- a/include/obj/bhkConvexVerticesShape.h
+++ b/include/obj/bhkConvexVerticesShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_CONVEX_VERTICES_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkEntity.h b/include/obj/bhkEntity.h
index 267aaca0..ab970b93 100644
--- a/include/obj/bhkEntity.h
+++ b/include/obj/bhkEntity.h
@@ -32,10 +32,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -111,10 +111,10 @@ public:
 protected:
 	BHK_ENTITY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkHingeConstraint.h b/include/obj/bhkHingeConstraint.h
index dc28028c..7e8f9ae5 100644
--- a/include/obj/bhkHingeConstraint.h
+++ b/include/obj/bhkHingeConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_HINGE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkLimitedHingeConstraint.h b/include/obj/bhkLimitedHingeConstraint.h
index 144a3085..cd8caf8b 100644
--- a/include/obj/bhkLimitedHingeConstraint.h
+++ b/include/obj/bhkLimitedHingeConstraint.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_LIMITED_HINGE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkListShape.h b/include/obj/bhkListShape.h
index 212df36f..2e460375 100644
--- a/include/obj/bhkListShape.h
+++ b/include/obj/bhkListShape.h
@@ -32,19 +32,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_LIST_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMalleableConstraint.h b/include/obj/bhkMalleableConstraint.h
index 181bcd55..4d98f663 100644
--- a/include/obj/bhkMalleableConstraint.h
+++ b/include/obj/bhkMalleableConstraint.h
@@ -34,19 +34,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_MALLEABLE_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMoppBvTreeShape.h b/include/obj/bhkMoppBvTreeShape.h
index eff4f8df..66694f89 100644
--- a/include/obj/bhkMoppBvTreeShape.h
+++ b/include/obj/bhkMoppBvTreeShape.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_MOPP_BV_TREE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkMultiSphereShape.h b/include/obj/bhkMultiSphereShape.h
index 22aec99a..4d8d870f 100644
--- a/include/obj/bhkMultiSphereShape.h
+++ b/include/obj/bhkMultiSphereShape.h
@@ -29,10 +29,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -44,10 +44,10 @@ public:
 protected:
 	BHK_MULTI_SPHERE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkNiTriStripsShape.h b/include/obj/bhkNiTriStripsShape.h
index 6dbd07a4..aed18b63 100644
--- a/include/obj/bhkNiTriStripsShape.h
+++ b/include/obj/bhkNiTriStripsShape.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -51,10 +51,10 @@ public:
 protected:
 	BHK_NI_TRI_STRIPS_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkPackedNiTriStripsShape.h b/include/obj/bhkPackedNiTriStripsShape.h
index 19129e0c..77d77a87 100644
--- a/include/obj/bhkPackedNiTriStripsShape.h
+++ b/include/obj/bhkPackedNiTriStripsShape.h
@@ -33,19 +33,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_PACKED_NI_TRI_STRIPS_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkPrismaticConstraint.h b/include/obj/bhkPrismaticConstraint.h
index 3d806f07..bbfff378 100644
--- a/include/obj/bhkPrismaticConstraint.h
+++ b/include/obj/bhkPrismaticConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_PRISMATIC_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRagdollConstraint.h b/include/obj/bhkRagdollConstraint.h
index 0c299984..eb574d18 100644
--- a/include/obj/bhkRagdollConstraint.h
+++ b/include/obj/bhkRagdollConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_RAGDOLL_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRefObject.h b/include/obj/bhkRefObject.h
index fe98e9b2..79b09667 100644
--- a/include/obj/bhkRefObject.h
+++ b/include/obj/bhkRefObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_REF_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRigidBody.h b/include/obj/bhkRigidBody.h
index 9a66ac40..d995a9f9 100644
--- a/include/obj/bhkRigidBody.h
+++ b/include/obj/bhkRigidBody.h
@@ -33,10 +33,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -162,10 +162,10 @@ public:
 protected:
 	BHK_RIGID_BODY_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkRigidBodyT.h b/include/obj/bhkRigidBodyT.h
index 10254fcc..a634c6a4 100644
--- a/include/obj/bhkRigidBodyT.h
+++ b/include/obj/bhkRigidBodyT.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_RIGID_BODY_T_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSPCollisionObject.h b/include/obj/bhkSPCollisionObject.h
index dae17cff..46e8e34e 100644
--- a/include/obj/bhkSPCollisionObject.h
+++ b/include/obj/bhkSPCollisionObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_S_P_COLLISION_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSerializable.h b/include/obj/bhkSerializable.h
index 7cd89a56..ac35ec4e 100644
--- a/include/obj/bhkSerializable.h
+++ b/include/obj/bhkSerializable.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SERIALIZABLE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkShape.h b/include/obj/bhkShape.h
index 953d61dd..969e8029 100644
--- a/include/obj/bhkShape.h
+++ b/include/obj/bhkShape.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSimpleShapePhantom.h b/include/obj/bhkSimpleShapePhantom.h
index 8f72877e..bb2fa091 100644
--- a/include/obj/bhkSimpleShapePhantom.h
+++ b/include/obj/bhkSimpleShapePhantom.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_SIMPLE_SHAPE_PHANTOM_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSphereRepShape.h b/include/obj/bhkSphereRepShape.h
index 55f42a9c..8bf34ae1 100644
--- a/include/obj/bhkSphereRepShape.h
+++ b/include/obj/bhkSphereRepShape.h
@@ -28,10 +28,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -43,10 +43,10 @@ public:
 protected:
 	BHK_SPHERE_REP_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkSphereShape.h b/include/obj/bhkSphereShape.h
index 80522a60..971d126d 100644
--- a/include/obj/bhkSphereShape.h
+++ b/include/obj/bhkSphereShape.h
@@ -27,10 +27,10 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 	/*!
@@ -42,10 +42,10 @@ public:
 protected:
 	BHK_SPHERE_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkStiffSpringConstraint.h b/include/obj/bhkStiffSpringConstraint.h
index 7255646e..8328966e 100644
--- a/include/obj/bhkStiffSpringConstraint.h
+++ b/include/obj/bhkStiffSpringConstraint.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_STIFF_SPRING_CONSTRAINT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkTransformShape.h b/include/obj/bhkTransformShape.h
index dab4af9f..9eef8467 100644
--- a/include/obj/bhkTransformShape.h
+++ b/include/obj/bhkTransformShape.h
@@ -27,19 +27,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_TRANSFORM_SHAPE_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/bhkWorldObject.h b/include/obj/bhkWorldObject.h
index cfd71f96..ceb4e7b4 100644
--- a/include/obj/bhkWorldObject.h
+++ b/include/obj/bhkWorldObject.h
@@ -26,19 +26,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	BHK_WORLD_OBJECT_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/include/obj/hkPackedNiTriStripsData.h b/include/obj/hkPackedNiTriStripsData.h
index 376021df..c22185cf 100644
--- a/include/obj/hkPackedNiTriStripsData.h
+++ b/include/obj/hkPackedNiTriStripsData.h
@@ -30,19 +30,19 @@ private:
 	static const Type TYPE;
 public:
 	NIFLIB_API virtual const Type & GetType() const;
-	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	NIFLIB_HIDDEN virtual void Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	NIFLIB_HIDDEN virtual void Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	NIFLIB_API virtual string asString( bool verbose = false ) const;
-	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	NIFLIB_HIDDEN virtual void FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	NIFLIB_HIDDEN virtual list<NiObjectRef> GetRefs() const;
 
 protected:
 	HK_PACKED_NI_TRI_STRIPS_DATA_MEMBERS
 private:
-	void InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
-	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const;
+	void InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info );
+	void InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const;
 	string InternalAsString( bool verbose ) const;
-	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version );
+	void InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info );
 	list<NiObjectRef> InternalGetRefs() const;
 };
 
diff --git a/src/NIF_IO.cpp b/src/NIF_IO.cpp
index 7142c325..4776bee6 100644
--- a/src/NIF_IO.cpp
+++ b/src/NIF_IO.cpp
@@ -5,6 +5,75 @@ All rights reserved.  Please see niflib.h for licence. */
 #include "../include/niflib.h"
 namespace Niflib {
 
+//--Endian Support Functions--//
+EndianType DetectEndianType();
+int SwapEndian( int in );
+short SwapEndian( short in );
+float SwapEndian( float in );
+
+//Constant that stores the detected endian storage type of the current system
+const EndianType system_endian = DetectEndianType();
+
+//--Endian Function Bodies--//
+
+EndianType DetectEndianType() {
+	//Simple endian test
+	unsigned char test[2] = { 1, 0 };
+	short r = *(short *)test;
+
+	if ( r == 1 ) {
+		return LITTLE_ENDIAN;
+	} else {
+		return BIG_ENDIAN;
+	}		
+}
+
+int SwapEndian( int in ) {
+	int out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[3];
+	temp_out[1] = temp_in[2];
+	temp_out[2] = temp_in[1];
+	temp_out[3] = temp_in[0];
+
+	return out;
+}
+
+short SwapEndian( short in ) {
+	short out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[1];
+	temp_out[1] = temp_in[0];
+
+	return out;
+}
+
+float SwapEndian( float in ) {
+	float out = 0;
+	char * temp_in;
+	char * temp_out;
+
+	temp_in = (char*)&in;
+	temp_out = (char*)&out;
+
+	temp_out[0] = temp_in[3];
+	temp_out[1] = temp_in[2];
+	temp_out[2] = temp_in[1];
+	temp_out[3] = temp_in[0];
+
+	return out;
+}
+
 //--Read utility functions--//
 
 int ReadInt( istream& in ){
@@ -130,41 +199,41 @@ void WriteBool( bool val, ostream& out, unsigned int version ) {
 //--Basic Types--//
 
 //int
-void NifStream( int & val, istream& in, unsigned int version ) { val = ReadInt( in ); };
-void NifStream( int const & val, ostream& out, unsigned int version ) { WriteInt( val, out ); }
+void NifStream( int & val, istream& in, const NifInfo & info ) { val = ReadInt( in ); };
+void NifStream( int const & val, ostream& out, const NifInfo & info ) { WriteInt( val, out ); }
 
 //unsigned int
-void NifStream( unsigned int & val, istream& in, unsigned int version ) { val = ReadUInt( in ); };
-void NifStream( unsigned int const & val, ostream& out, unsigned int version ) { WriteUInt( val, out ); }
+void NifStream( unsigned int & val, istream& in, const NifInfo & info ) { val = ReadUInt( in ); };
+void NifStream( unsigned int const & val, ostream& out, const NifInfo & info ) { WriteUInt( val, out ); }
 
 //unsigned short
-void NifStream( unsigned short & val, istream& in, unsigned int version ) { val = ReadUShort( in ); };
-void NifStream( unsigned short const & val, ostream& out, unsigned int version ) { WriteUShort( val, out ); }
+void NifStream( unsigned short & val, istream& in, const NifInfo & info ) { val = ReadUShort( in ); };
+void NifStream( unsigned short const & val, ostream& out, const NifInfo & info ) { WriteUShort( val, out ); }
 
 //short
-void NifStream( short & val, istream& in, unsigned int version ) { val = ReadShort( in ); };
-void NifStream( short const & val, ostream& out, unsigned int version ) { WriteShort( val, out ); }
+void NifStream( short & val, istream& in, const NifInfo & info ) { val = ReadShort( in ); };
+void NifStream( short const & val, ostream& out, const NifInfo & info ) { WriteShort( val, out ); }
 
 //byte
-void NifStream( byte & val, istream& in, unsigned int version ) { val = ReadByte( in ); };
-void NifStream( byte const & val, ostream& out, unsigned int version ) { WriteByte( val, out ); }
+void NifStream( byte & val, istream& in, const NifInfo & info ) { val = ReadByte( in ); };
+void NifStream( byte const & val, ostream& out, const NifInfo & info ) { WriteByte( val, out ); }
 
 //bool
-void NifStream( bool & val, istream& in, unsigned int version ) { val = ReadBool( in, version ); };
-void NifStream( bool const & val, ostream& out, unsigned int version ) { WriteBool( val, out, version ); }
+void NifStream( bool & val, istream& in, const NifInfo & info ) { val = ReadBool( in, info.version ); };
+void NifStream( bool const & val, ostream& out, const NifInfo & info ) { WriteBool( val, out, info.version ); }
 
 //float
-void NifStream( float & val, istream& in, unsigned int version ) { val = ReadFloat( in ); };
-void NifStream( float const & val, ostream& out, unsigned int version ) { WriteFloat( val, out ); }
+void NifStream( float & val, istream& in, const NifInfo & info ) { val = ReadFloat( in ); };
+void NifStream( float const & val, ostream& out, const NifInfo & info ) { WriteFloat( val, out ); }
 
 //string
-void NifStream( string & val, istream& in, unsigned int version ) { val = ReadString( in ); };
-void NifStream( string const & val, ostream& out, unsigned int version ) { WriteString( val, out ); }
+void NifStream( string & val, istream& in, const NifInfo & info ) { val = ReadString( in ); };
+void NifStream( string const & val, ostream& out, const NifInfo & info ) { WriteString( val, out ); }
 
 //--Structs--//
 
 //HeaderString
-void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
+void NifStream( HeaderString & val, istream& in, NifInfo & info ) {
 	char tmp[256];
 	in.getline( tmp, 256 );
 	val.header = tmp;
@@ -177,14 +246,14 @@ void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
 		ver_start = 30;
 	} else {
 		//Not a NIF file
-		version = VER_INVALID;
+		info.version = VER_INVALID;
 	}
 
 	//Parse version string and return result.
-	version = ParseVersionString( val.header.substr( ver_start ) );
+	info.version = ParseVersionString( val.header.substr( ver_start ) );
 
 	//Temporarily read the next 3 strings if this is a < 4 file
-	if ( version < VER_3_3_0_13 ) {
+	if ( info.version < VER_3_3_0_13 ) {
 		in.getline( tmp, 256 );
 		in.getline( tmp, 256 );
 		in.getline( tmp, 256 );
@@ -195,14 +264,14 @@ void NifStream( HeaderString & val, istream& in, unsigned int & version ) {
 	//}
 };
 
-void NifStream( HeaderString const & val, ostream& out, unsigned int version ) {
+void NifStream( HeaderString const & val, ostream& out, const NifInfo & info ) {
 	stringstream header_string;
-	if ( version <= VER_10_0_1_0 ) {
+	if ( info.version <= VER_10_0_1_0 ) {
 		header_string << "NetImmerse File Format, Version ";
 	} else {
 		header_string << "Gamebryo File Format, Version ";
 	}
-	char * byte_ver = (char*)&version;
+	char * byte_ver = (char*)&(info.version);
 	int int_ver[4] = { byte_ver[3], byte_ver[2], byte_ver[1], byte_ver[0] };
 
 
@@ -216,13 +285,13 @@ ostream & operator<<( ostream & out, HeaderString const & val ) {
 }
 
 //LineString
-void NifStream( LineString & val, istream& in, unsigned int version ) {
+void NifStream( LineString & val, istream& in, const NifInfo & info ) {
 	char tmp[256];
 	in.getline( tmp, 256 );
 	val.line = tmp;
 };
 
-void NifStream( LineString const & val, ostream& out, unsigned int version ) {
+void NifStream( LineString const & val, ostream& out, const NifInfo & info ) {
 	out << val.line << "\n";
 };
 
@@ -231,7 +300,7 @@ ostream & operator<<( ostream & out, LineString const & val ) {
 }
 
 //ShortString
-void NifStream( ShortString & val, istream& in, unsigned int version ) {
+void NifStream( ShortString & val, istream& in, const NifInfo & info ) {
 	byte len = ReadByte( in );
 	char * buffer = new char[len];
 	in.read( buffer, len );
@@ -239,7 +308,7 @@ void NifStream( ShortString & val, istream& in, unsigned int version ) {
 	delete [] buffer;
 };
 
-void NifStream( ShortString const & val, ostream& out, unsigned int version ) {
+void NifStream( ShortString const & val, ostream& out, const NifInfo & info ) {
 	WriteByte( byte(val.str.size() + 1), out );
 	out.write( val.str.c_str(), std::streamsize(val.str.size()) );
 	WriteByte( 0, out );
@@ -250,55 +319,55 @@ ostream & operator<<( ostream & out, ShortString const & val ) {
 }
 
 //TexCoord
-void NifStream( TexCoord & val, istream& in, unsigned int version ) {
+void NifStream( TexCoord & val, istream& in, const NifInfo & info ) {
 	val.u = ReadFloat( in );
 	val.v = ReadFloat( in );
 };
 
-void NifStream( TexCoord const & val, ostream& out, unsigned int version ) {
+void NifStream( TexCoord const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.u, out );
 	WriteFloat( val.v, out );
 };
 
 //Triangle
-void NifStream( Triangle & val, istream& in, unsigned int version ) {
+void NifStream( Triangle & val, istream& in, const NifInfo & info ) {
 	val.v1 = ReadUShort( in );
 	val.v2 = ReadUShort( in );
 	val.v3 = ReadUShort( in );
 };
 
-void NifStream( Triangle const & val, ostream& out, unsigned int version ) {
+void NifStream( Triangle const & val, ostream& out, const NifInfo & info ) {
 	WriteUShort( val.v1, out );
 	WriteUShort( val.v2, out );
 	WriteUShort( val.v3, out );
 };
 
 //Vector3
-void NifStream( Vector3 & val, istream& in, unsigned int version ) {
+void NifStream( Vector3 & val, istream& in, const NifInfo & info ) {
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Vector3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Vector3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
 	WriteFloat( val.z, out );
 };
 
 //Float2
-void NifStream( Float2 & val, istream& in, unsigned int version ) {
+void NifStream( Float2 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 };
 
-void NifStream( Float2 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float2 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 };
 
 //Matrix22
-void NifStream( Matrix22 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix22 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 2; ++c) {
 		for (int r = 0; r < 2; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -306,7 +375,7 @@ void NifStream( Matrix22 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix22 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix22 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 2; ++c) {
 		for (int r = 0; r < 2; ++r) {
 			WriteFloat( val[r][c], out );
@@ -315,20 +384,20 @@ void NifStream( Matrix22 const & val, ostream& out, unsigned int version ) {
 }
 
 //Float3
-void NifStream( Float3 & val, istream& in, unsigned int version ) {
+void NifStream( Float3 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 	val.data[2] = ReadFloat( in );
 };
 
-void NifStream( Float3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 	WriteFloat( val.data[2], out );
 };
 
 //Matrix33
-void NifStream( Matrix33 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix33 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 3; ++c) {
 		for (int r = 0; r < 3; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -336,7 +405,7 @@ void NifStream( Matrix33 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix33 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix33 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 3; ++c) {
 		for (int r = 0; r < 3; ++r) {
 			WriteFloat( val[r][c], out );
@@ -345,14 +414,14 @@ void NifStream( Matrix33 const & val, ostream& out, unsigned int version ) {
 }
 
 //Float4
-void NifStream( Float4 & val, istream& in, unsigned int version ) {
+void NifStream( Float4 & val, istream& in, const NifInfo & info ) {
 	val.data[0] = ReadFloat( in );
 	val.data[1] = ReadFloat( in );
 	val.data[2] = ReadFloat( in );
 	val.data[3] = ReadFloat( in );
 };
 
-void NifStream( Float4 const & val, ostream& out, unsigned int version ) {
+void NifStream( Float4 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.data[0], out );
 	WriteFloat( val.data[1], out );
 	WriteFloat( val.data[2], out );
@@ -360,7 +429,7 @@ void NifStream( Float4 const & val, ostream& out, unsigned int version ) {
 };
 
 //Matrix44
-void NifStream( Matrix44 & val, istream& in, unsigned int version ) {
+void NifStream( Matrix44 & val, istream& in, const NifInfo & info ) {
 	for (int c = 0; c < 4; ++c) {
 		for (int r = 0; r < 4; ++r) {
 			val[r][c] = ReadFloat( in );
@@ -368,7 +437,7 @@ void NifStream( Matrix44 & val, istream& in, unsigned int version ) {
 	}
 }
 
-void NifStream( Matrix44 const & val, ostream& out, unsigned int version ) {
+void NifStream( Matrix44 const & val, ostream& out, const NifInfo & info ) {
 	for (int c = 0; c < 4; ++c) {
 		for (int r = 0; r < 4; ++r) {
 			WriteFloat( val[r][c], out );
@@ -377,27 +446,27 @@ void NifStream( Matrix44 const & val, ostream& out, unsigned int version ) {
 }
 
 //Color3
-void NifStream( Color3 & val, istream& in, unsigned int version ) {
+void NifStream( Color3 & val, istream& in, const NifInfo & info ) {
 	val.r = ReadFloat( in );
 	val.g = ReadFloat( in );
 	val.b = ReadFloat( in );
 };
 
-void NifStream( Color3 const & val, ostream& out, unsigned int version ) {
+void NifStream( Color3 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.r, out );
 	WriteFloat( val.g, out );
 	WriteFloat( val.b, out );
 };
 
 //Color4
-void NifStream( Color4 & val, istream& in, unsigned int version ) {
+void NifStream( Color4 & val, istream& in, const NifInfo & info ) {
 	val.r = ReadFloat( in );
 	val.g = ReadFloat( in );
 	val.b = ReadFloat( in );
 	val.a = ReadFloat( in );
 };
 
-void NifStream( Color4 const & val, ostream& out, unsigned int version ) {
+void NifStream( Color4 const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.r, out );
 	WriteFloat( val.g, out );
 	WriteFloat( val.b, out );
@@ -405,14 +474,14 @@ void NifStream( Color4 const & val, ostream& out, unsigned int version ) {
 };
 
 //Quaternion
-void NifStream( Quaternion & val, istream& in, unsigned int version ) {
+void NifStream( Quaternion & val, istream& in, const NifInfo & info ) {
 	val.w = ReadFloat( in );
 	val.x = ReadFloat( in );
 	val.y = ReadFloat( in );
 	val.z = ReadFloat( in );
 };
 
-void NifStream( Quaternion const & val, ostream& out, unsigned int version ) {
+void NifStream( Quaternion const & val, ostream& out, const NifInfo & info ) {
 	WriteFloat( val.w, out );
 	WriteFloat( val.x, out );
 	WriteFloat( val.y, out );
@@ -448,7 +517,7 @@ ostream & operator<<( ostream & out, byte const & val ) {
 	return out << (unsigned int)(val);
 }
 
-void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyType type ) {
+void NifStream( Key<Quaternion> & key, istream& file, const NifInfo & info, KeyType type ) {
 	key.time = ReadFloat( file );
 
 	//If key type is not 1, 2, or 3, throw an exception
@@ -468,7 +537,7 @@ void NifStream( Key<Quaternion> & key, istream& file, unsigned int version, KeyT
 }
 
 
-void NifStream( Key<Quaternion> const & key, ostream& file, unsigned int version,  KeyType type ) {
+void NifStream( Key<Quaternion> const & key, ostream& file, const NifInfo & info,  KeyType type ) {
 	WriteFloat( key.time, file );
 
 	//If key type is not 1, 2, or 3, throw an exception
diff --git a/src/gen/Footer.cpp b/src/gen/Footer.cpp
index f8de6f47..8dc69c6c 100644
--- a/src/gen/Footer.cpp
+++ b/src/gen/Footer.cpp
@@ -27,27 +27,27 @@ Footer & Footer::operator=( const Footer & src ) {
 //Destructor
 Footer::~Footer() {};
 
-void Footer::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void Footer::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	if ( version >= 0x0303000D ) {
-		NifStream( numRoots, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numRoots, in, info );
 		roots.resize(numRoots);
 		for (unsigned int i2 = 0; i2 < roots.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void Footer::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
+void Footer::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
 	numRoots = (unsigned int)(roots.size());
-	if ( version >= 0x0303000D ) {
-		NifStream( numRoots, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numRoots, out, info );
 		for (unsigned int i2 = 0; i2 < roots.size(); i2++) {
 			if ( roots[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(roots[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(roots[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
diff --git a/src/gen/Header.cpp b/src/gen/Header.cpp
index 68f3afea..b8242c73 100644
--- a/src/gen/Header.cpp
+++ b/src/gen/Header.cpp
@@ -37,99 +37,120 @@ Header & Header::operator=( const Header & src ) {
 
 //Destructor
 Header::~Header() {};
-void Header::Read( istream& in ) {
-	NifStream( headerString, in, version );
-	if ( version <= 0x03010000 ) {
+NifInfo Header::Read( istream& in ) {
+	//Declare NifInfo structure
+	NifInfo info;
+
+	NifStream( headerString, in, info );
+	if ( info.version <= 0x03010000 ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( copyright[i2], in, version );
+			NifStream( copyright[i2], in, info );
 		};
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( version, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( version, in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( endianType, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( endianType, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( userVersion, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( userVersion, in, info );
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( numBlocks, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numBlocks, in, info );
 	};
-	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
-		NifStream( userVersion, in, version );
+	if ( ( info.version >= 0x0A000102 ) && ( info.version <= 0x0A000102 ) ) {
+		NifStream( userVersion, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( userVersion2, in, version );
+			NifStream( userVersion2, in, info );
 		};
 	};
-	if ( version >= 0x0A000102 ) {
+	if ( info.version >= 0x0A000102 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( creator, in, version );
-			NifStream( exportInfo1, in, version );
-			NifStream( exportInfo2, in, version );
+			NifStream( creator, in, info );
+			NifStream( exportInfo1, in, info );
+			NifStream( exportInfo2, in, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numBlockTypes, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numBlockTypes, in, info );
 		blockTypes.resize(numBlockTypes);
 		for (unsigned int i2 = 0; i2 < blockTypes.size(); i2++) {
-			NifStream( blockTypes[i2], in, version );
+			NifStream( blockTypes[i2], in, info );
 		};
 		blockTypeIndex.resize(numBlocks);
 		for (unsigned int i2 = 0; i2 < blockTypeIndex.size(); i2++) {
-			NifStream( blockTypeIndex[i2], in, version );
+			NifStream( blockTypeIndex[i2], in, info );
 		};
-		NifStream( unknownInt2, in, version );
+		NifStream( unknownInt2, in, info );
 	};
+
+	//Copy info.version to local version var.
+	version = info.version;
+
+	//Fill out and return NifInfo structure.
+	info.userVersion = userVersion;
+	if ( endianType == 0) {
+		info->endian = BIG_ENDIAN;
+	} else {
+		info->endian = LITTLE_ENDIAN;
+	}
+	info.endian = EndianType(endianType);
+	info.creator = creator.str;
+	info.exportInfo1 = exportInfo1;
+	info.exportInfo2 = exportInfo2;
+
+	return info;
+
 }
 
-void Header::Write( ostream& out ) const {
+void Header::Write( ostream& out, const NifInfo & info ) const {
 	numBlockTypes = (unsigned short)(blockTypes.size());
 	numBlocks = (unsigned int)(blockTypeIndex.size());
-	NifStream( headerString, out, version );
-	if ( version <= 0x03010000 ) {
+	NifStream( headerString, out, info );
+	if ( info.version <= 0x03010000 ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( copyright[i2], out, version );
+			NifStream( copyright[i2], out, info );
 		};
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( version, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( version, out, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( endianType, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( endianType, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( userVersion, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( userVersion, out, info );
 	};
-	if ( version >= 0x0303000D ) {
-		NifStream( numBlocks, out, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( numBlocks, out, info );
 	};
-	if ( ( version >= 0x0A000102 ) && ( version <= 0x0A000102 ) ) {
-		NifStream( userVersion, out, version );
+	if ( ( info.version >= 0x0A000102 ) && ( info.version <= 0x0A000102 ) ) {
+		NifStream( userVersion, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( userVersion2, out, version );
+			NifStream( userVersion2, out, info );
 		};
 	};
-	if ( version >= 0x0A000102 ) {
+	if ( info.version >= 0x0A000102 ) {
 		if ( (userVersion != 0) ) {
-			NifStream( creator, out, version );
-			NifStream( exportInfo1, out, version );
-			NifStream( exportInfo2, out, version );
+			NifStream( creator, out, info );
+			NifStream( exportInfo1, out, info );
+			NifStream( exportInfo2, out, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numBlockTypes, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numBlockTypes, out, info );
 		for (unsigned int i2 = 0; i2 < blockTypes.size(); i2++) {
-			NifStream( blockTypes[i2], out, version );
+			NifStream( blockTypes[i2], out, info );
 		};
 		for (unsigned int i2 = 0; i2 < blockTypeIndex.size(); i2++) {
-			NifStream( blockTypeIndex[i2], out, version );
+			NifStream( blockTypeIndex[i2], out, info );
 		};
-		NifStream( unknownInt2, out, version );
+		NifStream( unknownInt2, out, info );
 	};
 }
 
diff --git a/src/gen/enums.cpp b/src/gen/enums.cpp
index 64a4b200..573141a1 100644
--- a/src/gen/enums.cpp
+++ b/src/gen/enums.cpp
@@ -19,14 +19,14 @@ namespace Niflib {
 
 //--ForceType--//
 
-void NifStream( ForceType & val, istream& in, unsigned int version ) {
+void NifStream( ForceType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = ForceType(temp);
 }
 
-void NifStream( ForceType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( ForceType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, ForceType const & val ) {
@@ -41,14 +41,14 @@ ostream & operator<<( ostream & out, ForceType const & val ) {
 
 //--HavokMaterial--//
 
-void NifStream( HavokMaterial & val, istream& in, unsigned int version ) {
+void NifStream( HavokMaterial & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = HavokMaterial(temp);
 }
 
-void NifStream( HavokMaterial const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( HavokMaterial const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, HavokMaterial const & val ) {
@@ -91,14 +91,14 @@ ostream & operator<<( ostream & out, HavokMaterial const & val ) {
 
 //--CompareMode--//
 
-void NifStream( CompareMode & val, istream& in, unsigned int version ) {
+void NifStream( CompareMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = CompareMode(temp);
 }
 
-void NifStream( CompareMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( CompareMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, CompareMode const & val ) {
@@ -117,14 +117,14 @@ ostream & operator<<( ostream & out, CompareMode const & val ) {
 
 //--TexFilterMode--//
 
-void NifStream( TexFilterMode & val, istream& in, unsigned int version ) {
+void NifStream( TexFilterMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexFilterMode(temp);
 }
 
-void NifStream( TexFilterMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexFilterMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexFilterMode const & val ) {
@@ -142,14 +142,14 @@ ostream & operator<<( ostream & out, TexFilterMode const & val ) {
 
 //--LightMode--//
 
-void NifStream( LightMode & val, istream& in, unsigned int version ) {
+void NifStream( LightMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = LightMode(temp);
 }
 
-void NifStream( LightMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( LightMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, LightMode const & val ) {
@@ -163,14 +163,14 @@ ostream & operator<<( ostream & out, LightMode const & val ) {
 
 //--MipMapFormat--//
 
-void NifStream( MipMapFormat & val, istream& in, unsigned int version ) {
+void NifStream( MipMapFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MipMapFormat(temp);
 }
 
-void NifStream( MipMapFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( MipMapFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MipMapFormat const & val ) {
@@ -185,14 +185,14 @@ ostream & operator<<( ostream & out, MipMapFormat const & val ) {
 
 //--StencilAction--//
 
-void NifStream( StencilAction & val, istream& in, unsigned int version ) {
+void NifStream( StencilAction & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = StencilAction(temp);
 }
 
-void NifStream( StencilAction const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( StencilAction const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, StencilAction const & val ) {
@@ -210,14 +210,14 @@ ostream & operator<<( ostream & out, StencilAction const & val ) {
 
 //--OblivionLayer--//
 
-void NifStream( OblivionLayer & val, istream& in, unsigned int version ) {
+void NifStream( OblivionLayer & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = OblivionLayer(temp);
 }
 
-void NifStream( OblivionLayer const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( OblivionLayer const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, OblivionLayer const & val ) {
@@ -287,14 +287,14 @@ ostream & operator<<( ostream & out, OblivionLayer const & val ) {
 
 //--FaceDrawMode--//
 
-void NifStream( FaceDrawMode & val, istream& in, unsigned int version ) {
+void NifStream( FaceDrawMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = FaceDrawMode(temp);
 }
 
-void NifStream( FaceDrawMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( FaceDrawMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, FaceDrawMode const & val ) {
@@ -310,14 +310,14 @@ ostream & operator<<( ostream & out, FaceDrawMode const & val ) {
 
 //--AlphaFormat--//
 
-void NifStream( AlphaFormat & val, istream& in, unsigned int version ) {
+void NifStream( AlphaFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = AlphaFormat(temp);
 }
 
-void NifStream( AlphaFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( AlphaFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, AlphaFormat const & val ) {
@@ -333,14 +333,14 @@ ostream & operator<<( ostream & out, AlphaFormat const & val ) {
 
 //--KeyType--//
 
-void NifStream( KeyType & val, istream& in, unsigned int version ) {
+void NifStream( KeyType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = KeyType(temp);
 }
 
-void NifStream( KeyType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( KeyType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, KeyType const & val ) {
@@ -357,14 +357,14 @@ ostream & operator<<( ostream & out, KeyType const & val ) {
 
 //--VertMode--//
 
-void NifStream( VertMode & val, istream& in, unsigned int version ) {
+void NifStream( VertMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = VertMode(temp);
 }
 
-void NifStream( VertMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( VertMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, VertMode const & val ) {
@@ -379,14 +379,14 @@ ostream & operator<<( ostream & out, VertMode const & val ) {
 
 //--ApplyMode--//
 
-void NifStream( ApplyMode & val, istream& in, unsigned int version ) {
+void NifStream( ApplyMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = ApplyMode(temp);
 }
 
-void NifStream( ApplyMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( ApplyMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, ApplyMode const & val ) {
@@ -403,14 +403,14 @@ ostream & operator<<( ostream & out, ApplyMode const & val ) {
 
 //--MotionSystem--//
 
-void NifStream( MotionSystem & val, istream& in, unsigned int version ) {
+void NifStream( MotionSystem & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MotionSystem(temp);
 }
 
-void NifStream( MotionSystem const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( MotionSystem const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MotionSystem const & val ) {
@@ -424,14 +424,14 @@ ostream & operator<<( ostream & out, MotionSystem const & val ) {
 
 //--BillboardMode--//
 
-void NifStream( BillboardMode & val, istream& in, unsigned int version ) {
+void NifStream( BillboardMode & val, istream& in, const NifInfo & info ) {
 	unsigned short temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = BillboardMode(temp);
 }
 
-void NifStream( BillboardMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned short)(val), out, version );
+void NifStream( BillboardMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned short)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, BillboardMode const & val ) {
@@ -448,14 +448,14 @@ ostream & operator<<( ostream & out, BillboardMode const & val ) {
 
 //--TexType--//
 
-void NifStream( TexType & val, istream& in, unsigned int version ) {
+void NifStream( TexType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexType(temp);
 }
 
-void NifStream( TexType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexType const & val ) {
@@ -475,14 +475,14 @@ ostream & operator<<( ostream & out, TexType const & val ) {
 
 //--PixelLayout--//
 
-void NifStream( PixelLayout & val, istream& in, unsigned int version ) {
+void NifStream( PixelLayout & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = PixelLayout(temp);
 }
 
-void NifStream( PixelLayout const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( PixelLayout const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, PixelLayout const & val ) {
@@ -500,14 +500,14 @@ ostream & operator<<( ostream & out, PixelLayout const & val ) {
 
 //--TexClampMode--//
 
-void NifStream( TexClampMode & val, istream& in, unsigned int version ) {
+void NifStream( TexClampMode & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = TexClampMode(temp);
 }
 
-void NifStream( TexClampMode const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( TexClampMode const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, TexClampMode const & val ) {
@@ -523,14 +523,14 @@ ostream & operator<<( ostream & out, TexClampMode const & val ) {
 
 //--MotionQuality--//
 
-void NifStream( MotionQuality & val, istream& in, unsigned int version ) {
+void NifStream( MotionQuality & val, istream& in, const NifInfo & info ) {
 	byte temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = MotionQuality(temp);
 }
 
-void NifStream( MotionQuality const & val, ostream& out, unsigned int version ) {
-	NifStream( (byte)(val), out, version );
+void NifStream( MotionQuality const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (byte)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, MotionQuality const & val ) {
@@ -551,14 +551,14 @@ ostream & operator<<( ostream & out, MotionQuality const & val ) {
 
 //--PixelFormat--//
 
-void NifStream( PixelFormat & val, istream& in, unsigned int version ) {
+void NifStream( PixelFormat & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = PixelFormat(temp);
 }
 
-void NifStream( PixelFormat const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( PixelFormat const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, PixelFormat const & val ) {
@@ -573,14 +573,14 @@ ostream & operator<<( ostream & out, PixelFormat const & val ) {
 
 //--CycleType--//
 
-void NifStream( CycleType & val, istream& in, unsigned int version ) {
+void NifStream( CycleType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = CycleType(temp);
 }
 
-void NifStream( CycleType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( CycleType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, CycleType const & val ) {
@@ -595,14 +595,14 @@ ostream & operator<<( ostream & out, CycleType const & val ) {
 
 //--FieldType--//
 
-void NifStream( FieldType & val, istream& in, unsigned int version ) {
+void NifStream( FieldType & val, istream& in, const NifInfo & info ) {
 	unsigned int temp;
-	NifStream( temp, in, version );
+	NifStream( temp, in, info );
 	val = FieldType(temp);
 }
 
-void NifStream( FieldType const & val, ostream& out, unsigned int version ) {
-	NifStream( (unsigned int)(val), out, version );
+void NifStream( FieldType const & val, ostream& out, const NifInfo & info ) {
+	NifStream( (unsigned int)(val), out, info );
 }
 
 ostream & operator<<( ostream & out, FieldType const & val ) {
diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp
index 114a5d1c..6fd4d788 100644
--- a/src/gen/obj_impl.cpp
+++ b/src/gen/obj_impl.cpp
@@ -201,7 +201,7 @@ const char FIX_LINK_INDEX_ERROR[] = "Object index was not found in object map.
 const char FIX_LINK_CAST_ERROR[] = "Link could not be cast to required type during file read. This NIF file may be invalid or improperly supported.";
 
 template <class T>
-Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version ) {
+Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
 	if (link_stack.empty()) {
 		throw runtime_error(FIX_LINK_POP_ERROR);
 	}
@@ -226,10 +226,10 @@ Ref<T> FixLink( const map<unsigned,NiObjectRef> & objects, list<unsigned int> &
 	return object;
 }
 
-void NiObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 }
 
-void NiObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
+void NiObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
 }
 
 std::string NiObject::InternalAsString( bool verbose ) const {
@@ -238,7 +238,7 @@ std::string NiObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
 }
 
 std::list<NiObjectRef> NiObject::InternalGetRefs() const {
@@ -246,12 +246,12 @@ std::list<NiObjectRef> NiObject::InternalGetRefs() const {
 	return refs;
 }
 
-void AKeyedData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void AKeyedData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void AKeyedData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void AKeyedData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string AKeyedData::InternalAsString( bool verbose ) const {
@@ -261,8 +261,8 @@ std::string AKeyedData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AKeyedData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void AKeyedData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AKeyedData::InternalGetRefs() const {
@@ -271,25 +271,25 @@ std::list<NiObjectRef> AKeyedData::InternalGetRefs() const {
 	return refs;
 }
 
-void AParticleModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void AParticleModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void AParticleModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void AParticleModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( nextModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(nextModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(nextModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( controller != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string AParticleModifier::InternalAsString( bool verbose ) const {
@@ -301,10 +301,10 @@ std::string AParticleModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AParticleModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	nextModifier = FixLink<AParticleModifier>( objects, link_stack, version );
-	controller = FixLink<NiParticleSystemController>( objects, link_stack, version );
+void AParticleModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	nextModifier = FixLink<AParticleModifier>( objects, link_stack, info );
+	controller = FixLink<NiParticleSystemController>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AParticleModifier::InternalGetRefs() const {
@@ -315,12 +315,12 @@ std::list<NiObjectRef> AParticleModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRefObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void bhkRefObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void bhkRefObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void bhkRefObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string bhkRefObject::InternalAsString( bool verbose ) const {
@@ -330,8 +330,8 @@ std::string bhkRefObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRefObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void bhkRefObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRefObject::InternalGetRefs() const {
@@ -340,12 +340,12 @@ std::list<NiObjectRef> bhkRefObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSerializable::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRefObject::Read( in, link_stack, version, user_version );
+void bhkSerializable::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRefObject::Read( in, link_stack, info );
 }
 
-void bhkSerializable::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkRefObject::Write( out, link_map, version, user_version );
+void bhkSerializable::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkRefObject::Write( out, link_map, info );
 }
 
 std::string bhkSerializable::InternalAsString( bool verbose ) const {
@@ -355,8 +355,8 @@ std::string bhkSerializable::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSerializable::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRefObject::FixLinks( objects, link_stack, version, user_version );
+void bhkSerializable::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRefObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSerializable::InternalGetRefs() const {
@@ -365,29 +365,29 @@ std::list<NiObjectRef> bhkSerializable::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void AbhkConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkSerializable::Read( in, link_stack, version, user_version );
-	NifStream( numBodies, in, version );
+	bhkSerializable::Read( in, link_stack, info );
+	NifStream( numBodies, in, info );
 	bodies.resize(numBodies);
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( priority, in, version );
+	NifStream( priority, in, info );
 }
 
-void AbhkConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSerializable::Write( out, link_map, version, user_version );
+void AbhkConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSerializable::Write( out, link_map, info );
 	numBodies = (unsigned int)(bodies.size());
-	NifStream( numBodies, out, version );
+	NifStream( numBodies, out, info );
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
 		if ( bodies[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bodies[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bodies[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( priority, out, version );
+	NifStream( priority, out, info );
 }
 
 std::string AbhkConstraint::InternalAsString( bool verbose ) const {
@@ -412,10 +412,10 @@ std::string AbhkConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
+void AbhkConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < bodies.size(); i1++) {
-		bodies[i1] = FixLink<bhkShape>( objects, link_stack, version );
+		bodies[i1] = FixLink<bhkShape>( objects, link_stack, info );
 	};
 }
 
@@ -427,36 +427,36 @@ std::list<NiObjectRef> AbhkConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( pivotA, in, version );
-	NifStream( planeA, in, version );
-	NifStream( twistA, in, version );
-	NifStream( pivotB, in, version );
-	NifStream( planeB, in, version );
-	NifStream( twistB, in, version );
-	NifStream( coneMinAngle, in, version );
-	NifStream( planeMinAngle, in, version );
-	NifStream( planeMaxAngle, in, version );
-	NifStream( twistMinAngle, in, version );
-	NifStream( twistMaxAngle, in, version );
-	NifStream( maxFriction, in, version );
-}
-
-void AbhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( pivotA, out, version );
-	NifStream( planeA, out, version );
-	NifStream( twistA, out, version );
-	NifStream( pivotB, out, version );
-	NifStream( planeB, out, version );
-	NifStream( twistB, out, version );
-	NifStream( coneMinAngle, out, version );
-	NifStream( planeMinAngle, out, version );
-	NifStream( planeMaxAngle, out, version );
-	NifStream( twistMinAngle, out, version );
-	NifStream( twistMaxAngle, out, version );
-	NifStream( maxFriction, out, version );
+void AbhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( pivotA, in, info );
+	NifStream( planeA, in, info );
+	NifStream( twistA, in, info );
+	NifStream( pivotB, in, info );
+	NifStream( planeB, in, info );
+	NifStream( twistB, in, info );
+	NifStream( coneMinAngle, in, info );
+	NifStream( planeMinAngle, in, info );
+	NifStream( planeMaxAngle, in, info );
+	NifStream( twistMinAngle, in, info );
+	NifStream( twistMaxAngle, in, info );
+	NifStream( maxFriction, in, info );
+}
+
+void AbhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( pivotA, out, info );
+	NifStream( planeA, out, info );
+	NifStream( twistA, out, info );
+	NifStream( pivotB, out, info );
+	NifStream( planeB, out, info );
+	NifStream( twistB, out, info );
+	NifStream( coneMinAngle, out, info );
+	NifStream( planeMinAngle, out, info );
+	NifStream( planeMaxAngle, out, info );
+	NifStream( twistMinAngle, out, info );
+	NifStream( twistMaxAngle, out, info );
+	NifStream( maxFriction, out, info );
 }
 
 std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
@@ -478,8 +478,8 @@ std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void AbhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AbhkRagdollConstraint::InternalGetRefs() const {
@@ -488,12 +488,12 @@ std::list<NiObjectRef> AbhkRagdollConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::Read( in, link_stack, version, user_version );
+void bhkShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::Read( in, link_stack, info );
 }
 
-void bhkShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSerializable::Write( out, link_map, version, user_version );
+void bhkShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSerializable::Write( out, link_map, info );
 }
 
 std::string bhkShape::InternalAsString( bool verbose ) const {
@@ -503,8 +503,8 @@ std::string bhkShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSerializable::FixLinks( objects, link_stack, version, user_version );
+void bhkShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSerializable::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkShape::InternalGetRefs() const {
@@ -513,12 +513,12 @@ std::list<NiObjectRef> bhkShape::InternalGetRefs() const {
 	return refs;
 }
 
-void AbhkShapeCollection::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
+void AbhkShapeCollection::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
 }
 
-void AbhkShapeCollection::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void AbhkShapeCollection::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 }
 
 std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
@@ -528,8 +528,8 @@ std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AbhkShapeCollection::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void AbhkShapeCollection::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AbhkShapeCollection::InternalGetRefs() const {
@@ -538,14 +538,14 @@ std::list<NiObjectRef> AbhkShapeCollection::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSphereRepShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
-	NifStream( material, in, version );
+void bhkSphereRepShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
+	NifStream( material, in, info );
 }
 
-void bhkSphereRepShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
-	NifStream( material, out, version );
+void bhkSphereRepShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
+	NifStream( material, out, info );
 }
 
 std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
@@ -556,8 +556,8 @@ std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereRepShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void bhkSphereRepShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSphereRepShape::InternalGetRefs() const {
@@ -566,12 +566,12 @@ std::list<NiObjectRef> bhkSphereRepShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
+void bhkConvexShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
 }
 
-void bhkConvexShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkConvexShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 }
 
 std::string bhkConvexShape::InternalAsString( bool verbose ) const {
@@ -581,8 +581,8 @@ std::string bhkConvexShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexShape::InternalGetRefs() const {
@@ -591,12 +591,12 @@ std::list<NiObjectRef> bhkConvexShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkWorldObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::Read( in, link_stack, version, user_version );
+void bhkWorldObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::Read( in, link_stack, info );
 }
 
-void bhkWorldObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void bhkWorldObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 }
 
 std::string bhkWorldObject::InternalAsString( bool verbose ) const {
@@ -606,8 +606,8 @@ std::string bhkWorldObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkWorldObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
+void bhkWorldObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkWorldObject::InternalGetRefs() const {
@@ -616,25 +616,25 @@ std::list<NiObjectRef> bhkWorldObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkEntity::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkEntity::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkWorldObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	bhkWorldObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( layer, in, version );
-	NifStream( colFilter, in, version );
-	NifStream( unknownShort, in, version );
+	NifStream( layer, in, info );
+	NifStream( colFilter, in, info );
+	NifStream( unknownShort, in, info );
 }
 
-void bhkEntity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkWorldObject::Write( out, link_map, version, user_version );
+void bhkEntity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkWorldObject::Write( out, link_map, info );
 	if ( shape != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( layer, out, version );
-	NifStream( colFilter, out, version );
-	NifStream( unknownShort, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( layer, out, info );
+	NifStream( colFilter, out, info );
+	NifStream( unknownShort, out, info );
 }
 
 std::string bhkEntity::InternalAsString( bool verbose ) const {
@@ -648,9 +648,9 @@ std::string bhkEntity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkEntity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkWorldObject::FixLinks( objects, link_stack, version, user_version );
-	shape = FixLink<bhkShape>( objects, link_stack, version );
+void bhkEntity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkWorldObject::FixLinks( objects, link_stack, info );
+	shape = FixLink<bhkShape>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkEntity::InternalGetRefs() const {
@@ -661,27 +661,27 @@ std::list<NiObjectRef> bhkEntity::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownShort, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownShort, out, info );
 	if ( body != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(body) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(body) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiCollisionObject::InternalAsString( bool verbose ) const {
@@ -694,10 +694,10 @@ std::string NiCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	parent = FixLink<NiAVObject>( objects, link_stack, version );
-	body = FixLink<NiObject>( objects, link_stack, version );
+void NiCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	parent = FixLink<NiAVObject>( objects, link_stack, info );
+	body = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCollisionObject::InternalGetRefs() const {
@@ -708,28 +708,28 @@ std::list<NiObjectRef> NiCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void NiExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( name, in, version );
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( name, in, info );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( name, out, version );
+void NiExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( name, out, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		if ( nextExtraData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(nextExtraData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(nextExtraData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -742,10 +742,10 @@ std::string NiExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		nextExtraData = FixLink<NiExtraData>( objects, link_stack, version );
+void NiExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		nextExtraData = FixLink<NiExtraData>( objects, link_stack, info );
 	};
 }
 
@@ -757,12 +757,12 @@ std::list<NiObjectRef> NiExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void NiInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string NiInterpolator::InternalAsString( bool verbose ) const {
@@ -772,8 +772,8 @@ std::string NiInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiInterpolator::InternalGetRefs() const {
@@ -782,16 +782,16 @@ std::list<NiObjectRef> NiInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( unknownInt, in, version );
+void NiBlendInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( unknownInt, in, info );
 }
 
-void NiBlendInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
-	NifStream( unknownInt, out, version );
+void NiBlendInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
+	NifStream( unknownInt, out, info );
 }
 
 std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
@@ -803,8 +803,8 @@ std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendInterpolator::InternalGetRefs() const {
@@ -813,29 +813,29 @@ std::list<NiObjectRef> NiBlendInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBSplineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( startTime, in, version );
-	NifStream( stopTime, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( startTime, in, info );
+	NifStream( stopTime, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBSplineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( startTime, out, version );
-	NifStream( stopTime, out, version );
+void NiBSplineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( startTime, out, info );
+	NifStream( stopTime, out, info );
 	if ( splineData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(splineData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(splineData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( basisData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(basisData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(basisData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
@@ -849,10 +849,10 @@ std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	splineData = FixLink<NiBSplineData>( objects, link_stack, version );
-	basisData = FixLink<NiBSplineBasisData>( objects, link_stack, version );
+void NiBSplineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	splineData = FixLink<NiBSplineData>( objects, link_stack, info );
+	basisData = FixLink<NiBSplineBasisData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
@@ -865,49 +865,49 @@ std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiObjectNET::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiObjectNET::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numExtraDataList, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numExtraDataList, in, info );
 		extraDataList.resize(numExtraDataList);
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiObjectNET::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiObjectNET::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numExtraDataList = (unsigned int)(extraDataList.size());
-	NifStream( name, out, version );
-	if ( version <= 0x04020200 ) {
+	NifStream( name, out, info );
+	if ( info.version <= 0x04020200 ) {
 		if ( extraData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(extraData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(extraData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numExtraDataList, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numExtraDataList, out, info );
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
 			if ( extraDataList[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(extraDataList[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(extraDataList[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 	if ( controller != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiObjectNET::InternalAsString( bool verbose ) const {
@@ -934,17 +934,17 @@ std::string NiObjectNET::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiObjectNET::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		extraData = FixLink<NiExtraData>( objects, link_stack, version );
+void NiObjectNET::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		extraData = FixLink<NiExtraData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
-			extraDataList[i2] = FixLink<NiExtraData>( objects, link_stack, version );
+			extraDataList[i2] = FixLink<NiExtraData>( objects, link_stack, info );
 		};
 	};
-	controller = FixLink<NiTimeController>( objects, link_stack, version );
+	controller = FixLink<NiTimeController>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiObjectNET::InternalGetRefs() const {
@@ -961,78 +961,78 @@ std::list<NiObjectRef> NiObjectNET::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAVObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAVObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObjectNET::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( velocity, in, version );
-	};
-	NifStream( numProperties, in, version );
+	NiObjectNET::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( velocity, in, info );
+	};
+	NifStream( numProperties, in, info );
 	properties.resize(numProperties);
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( hasBoundingBox, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( hasBoundingBox, in, info );
 		if ( (hasBoundingBox != 0) ) {
-			NifStream( boundingBox.unknownInt, in, version );
-			NifStream( boundingBox.translation, in, version );
-			NifStream( boundingBox.rotation, in, version );
-			NifStream( boundingBox.radius, in, version );
+			NifStream( boundingBox.unknownInt, in, info );
+			NifStream( boundingBox.translation, in, info );
+			NifStream( boundingBox.rotation, in, info );
+			NifStream( boundingBox.radius, in, info );
 		};
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( block_num, in, version );
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiAVObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiAVObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 	numProperties = (unsigned int)(properties.size());
-	NifStream( flags, out, version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	if ( version <= 0x04020200 ) {
-		NifStream( velocity, out, version );
-	};
-	NifStream( numProperties, out, version );
+	NifStream( flags, out, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( velocity, out, info );
+	};
+	NifStream( numProperties, out, info );
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
 		if ( properties[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(properties[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(properties[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( hasBoundingBox, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( hasBoundingBox, out, info );
 		if ( (hasBoundingBox != 0) ) {
-			NifStream( boundingBox.unknownInt, out, version );
-			NifStream( boundingBox.translation, out, version );
-			NifStream( boundingBox.rotation, out, version );
-			NifStream( boundingBox.radius, out, version );
+			NifStream( boundingBox.unknownInt, out, info );
+			NifStream( boundingBox.translation, out, info );
+			NifStream( boundingBox.rotation, out, info );
+			NifStream( boundingBox.radius, out, info );
 		};
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
 		if ( collisionData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(collisionData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(collisionData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		if ( collisionObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(collisionObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(collisionObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1071,16 +1071,16 @@ std::string NiAVObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAVObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiAVObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
-		properties[i1] = FixLink<NiProperty>( objects, link_stack, version );
+		properties[i1] = FixLink<NiProperty>( objects, link_stack, info );
 	};
-	if ( ( version >= 0x0A000100 ) && ( version <= 0x0A020000 ) ) {
-		collisionData = FixLink<NiCollisionData>( objects, link_stack, version );
+	if ( ( info.version >= 0x0A000100 ) && ( info.version <= 0x0A020000 ) ) {
+		collisionData = FixLink<NiCollisionData>( objects, link_stack, info );
 	};
-	if ( version >= 0x14000004 ) {
-		collisionObject = FixLink<NiCollisionObject>( objects, link_stack, version );
+	if ( info.version >= 0x14000004 ) {
+		collisionObject = FixLink<NiCollisionObject>( objects, link_stack, info );
 	};
 }
 
@@ -1098,48 +1098,48 @@ std::list<NiObjectRef> NiAVObject::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDynamicEffect::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDynamicEffect::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( switchState, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( switchState, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numAffectedNodes, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numAffectedNodes, in, info );
 		affectedNodeListPointers.resize(numAffectedNodes);
 		for (unsigned int i2 = 0; i2 < affectedNodeListPointers.size(); i2++) {
-			NifStream( affectedNodeListPointers[i2], in, version );
+			NifStream( affectedNodeListPointers[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( numAffectedNodes, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numAffectedNodes, in, info );
 		affectedNodes.resize(numAffectedNodes);
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiDynamicEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiDynamicEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	numAffectedNodes = (unsigned int)(affectedNodeListPointers.size());
-	if ( version >= 0x0A020000 ) {
-		NifStream( switchState, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( switchState, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numAffectedNodes, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numAffectedNodes, out, info );
 		for (unsigned int i2 = 0; i2 < affectedNodeListPointers.size(); i2++) {
-			NifStream( affectedNodeListPointers[i2], out, version );
+			NifStream( affectedNodeListPointers[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( numAffectedNodes, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numAffectedNodes, out, info );
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
 			if ( affectedNodes[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(affectedNodes[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(affectedNodes[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1178,11 +1178,11 @@ std::string NiDynamicEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDynamicEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiDynamicEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
-			affectedNodes[i2] = FixLink<NiAVObject>( objects, link_stack, version );
+			affectedNodes[i2] = FixLink<NiAVObject>( objects, link_stack, info );
 		};
 	};
 }
@@ -1197,20 +1197,20 @@ std::list<NiObjectRef> NiDynamicEffect::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::Read( in, link_stack, version, user_version );
-	NifStream( dimmer, in, version );
-	NifStream( ambientColor, in, version );
-	NifStream( diffuseColor, in, version );
-	NifStream( specularColor, in, version );
+void NiLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::Read( in, link_stack, info );
+	NifStream( dimmer, in, info );
+	NifStream( ambientColor, in, info );
+	NifStream( diffuseColor, in, info );
+	NifStream( specularColor, in, info );
 }
 
-void NiLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiDynamicEffect::Write( out, link_map, version, user_version );
-	NifStream( dimmer, out, version );
-	NifStream( ambientColor, out, version );
-	NifStream( diffuseColor, out, version );
-	NifStream( specularColor, out, version );
+void NiLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiDynamicEffect::Write( out, link_map, info );
+	NifStream( dimmer, out, info );
+	NifStream( ambientColor, out, info );
+	NifStream( diffuseColor, out, info );
+	NifStream( specularColor, out, info );
 }
 
 std::string NiLight::InternalAsString( bool verbose ) const {
@@ -1224,8 +1224,8 @@ std::string NiLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
+void NiLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLight::InternalGetRefs() const {
@@ -1234,12 +1234,12 @@ std::list<NiObjectRef> NiLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::Read( in, link_stack, version, user_version );
+void NiProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::Read( in, link_stack, info );
 }
 
-void NiProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 }
 
 std::string NiProperty::InternalAsString( bool verbose ) const {
@@ -1249,8 +1249,8 @@ std::string NiProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiProperty::InternalGetRefs() const {
@@ -1259,25 +1259,25 @@ std::list<NiObjectRef> NiProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	NifStream( order, in, version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	NifStream( order, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( active, in, version );
+	NifStream( active, in, info );
 }
 
-void NiPSysModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( name, out, version );
-	NifStream( order, out, version );
+void NiPSysModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( name, out, info );
+	NifStream( order, out, info );
 	if ( target != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( active, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( active, out, info );
 }
 
 std::string NiPSysModifier::InternalAsString( bool verbose ) const {
@@ -1291,9 +1291,9 @@ std::string NiPSysModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	target = FixLink<NiParticleSystem>( objects, link_stack, version );
+void NiPSysModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	target = FixLink<NiParticleSystem>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysModifier::InternalGetRefs() const {
@@ -1302,38 +1302,38 @@ std::list<NiObjectRef> NiPSysModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( speed, in, version );
-	NifStream( speedVariation, in, version );
-	NifStream( declination, in, version );
-	NifStream( declinationVariation, in, version );
-	NifStream( planarAngle, in, version );
-	NifStream( planarAngleVariation, in, version );
-	NifStream( initialColor, in, version );
-	NifStream( initialRadius, in, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( radiusVariation, in, version );
+void NiPSysEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( speed, in, info );
+	NifStream( speedVariation, in, info );
+	NifStream( declination, in, info );
+	NifStream( declinationVariation, in, info );
+	NifStream( planarAngle, in, info );
+	NifStream( planarAngleVariation, in, info );
+	NifStream( initialColor, in, info );
+	NifStream( initialRadius, in, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( radiusVariation, in, info );
 	};
-	NifStream( lifeSpan, in, version );
-	NifStream( lifeSpanVariation, in, version );
+	NifStream( lifeSpan, in, info );
+	NifStream( lifeSpanVariation, in, info );
 }
 
-void NiPSysEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( speed, out, version );
-	NifStream( speedVariation, out, version );
-	NifStream( declination, out, version );
-	NifStream( declinationVariation, out, version );
-	NifStream( planarAngle, out, version );
-	NifStream( planarAngleVariation, out, version );
-	NifStream( initialColor, out, version );
-	NifStream( initialRadius, out, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( radiusVariation, out, version );
+void NiPSysEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( speed, out, info );
+	NifStream( speedVariation, out, info );
+	NifStream( declination, out, info );
+	NifStream( declinationVariation, out, info );
+	NifStream( planarAngle, out, info );
+	NifStream( planarAngleVariation, out, info );
+	NifStream( initialColor, out, info );
+	NifStream( initialRadius, out, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( radiusVariation, out, info );
 	};
-	NifStream( lifeSpan, out, version );
-	NifStream( lifeSpanVariation, out, version );
+	NifStream( lifeSpan, out, info );
+	NifStream( lifeSpanVariation, out, info );
 }
 
 std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
@@ -1354,8 +1354,8 @@ std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitter::InternalGetRefs() const {
@@ -1364,22 +1364,22 @@ std::list<NiObjectRef> NiPSysEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysVolumeEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysVolumeEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysEmitter::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiPSysEmitter::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysVolumeEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysEmitter::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiPSysVolumeEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysEmitter::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
 		if ( emitterObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(emitterObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(emitterObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1391,10 +1391,10 @@ std::string NiPSysVolumeEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		emitterObject = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysVolumeEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysEmitter::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		emitterObject = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -1404,35 +1404,35 @@ std::list<NiObjectRef> NiPSysVolumeEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTimeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTimeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( flags, in, version );
-	NifStream( frequency, in, version );
-	NifStream( phase, in, version );
-	NifStream( startTime, in, version );
-	NifStream( stopTime, in, version );
-	NifStream( block_num, in, version );
+	NifStream( flags, in, info );
+	NifStream( frequency, in, info );
+	NifStream( phase, in, info );
+	NifStream( startTime, in, info );
+	NifStream( stopTime, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTimeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiTimeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( nextController != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(nextController) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(nextController) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( flags, out, version );
-	NifStream( frequency, out, version );
-	NifStream( phase, out, version );
-	NifStream( startTime, out, version );
-	NifStream( stopTime, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( flags, out, info );
+	NifStream( frequency, out, info );
+	NifStream( phase, out, info );
+	NifStream( startTime, out, info );
+	NifStream( stopTime, out, info );
 	if ( target != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTimeController::InternalAsString( bool verbose ) const {
@@ -1449,10 +1449,10 @@ std::string NiTimeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTimeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	nextController = FixLink<NiTimeController>( objects, link_stack, version );
-	target = FixLink<NiObjectNET>( objects, link_stack, version );
+void NiTimeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	nextController = FixLink<NiTimeController>( objects, link_stack, info );
+	target = FixLink<NiObjectNET>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTimeController::InternalGetRefs() const {
@@ -1463,37 +1463,37 @@ std::list<NiObjectRef> NiTimeController::InternalGetRefs() const {
 	return refs;
 }
 
-void ABoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void ABoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt1, in, version );
-	NifStream( numNodeGroups, in, version );
-	NifStream( numNodeGroups2, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( numNodeGroups, in, info );
+	NifStream( numNodeGroups2, in, info );
 	nodeGroups.resize(numNodeGroups);
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
-		NifStream( nodeGroups[i1].numNodes, in, version );
+		NifStream( nodeGroups[i1].numNodes, in, info );
 		nodeGroups[i1].nodes.resize(nodeGroups[i1].numNodes);
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void ABoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void ABoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numNodeGroups = (unsigned int)(nodeGroups.size());
-	NifStream( unknownInt1, out, version );
-	NifStream( numNodeGroups, out, version );
-	NifStream( numNodeGroups2, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( numNodeGroups, out, info );
+	NifStream( numNodeGroups2, out, info );
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
 		nodeGroups[i1].numNodes = (unsigned int)(nodeGroups[i1].nodes.size());
-		NifStream( nodeGroups[i1].numNodes, out, version );
+		NifStream( nodeGroups[i1].numNodes, out, info );
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
 			if ( nodeGroups[i1].nodes[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(nodeGroups[i1].nodes[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(nodeGroups[i1].nodes[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1530,11 +1530,11 @@ std::string ABoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void ABoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void ABoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < nodeGroups.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, version );
+			nodeGroups[i1].nodes[i2] = FixLink<NiNode>( objects, link_stack, info );
 		};
 	};
 }
@@ -1549,22 +1549,22 @@ std::list<NiObjectRef> ABoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSingleInterpolatorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSingleInterpolatorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiSingleInterpolatorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A020000 ) {
+void NiSingleInterpolatorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A020000 ) {
 		if ( interpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1576,10 +1576,10 @@ std::string NiSingleInterpolatorController::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiSingleInterpolatorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
+void NiSingleInterpolatorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		interpolator = FixLink<NiInterpolator>( objects, link_stack, info );
 	};
 }
 
@@ -1591,14 +1591,14 @@ std::list<NiObjectRef> NiSingleInterpolatorController::InternalGetRefs() const {
 	return refs;
 }
 
-void APSysCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( modifierName, in, version );
+void APSysCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( modifierName, in, info );
 }
 
-void APSysCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	NifStream( modifierName, out, version );
+void APSysCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	NifStream( modifierName, out, info );
 }
 
 std::string APSysCtlr::InternalAsString( bool verbose ) const {
@@ -1609,8 +1609,8 @@ std::string APSysCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void APSysCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> APSysCtlr::InternalGetRefs() const {
@@ -1619,45 +1619,45 @@ std::list<NiObjectRef> APSysCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeometry::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeometry::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	if ( version >= 0x0303000D ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0303000D ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( hasShader, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( hasShader, in, info );
 		if ( (hasShader != 0) ) {
-			NifStream( shaderName, in, version );
-			NifStream( block_num, in, version );
+			NifStream( shaderName, in, info );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiGeometry::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiGeometry::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	if ( version >= 0x0303000D ) {
+		NifStream( 0xffffffff, out, info );
+	if ( info.version >= 0x0303000D ) {
 		if ( skinInstance != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinInstance) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinInstance) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( hasShader, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( hasShader, out, info );
 		if ( (hasShader != 0) ) {
-			NifStream( shaderName, out, version );
+			NifStream( shaderName, out, info );
 			if ( unknownLink != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -1676,15 +1676,15 @@ std::string NiGeometry::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeometry::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiGeometryData>( objects, link_stack, version );
-	if ( version >= 0x0303000D ) {
-		skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
+void NiGeometry::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	data = FixLink<NiGeometryData>( objects, link_stack, info );
+	if ( info.version >= 0x0303000D ) {
+		skinInstance = FixLink<NiSkinInstance>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		if ( (hasShader != 0) ) {
-			unknownLink = FixLink<NiObject>( objects, link_stack, version );
+			unknownLink = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
 }
@@ -1701,12 +1701,12 @@ std::list<NiObjectRef> NiGeometry::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriBasedGeom::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::Read( in, link_stack, version, user_version );
+void NiTriBasedGeom::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::Read( in, link_stack, info );
 }
 
-void NiTriBasedGeom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometry::Write( out, link_map, version, user_version );
+void NiTriBasedGeom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometry::Write( out, link_map, info );
 }
 
 std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
@@ -1716,8 +1716,8 @@ std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::FixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriBasedGeom::InternalGetRefs() const {
@@ -1726,158 +1726,158 @@ std::list<NiObjectRef> NiTriBasedGeom::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeometryData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeometryData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A020000 ) {
-		NifStream( name, in, version );
+	NiObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, in, info );
 	};
-	NifStream( numVertices, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort1, in, version );
+	NifStream( numVertices, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort1, in, info );
 	};
-	NifStream( hasVertices, in, version );
+	NifStream( hasVertices, in, info );
 	if ( (hasVertices != 0) ) {
 		vertices.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < vertices.size(); i2++) {
-			NifStream( vertices[i2], in, version );
+			NifStream( vertices[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numUvSets2, in, version );
-		NifStream( unknownByte, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets2, in, info );
+		NifStream( unknownByte, in, info );
 	};
-	NifStream( hasNormals, in, version );
+	NifStream( hasNormals, in, info );
 	if ( (hasNormals != 0) ) {
 		normals.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < normals.size(); i2++) {
-			NifStream( normals[i2], in, version );
+			NifStream( normals[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) {
 			unknownVectors1.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownVectors1.size(); i3++) {
-				NifStream( unknownVectors1[i3], in, version );
+				NifStream( unknownVectors1[i3], in, info );
 			};
 			unknownVectors2.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownVectors2.size(); i3++) {
-				NifStream( unknownVectors2[i3], in, version );
+				NifStream( unknownVectors2[i3], in, info );
 			};
 		};
 	};
-	NifStream( center, in, version );
-	NifStream( radius, in, version );
-	NifStream( hasVertexColors, in, version );
+	NifStream( center, in, info );
+	NifStream( radius, in, info );
+	NifStream( hasVertexColors, in, info );
 	if ( (hasVertexColors != 0) ) {
 		vertexColors.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < vertexColors.size(); i2++) {
-			NifStream( vertexColors[i2], in, version );
+			NifStream( vertexColors[i2], in, info );
 		};
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( numUvSets, in, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( hasUv, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasUv, in, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		uvSets.resize(numUvSets);
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			uvSets[i2].resize(numVertices);
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], in, version );
+				NifStream( uvSets[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		uvSets.resize((numUvSets2 & 63));
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			uvSets[i2].resize(numVertices);
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], in, version );
+				NifStream( uvSets[i2][i3], in, info );
 			};
 		};
-		NifStream( unknownShort2, in, version );
+		NifStream( unknownShort2, in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiGeometryData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiGeometryData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numUvSets = (unsigned short)(uvSets.size());
 	numUvSets2 = (byte)(uvSets.size());
 	numVertices = (unsigned short)(vertices.size());
-	if ( version >= 0x0A020000 ) {
-		NifStream( name, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( name, out, info );
 	};
-	NifStream( numVertices, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort1, out, version );
+	NifStream( numVertices, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort1, out, info );
 	};
-	NifStream( hasVertices, out, version );
+	NifStream( hasVertices, out, info );
 	if ( (hasVertices != 0) ) {
 		for (unsigned int i2 = 0; i2 < vertices.size(); i2++) {
-			NifStream( vertices[i2], out, version );
+			NifStream( vertices[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numUvSets2, out, version );
-		NifStream( unknownByte, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numUvSets2, out, info );
+		NifStream( unknownByte, out, info );
 	};
-	NifStream( hasNormals, out, version );
+	NifStream( hasNormals, out, info );
 	if ( (hasNormals != 0) ) {
 		for (unsigned int i2 = 0; i2 < normals.size(); i2++) {
-			NifStream( normals[i2], out, version );
+			NifStream( normals[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) {
 			for (unsigned int i3 = 0; i3 < unknownVectors1.size(); i3++) {
-				NifStream( unknownVectors1[i3], out, version );
+				NifStream( unknownVectors1[i3], out, info );
 			};
 			for (unsigned int i3 = 0; i3 < unknownVectors2.size(); i3++) {
-				NifStream( unknownVectors2[i3], out, version );
+				NifStream( unknownVectors2[i3], out, info );
 			};
 		};
 	};
-	NifStream( center, out, version );
-	NifStream( radius, out, version );
-	NifStream( hasVertexColors, out, version );
+	NifStream( center, out, info );
+	NifStream( radius, out, info );
+	NifStream( hasVertexColors, out, info );
 	if ( (hasVertexColors != 0) ) {
 		for (unsigned int i2 = 0; i2 < vertexColors.size(); i2++) {
-			NifStream( vertexColors[i2], out, version );
+			NifStream( vertexColors[i2], out, info );
 		};
 	};
-	if ( version <= 0x04020200 ) {
-		NifStream( numUvSets, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( numUvSets, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( hasUv, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( hasUv, out, info );
 	};
-	if ( version <= 0x04020200 ) {
+	if ( info.version <= 0x04020200 ) {
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], out, version );
+				NifStream( uvSets[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < uvSets.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < uvSets[i2].size(); i3++) {
-				NifStream( uvSets[i2][i3], out, version );
+				NifStream( uvSets[i2][i3], out, info );
 			};
 		};
-		NifStream( unknownShort2, out, version );
+		NifStream( unknownShort2, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -1987,10 +1987,10 @@ std::string NiGeometryData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeometryData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		unknownLink = FixLink<NiObject>( objects, link_stack, version );
+void NiGeometryData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		unknownLink = FixLink<NiObject>( objects, link_stack, info );
 	};
 }
 
@@ -2002,14 +2002,14 @@ std::list<NiObjectRef> NiGeometryData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriBasedGeomData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	NifStream( numTriangles, in, version );
+void NiTriBasedGeomData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	NifStream( numTriangles, in, info );
 }
 
-void NiTriBasedGeomData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	NifStream( numTriangles, out, version );
+void NiTriBasedGeomData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	NifStream( numTriangles, out, info );
 }
 
 std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
@@ -2020,8 +2020,8 @@ std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriBasedGeomData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeomData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriBasedGeomData::InternalGetRefs() const {
@@ -2030,54 +2030,54 @@ std::list<NiObjectRef> NiTriBasedGeomData::InternalGetRefs() const {
 	return refs;
 }
 
-void APSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	NifStream( hasUnknownFloats1, in, version );
+void APSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	NifStream( hasUnknownFloats1, in, info );
 	if ( (hasUnknownFloats1 != 0) ) {
 		unknownFloats1.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats1.size(); i2++) {
-			NifStream( unknownFloats1[i2], in, version );
+			NifStream( unknownFloats1[i2], in, info );
 		};
 	};
-	NifStream( unknownShort3, in, version );
-	NifStream( hasUnknownFloats2, in, version );
+	NifStream( unknownShort3, in, info );
+	NifStream( hasUnknownFloats2, in, info );
 	if ( (hasUnknownFloats2 != 0) ) {
 		unknownFloats2.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], in, version );
+			NifStream( unknownFloats2[i2], in, info );
 		};
 	};
-	NifStream( hasUnknownFloats3, in, version );
+	NifStream( hasUnknownFloats3, in, info );
 	if ( (hasUnknownFloats3 != 0) ) {
 		unknownFloats3.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats3.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], in, version );
+				NifStream( unknownFloats3[i2][i3], in, info );
 			};
 		};
 	};
 }
 
-void APSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	NifStream( hasUnknownFloats1, out, version );
+void APSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	NifStream( hasUnknownFloats1, out, info );
 	if ( (hasUnknownFloats1 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats1.size(); i2++) {
-			NifStream( unknownFloats1[i2], out, version );
+			NifStream( unknownFloats1[i2], out, info );
 		};
 	};
-	NifStream( unknownShort3, out, version );
-	NifStream( hasUnknownFloats2, out, version );
+	NifStream( unknownShort3, out, info );
+	NifStream( hasUnknownFloats2, out, info );
 	if ( (hasUnknownFloats2 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			NifStream( unknownFloats2[i2], out, version );
+			NifStream( unknownFloats2[i2], out, info );
 		};
 	};
-	NifStream( hasUnknownFloats3, out, version );
+	NifStream( hasUnknownFloats3, out, info );
 	if ( (hasUnknownFloats3 != 0) ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats3.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], out, version );
+				NifStream( unknownFloats3[i2][i3], out, info );
 			};
 		};
 	};
@@ -2138,8 +2138,8 @@ std::string APSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void APSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void APSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> APSysData::InternalGetRefs() const {
@@ -2148,16 +2148,16 @@ std::list<NiObjectRef> APSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBlendCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
+void bhkBlendCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
 }
 
-void bhkBlendCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
+void bhkBlendCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
 }
 
 std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
@@ -2169,8 +2169,8 @@ std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkBlendCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBlendCollisionObject::InternalGetRefs() const {
@@ -2179,14 +2179,14 @@ std::list<NiObjectRef> bhkBlendCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBlendController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
+void bhkBlendController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
 }
 
-void bhkBlendController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	NifStream( unknownInt, out, version );
+void bhkBlendController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	NifStream( unknownInt, out, info );
 }
 
 std::string bhkBlendController::InternalAsString( bool verbose ) const {
@@ -2197,8 +2197,8 @@ std::string bhkBlendController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBlendController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void bhkBlendController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBlendController::InternalGetRefs() const {
@@ -2207,26 +2207,26 @@ std::list<NiObjectRef> bhkBlendController::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkBoxShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( unknownShort3, in, version );
-	NifStream( unknownShort4, in, version );
-	NifStream( dimensions, in, version );
-	NifStream( min_Size, in, version );
+void bhkBoxShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownShort3, in, info );
+	NifStream( unknownShort4, in, info );
+	NifStream( dimensions, in, info );
+	NifStream( min_Size, in, info );
 }
 
-void bhkBoxShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownShort2, out, version );
-	NifStream( unknownShort3, out, version );
-	NifStream( unknownShort4, out, version );
-	NifStream( dimensions, out, version );
-	NifStream( min_Size, out, version );
+void bhkBoxShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownShort3, out, info );
+	NifStream( unknownShort4, out, info );
+	NifStream( dimensions, out, info );
+	NifStream( min_Size, out, info );
 }
 
 std::string bhkBoxShape::InternalAsString( bool verbose ) const {
@@ -2243,8 +2243,8 @@ std::string bhkBoxShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkBoxShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkBoxShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkBoxShape::InternalGetRefs() const {
@@ -2253,30 +2253,30 @@ std::list<NiObjectRef> bhkBoxShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkCapsuleShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( unknownShort3, in, version );
-	NifStream( unknownShort4, in, version );
-	NifStream( firstPoint, in, version );
-	NifStream( radius1, in, version );
-	NifStream( secondPoint, in, version );
-	NifStream( radius2, in, version );
+void bhkCapsuleShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( radius, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( unknownShort3, in, info );
+	NifStream( unknownShort4, in, info );
+	NifStream( firstPoint, in, info );
+	NifStream( radius1, in, info );
+	NifStream( secondPoint, in, info );
+	NifStream( radius2, in, info );
 }
 
-void bhkCapsuleShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownShort2, out, version );
-	NifStream( unknownShort3, out, version );
-	NifStream( unknownShort4, out, version );
-	NifStream( firstPoint, out, version );
-	NifStream( radius1, out, version );
-	NifStream( secondPoint, out, version );
-	NifStream( radius2, out, version );
+void bhkCapsuleShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( radius, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownShort2, out, info );
+	NifStream( unknownShort3, out, info );
+	NifStream( unknownShort4, out, info );
+	NifStream( firstPoint, out, info );
+	NifStream( radius1, out, info );
+	NifStream( secondPoint, out, info );
+	NifStream( radius2, out, info );
 }
 
 std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
@@ -2295,8 +2295,8 @@ std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCapsuleShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkCapsuleShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkCapsuleShape::InternalGetRefs() const {
@@ -2305,12 +2305,12 @@ std::list<NiObjectRef> bhkCapsuleShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
+void bhkCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
 }
 
-void bhkCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
+void bhkCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
 }
 
 std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
@@ -2320,8 +2320,8 @@ std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkCollisionObject::InternalGetRefs() const {
@@ -2330,37 +2330,37 @@ std::list<NiObjectRef> bhkCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexVerticesShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
+void bhkConvexVerticesShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknownFloats1[i1], in, version );
+		NifStream( unknownFloats1[i1], in, info );
 	};
-	NifStream( numVertices, in, version );
+	NifStream( numVertices, in, info );
 	vertices.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], in, version );
+		NifStream( vertices[i1], in, info );
 	};
-	NifStream( numNormals, in, version );
+	NifStream( numNormals, in, info );
 	normals.resize(numNormals);
 	for (unsigned int i1 = 0; i1 < normals.size(); i1++) {
-		NifStream( normals[i1], in, version );
+		NifStream( normals[i1], in, info );
 	};
 }
 
-void bhkConvexVerticesShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkConvexVerticesShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numNormals = (unsigned int)(normals.size());
 	numVertices = (unsigned int)(vertices.size());
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknownFloats1[i1], out, version );
+		NifStream( unknownFloats1[i1], out, info );
 	};
-	NifStream( numVertices, out, version );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], out, version );
+		NifStream( vertices[i1], out, info );
 	};
-	NifStream( numNormals, out, version );
+	NifStream( numNormals, out, info );
 	for (unsigned int i1 = 0; i1 < normals.size(); i1++) {
-		NifStream( normals[i1], out, version );
+		NifStream( normals[i1], out, info );
 	};
 }
 
@@ -2411,8 +2411,8 @@ std::string bhkConvexVerticesShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexVerticesShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexVerticesShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexVerticesShape::InternalGetRefs() const {
@@ -2421,20 +2421,20 @@ std::list<NiObjectRef> bhkConvexVerticesShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
+void bhkHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( unknownFloats[i1][i2], in, version );
+			NifStream( unknownFloats[i1][i2], in, info );
 		};
 	};
 }
 
-void bhkHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
+void bhkHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( unknownFloats[i1][i2], out, version );
+			NifStream( unknownFloats[i1][i2], out, info );
 		};
 	};
 }
@@ -2460,8 +2460,8 @@ std::string bhkHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkHingeConstraint::InternalGetRefs() const {
@@ -2470,32 +2470,32 @@ std::list<NiObjectRef> bhkHingeConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkLimitedHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( limitedHinge.pivotA, in, version );
-	NifStream( limitedHinge.axleA, in, version );
-	NifStream( limitedHinge.perp2axleina1, in, version );
-	NifStream( limitedHinge.perp2axleina2, in, version );
-	NifStream( limitedHinge.pivotB, in, version );
-	NifStream( limitedHinge.axleB, in, version );
-	NifStream( limitedHinge.perp2axleinb2, in, version );
-	NifStream( limitedHinge.minAngle, in, version );
-	NifStream( limitedHinge.maxAngle, in, version );
-	NifStream( limitedHinge.maxFriction, in, version );
+void bhkLimitedHingeConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( limitedHinge.pivotA, in, info );
+	NifStream( limitedHinge.axleA, in, info );
+	NifStream( limitedHinge.perp2axleina1, in, info );
+	NifStream( limitedHinge.perp2axleina2, in, info );
+	NifStream( limitedHinge.pivotB, in, info );
+	NifStream( limitedHinge.axleB, in, info );
+	NifStream( limitedHinge.perp2axleinb2, in, info );
+	NifStream( limitedHinge.minAngle, in, info );
+	NifStream( limitedHinge.maxAngle, in, info );
+	NifStream( limitedHinge.maxFriction, in, info );
 }
 
-void bhkLimitedHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( limitedHinge.pivotA, out, version );
-	NifStream( limitedHinge.axleA, out, version );
-	NifStream( limitedHinge.perp2axleina1, out, version );
-	NifStream( limitedHinge.perp2axleina2, out, version );
-	NifStream( limitedHinge.pivotB, out, version );
-	NifStream( limitedHinge.axleB, out, version );
-	NifStream( limitedHinge.perp2axleinb2, out, version );
-	NifStream( limitedHinge.minAngle, out, version );
-	NifStream( limitedHinge.maxAngle, out, version );
-	NifStream( limitedHinge.maxFriction, out, version );
+void bhkLimitedHingeConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( limitedHinge.pivotA, out, info );
+	NifStream( limitedHinge.axleA, out, info );
+	NifStream( limitedHinge.perp2axleina1, out, info );
+	NifStream( limitedHinge.perp2axleina2, out, info );
+	NifStream( limitedHinge.pivotB, out, info );
+	NifStream( limitedHinge.axleB, out, info );
+	NifStream( limitedHinge.perp2axleinb2, out, info );
+	NifStream( limitedHinge.minAngle, out, info );
+	NifStream( limitedHinge.maxAngle, out, info );
+	NifStream( limitedHinge.maxFriction, out, info );
 }
 
 std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
@@ -2515,8 +2515,8 @@ std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkLimitedHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkLimitedHingeConstraint::InternalGetRefs() const {
@@ -2525,44 +2525,44 @@ std::list<NiObjectRef> bhkLimitedHingeConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkListShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkListShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numSubShapes, in, version );
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numSubShapes, in, info );
 	subShapes.resize(numSubShapes);
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( material, in, version );
+	NifStream( material, in, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
-	NifStream( numUnknownInts, in, version );
+	NifStream( numUnknownInts, in, info );
 	unknownInts.resize(numUnknownInts);
 	for (unsigned int i1 = 0; i1 < unknownInts.size(); i1++) {
-		NifStream( unknownInts[i1], in, version );
+		NifStream( unknownInts[i1], in, info );
 	};
 }
 
-void bhkListShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void bhkListShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numUnknownInts = (unsigned int)(unknownInts.size());
 	numSubShapes = (unsigned int)(subShapes.size());
-	NifStream( numSubShapes, out, version );
+	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
 		if ( subShapes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( material, out, version );
+	NifStream( material, out, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
-	NifStream( numUnknownInts, out, version );
+	NifStream( numUnknownInts, out, info );
 	for (unsigned int i1 = 0; i1 < unknownInts.size(); i1++) {
-		NifStream( unknownInts[i1], out, version );
+		NifStream( unknownInts[i1], out, info );
 	};
 }
 
@@ -2614,10 +2614,10 @@ std::string bhkListShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkListShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
+void bhkListShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, version );
+		subShapes[i1] = FixLink<bhkShape>( objects, link_stack, info );
 	};
 }
 
@@ -2631,87 +2631,87 @@ std::list<NiObjectRef> bhkListShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMalleableConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMalleableConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( type, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( block_num, in, version );
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( type, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt3, in, version );
+	NifStream( unknownInt3, in, info );
 	if ( (type == 7) ) {
-		NifStream( ragdoll.pivotA, in, version );
-		NifStream( ragdoll.planeA, in, version );
-		NifStream( ragdoll.twistA, in, version );
-		NifStream( ragdoll.pivotB, in, version );
-		NifStream( ragdoll.planeB, in, version );
-		NifStream( ragdoll.twistB, in, version );
-		NifStream( ragdoll.coneMinAngle, in, version );
-		NifStream( ragdoll.planeMinAngle, in, version );
-		NifStream( ragdoll.planeMaxAngle, in, version );
-		NifStream( ragdoll.twistMinAngle, in, version );
-		NifStream( ragdoll.twistMaxAngle, in, version );
-		NifStream( ragdoll.maxFriction, in, version );
+		NifStream( ragdoll.pivotA, in, info );
+		NifStream( ragdoll.planeA, in, info );
+		NifStream( ragdoll.twistA, in, info );
+		NifStream( ragdoll.pivotB, in, info );
+		NifStream( ragdoll.planeB, in, info );
+		NifStream( ragdoll.twistB, in, info );
+		NifStream( ragdoll.coneMinAngle, in, info );
+		NifStream( ragdoll.planeMinAngle, in, info );
+		NifStream( ragdoll.planeMaxAngle, in, info );
+		NifStream( ragdoll.twistMinAngle, in, info );
+		NifStream( ragdoll.twistMaxAngle, in, info );
+		NifStream( ragdoll.maxFriction, in, info );
 	};
 	if ( (type == 2) ) {
-		NifStream( limitedHinge.pivotA, in, version );
-		NifStream( limitedHinge.axleA, in, version );
-		NifStream( limitedHinge.perp2axleina1, in, version );
-		NifStream( limitedHinge.perp2axleina2, in, version );
-		NifStream( limitedHinge.pivotB, in, version );
-		NifStream( limitedHinge.axleB, in, version );
-		NifStream( limitedHinge.perp2axleinb2, in, version );
-		NifStream( limitedHinge.minAngle, in, version );
-		NifStream( limitedHinge.maxAngle, in, version );
-		NifStream( limitedHinge.maxFriction, in, version );
-	};
-	NifStream( tau, in, version );
-	NifStream( damping, in, version );
-}
-
-void bhkMalleableConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( type, out, version );
-	NifStream( unknownInt2, out, version );
+		NifStream( limitedHinge.pivotA, in, info );
+		NifStream( limitedHinge.axleA, in, info );
+		NifStream( limitedHinge.perp2axleina1, in, info );
+		NifStream( limitedHinge.perp2axleina2, in, info );
+		NifStream( limitedHinge.pivotB, in, info );
+		NifStream( limitedHinge.axleB, in, info );
+		NifStream( limitedHinge.perp2axleinb2, in, info );
+		NifStream( limitedHinge.minAngle, in, info );
+		NifStream( limitedHinge.maxAngle, in, info );
+		NifStream( limitedHinge.maxFriction, in, info );
+	};
+	NifStream( tau, in, info );
+	NifStream( damping, in, info );
+}
+
+void bhkMalleableConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( type, out, info );
+	NifStream( unknownInt2, out, info );
 	if ( unknownLink1 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt3, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt3, out, info );
 	if ( (type == 7) ) {
-		NifStream( ragdoll.pivotA, out, version );
-		NifStream( ragdoll.planeA, out, version );
-		NifStream( ragdoll.twistA, out, version );
-		NifStream( ragdoll.pivotB, out, version );
-		NifStream( ragdoll.planeB, out, version );
-		NifStream( ragdoll.twistB, out, version );
-		NifStream( ragdoll.coneMinAngle, out, version );
-		NifStream( ragdoll.planeMinAngle, out, version );
-		NifStream( ragdoll.planeMaxAngle, out, version );
-		NifStream( ragdoll.twistMinAngle, out, version );
-		NifStream( ragdoll.twistMaxAngle, out, version );
-		NifStream( ragdoll.maxFriction, out, version );
+		NifStream( ragdoll.pivotA, out, info );
+		NifStream( ragdoll.planeA, out, info );
+		NifStream( ragdoll.twistA, out, info );
+		NifStream( ragdoll.pivotB, out, info );
+		NifStream( ragdoll.planeB, out, info );
+		NifStream( ragdoll.twistB, out, info );
+		NifStream( ragdoll.coneMinAngle, out, info );
+		NifStream( ragdoll.planeMinAngle, out, info );
+		NifStream( ragdoll.planeMaxAngle, out, info );
+		NifStream( ragdoll.twistMinAngle, out, info );
+		NifStream( ragdoll.twistMaxAngle, out, info );
+		NifStream( ragdoll.maxFriction, out, info );
 	};
 	if ( (type == 2) ) {
-		NifStream( limitedHinge.pivotA, out, version );
-		NifStream( limitedHinge.axleA, out, version );
-		NifStream( limitedHinge.perp2axleina1, out, version );
-		NifStream( limitedHinge.perp2axleina2, out, version );
-		NifStream( limitedHinge.pivotB, out, version );
-		NifStream( limitedHinge.axleB, out, version );
-		NifStream( limitedHinge.perp2axleinb2, out, version );
-		NifStream( limitedHinge.minAngle, out, version );
-		NifStream( limitedHinge.maxAngle, out, version );
-		NifStream( limitedHinge.maxFriction, out, version );
+		NifStream( limitedHinge.pivotA, out, info );
+		NifStream( limitedHinge.axleA, out, info );
+		NifStream( limitedHinge.perp2axleina1, out, info );
+		NifStream( limitedHinge.perp2axleina2, out, info );
+		NifStream( limitedHinge.pivotB, out, info );
+		NifStream( limitedHinge.axleB, out, info );
+		NifStream( limitedHinge.perp2axleinb2, out, info );
+		NifStream( limitedHinge.minAngle, out, info );
+		NifStream( limitedHinge.maxAngle, out, info );
+		NifStream( limitedHinge.maxFriction, out, info );
 	};
-	NifStream( tau, out, version );
-	NifStream( damping, out, version );
+	NifStream( tau, out, info );
+	NifStream( damping, out, info );
 }
 
 std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
@@ -2754,10 +2754,10 @@ std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMalleableConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
-	unknownLink1 = FixLink<NiObject>( objects, link_stack, version );
-	unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
+void bhkMalleableConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
+	unknownLink1 = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMalleableConstraint::InternalGetRefs() const {
@@ -2770,42 +2770,42 @@ std::list<NiObjectRef> bhkMalleableConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMoppBvTreeShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkMoppBvTreeShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkShape::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	bhkShape::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( material, in, version );
+	NifStream( material, in, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknown8Bytes[i1], in, version );
+		NifStream( unknown8Bytes[i1], in, info );
 	};
-	NifStream( unknownFloat, in, version );
-	NifStream( moppDataSize, in, version );
-	NifStream( objectCorner, in, version );
-	NifStream( scalingFactor, in, version );
+	NifStream( unknownFloat, in, info );
+	NifStream( moppDataSize, in, info );
+	NifStream( objectCorner, in, info );
+	NifStream( scalingFactor, in, info );
 	moppData.resize(moppDataSize);
 	for (unsigned int i1 = 0; i1 < moppData.size(); i1++) {
-		NifStream( moppData[i1], in, version );
+		NifStream( moppData[i1], in, info );
 	};
 }
 
-void bhkMoppBvTreeShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkShape::Write( out, link_map, version, user_version );
+void bhkMoppBvTreeShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkShape::Write( out, link_map, info );
 	moppDataSize = (unsigned int)(moppData.size());
 	if ( shape != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( material, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( material, out, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknown8Bytes[i1], out, version );
+		NifStream( unknown8Bytes[i1], out, info );
 	};
-	NifStream( unknownFloat, out, version );
-	NifStream( moppDataSize, out, version );
-	NifStream( objectCorner, out, version );
-	NifStream( scalingFactor, out, version );
+	NifStream( unknownFloat, out, info );
+	NifStream( moppDataSize, out, info );
+	NifStream( objectCorner, out, info );
+	NifStream( scalingFactor, out, info );
 	for (unsigned int i1 = 0; i1 < moppData.size(); i1++) {
-		NifStream( moppData[i1], out, version );
+		NifStream( moppData[i1], out, info );
 	};
 }
 
@@ -2847,9 +2847,9 @@ std::string bhkMoppBvTreeShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMoppBvTreeShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkShape::FixLinks( objects, link_stack, version, user_version );
-	shape = FixLink<bhkShape>( objects, link_stack, version );
+void bhkMoppBvTreeShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkShape::FixLinks( objects, link_stack, info );
+	shape = FixLink<bhkShape>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMoppBvTreeShape::InternalGetRefs() const {
@@ -2860,29 +2860,29 @@ std::list<NiObjectRef> bhkMoppBvTreeShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkMultiSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( numSpheres, in, version );
+void bhkMultiSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( numSpheres, in, info );
 	spheres.resize(numSpheres);
 	for (unsigned int i1 = 0; i1 < spheres.size(); i1++) {
-		NifStream( spheres[i1].center, in, version );
-		NifStream( spheres[i1].radius, in, version );
+		NifStream( spheres[i1].center, in, info );
+		NifStream( spheres[i1].radius, in, info );
 	};
 }
 
-void bhkMultiSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkMultiSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numSpheres = (unsigned int)(spheres.size());
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( numSpheres, out, version );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( numSpheres, out, info );
 	for (unsigned int i1 = 0; i1 < spheres.size(); i1++) {
-		NifStream( spheres[i1].center, out, version );
-		NifStream( spheres[i1].radius, out, version );
+		NifStream( spheres[i1].center, out, info );
+		NifStream( spheres[i1].radius, out, info );
 	};
 }
 
@@ -2907,8 +2907,8 @@ std::string bhkMultiSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkMultiSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkMultiSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkMultiSphereShape::InternalGetRefs() const {
@@ -2917,56 +2917,56 @@ std::list<NiObjectRef> bhkMultiSphereShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkSphereRepShape::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownInt1, in, version );
+	bhkSphereRepShape::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownInt1, in, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownInts1[i1], in, version );
+		NifStream( unknownInts1[i1], in, info );
 	};
-	NifStream( unknownInt2, in, version );
-	NifStream( scale, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( numStripsData, in, version );
+	NifStream( unknownInt2, in, info );
+	NifStream( scale, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( numStripsData, in, info );
 	stripsData.resize(numStripsData);
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numDataLayers, in, version );
+	NifStream( numDataLayers, in, info );
 	dataLayers.resize(numDataLayers);
 	for (unsigned int i1 = 0; i1 < dataLayers.size(); i1++) {
-		NifStream( dataLayers[i1].layer, in, version );
-		NifStream( dataLayers[i1].colFilter, in, version );
-		NifStream( dataLayers[i1].unknownShort, in, version );
+		NifStream( dataLayers[i1].layer, in, info );
+		NifStream( dataLayers[i1].colFilter, in, info );
+		NifStream( dataLayers[i1].unknownShort, in, info );
 	};
 }
 
-void bhkNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkSphereRepShape::Write( out, link_map, version, user_version );
+void bhkNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkSphereRepShape::Write( out, link_map, info );
 	numDataLayers = (unsigned int)(dataLayers.size());
 	numStripsData = (unsigned int)(stripsData.size());
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownInt1, out, version );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownInt1, out, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownInts1[i1], out, version );
+		NifStream( unknownInts1[i1], out, info );
 	};
-	NifStream( unknownInt2, out, version );
-	NifStream( scale, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( numStripsData, out, version );
+	NifStream( unknownInt2, out, info );
+	NifStream( scale, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( numStripsData, out, info );
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
 		if ( stripsData[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(stripsData[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(stripsData[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numDataLayers, out, version );
+	NifStream( numDataLayers, out, info );
 	for (unsigned int i1 = 0; i1 < dataLayers.size(); i1++) {
-		NifStream( dataLayers[i1].layer, out, version );
-		NifStream( dataLayers[i1].colFilter, out, version );
-		NifStream( dataLayers[i1].unknownShort, out, version );
+		NifStream( dataLayers[i1].layer, out, info );
+		NifStream( dataLayers[i1].colFilter, out, info );
+		NifStream( dataLayers[i1].unknownShort, out, info );
 	};
 }
 
@@ -3020,10 +3020,10 @@ std::string bhkNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkSphereRepShape::FixLinks( objects, link_stack, version, user_version );
+void bhkNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkSphereRepShape::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
-		stripsData[i1] = FixLink<NiTriStripsData>( objects, link_stack, version );
+		stripsData[i1] = FixLink<NiTriStripsData>( objects, link_stack, info );
 	};
 }
 
@@ -3037,51 +3037,51 @@ std::list<NiObjectRef> bhkNiTriStripsShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkPackedNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkPackedNiTriStripsShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numSubShapes, in, version );
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numSubShapes, in, info );
 	subShapes.resize(numSubShapes);
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( subShapes[i1].layer, in, version );
-		NifStream( subShapes[i1].colFilter, in, version );
-		NifStream( subShapes[i1].unknownShort, in, version );
-		NifStream( subShapes[i1].vertexCount___, in, version );
-		NifStream( subShapes[i1].material, in, version );
+		NifStream( subShapes[i1].layer, in, info );
+		NifStream( subShapes[i1].colFilter, in, info );
+		NifStream( subShapes[i1].unknownShort, in, info );
+		NifStream( subShapes[i1].vertexCount___, in, info );
+		NifStream( subShapes[i1].material, in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 9; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
-	NifStream( scale, in, version );
+	NifStream( scale, in, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], in, version );
+		NifStream( unknownFloats2[i1], in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void bhkPackedNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void bhkPackedNiTriStripsShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numSubShapes = (unsigned short)(subShapes.size());
-	NifStream( numSubShapes, out, version );
+	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
-		NifStream( subShapes[i1].layer, out, version );
-		NifStream( subShapes[i1].colFilter, out, version );
-		NifStream( subShapes[i1].unknownShort, out, version );
-		NifStream( subShapes[i1].vertexCount___, out, version );
-		NifStream( subShapes[i1].material, out, version );
+		NifStream( subShapes[i1].layer, out, info );
+		NifStream( subShapes[i1].colFilter, out, info );
+		NifStream( subShapes[i1].unknownShort, out, info );
+		NifStream( subShapes[i1].vertexCount___, out, info );
+		NifStream( subShapes[i1].material, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 9; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
-	NifStream( scale, out, version );
+	NifStream( scale, out, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], out, version );
+		NifStream( unknownFloats2[i1], out, info );
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
@@ -3131,9 +3131,9 @@ std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPackedNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<hkPackedNiTriStripsData>( objects, link_stack, version );
+void bhkPackedNiTriStripsShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
+	data = FixLink<hkPackedNiTriStripsData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkPackedNiTriStripsShape::InternalGetRefs() const {
@@ -3144,23 +3144,23 @@ std::list<NiObjectRef> bhkPackedNiTriStripsShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkPrismaticConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
+void bhkPrismaticConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknownVectors[i1], in, version );
+		NifStream( unknownVectors[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], in, version );
+		NifStream( unknownFloats2[i1], in, info );
 	};
 }
 
-void bhkPrismaticConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
+void bhkPrismaticConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 8; i1++) {
-		NifStream( unknownVectors[i1], out, version );
+		NifStream( unknownVectors[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats2[i1], out, version );
+		NifStream( unknownFloats2[i1], out, info );
 	};
 }
 
@@ -3195,8 +3195,8 @@ std::string bhkPrismaticConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkPrismaticConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkPrismaticConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkPrismaticConstraint::InternalGetRefs() const {
@@ -3205,12 +3205,12 @@ std::list<NiObjectRef> bhkPrismaticConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkRagdollConstraint::Read( in, link_stack, version, user_version );
+void bhkRagdollConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkRagdollConstraint::Read( in, link_stack, info );
 }
 
-void bhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkRagdollConstraint::Write( out, link_map, version, user_version );
+void bhkRagdollConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkRagdollConstraint::Write( out, link_map, info );
 }
 
 std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
@@ -3220,8 +3220,8 @@ std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkRagdollConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkRagdollConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkRagdollConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRagdollConstraint::InternalGetRefs() const {
@@ -3230,111 +3230,111 @@ std::list<NiObjectRef> bhkRagdollConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRigidBody::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void bhkRigidBody::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	bhkEntity::Read( in, link_stack, version, user_version );
+	bhkEntity::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
-		NifStream( unknown5Floats[i1], in, version );
+		NifStream( unknown5Floats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], in, version );
+		NifStream( unknown4Shorts[i1], in, info );
 	};
-	NifStream( layerCopy, in, version );
-	NifStream( colFilterCopy, in, version );
+	NifStream( layerCopy, in, info );
+	NifStream( colFilterCopy, in, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknown7Shorts[i1], in, version );
-	};
-	NifStream( translation, in, version );
-	NifStream( unknownFloat00, in, version );
-	NifStream( rotation.x, in, version );
-	NifStream( rotation.y, in, version );
-	NifStream( rotation.z, in, version );
-	NifStream( rotation.w, in, version );
-	NifStream( linearVelocity, in, version );
-	NifStream( unknownFloat01, in, version );
-	NifStream( angularVelocity, in, version );
-	NifStream( unknownFloat02, in, version );
+		NifStream( unknown7Shorts[i1], in, info );
+	};
+	NifStream( translation, in, info );
+	NifStream( unknownFloat00, in, info );
+	NifStream( rotation.x, in, info );
+	NifStream( rotation.y, in, info );
+	NifStream( rotation.z, in, info );
+	NifStream( rotation.w, in, info );
+	NifStream( linearVelocity, in, info );
+	NifStream( unknownFloat01, in, info );
+	NifStream( angularVelocity, in, info );
+	NifStream( unknownFloat02, in, info );
 	for (unsigned int i1 = 0; i1 < 12; i1++) {
-		NifStream( inertia[i1], in, version );
-	};
-	NifStream( center, in, version );
-	NifStream( unknownFloat03, in, version );
-	NifStream( mass, in, version );
-	NifStream( linearDamping, in, version );
-	NifStream( angularDamping, in, version );
-	NifStream( friction, in, version );
-	NifStream( restitution, in, version );
-	NifStream( maxLinearVelocity, in, version );
-	NifStream( maxAngularVelocity, in, version );
-	NifStream( penetrationDepth, in, version );
-	NifStream( motionSystem, in, version );
-	NifStream( unknownByte1, in, version );
-	NifStream( unknownByte2, in, version );
-	NifStream( qualityType, in, version );
-	NifStream( unknownInt6, in, version );
-	NifStream( unknownInt7, in, version );
-	NifStream( unknownInt8, in, version );
-	NifStream( numConstraints, in, version );
+		NifStream( inertia[i1], in, info );
+	};
+	NifStream( center, in, info );
+	NifStream( unknownFloat03, in, info );
+	NifStream( mass, in, info );
+	NifStream( linearDamping, in, info );
+	NifStream( angularDamping, in, info );
+	NifStream( friction, in, info );
+	NifStream( restitution, in, info );
+	NifStream( maxLinearVelocity, in, info );
+	NifStream( maxAngularVelocity, in, info );
+	NifStream( penetrationDepth, in, info );
+	NifStream( motionSystem, in, info );
+	NifStream( unknownByte1, in, info );
+	NifStream( unknownByte2, in, info );
+	NifStream( qualityType, in, info );
+	NifStream( unknownInt6, in, info );
+	NifStream( unknownInt7, in, info );
+	NifStream( unknownInt8, in, info );
+	NifStream( numConstraints, in, info );
 	constraints.resize(numConstraints);
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( unknownInt6, in, version );
+	NifStream( unknownInt6, in, info );
 }
 
-void bhkRigidBody::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
+void bhkRigidBody::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
 	numConstraints = (unsigned int)(constraints.size());
 	for (unsigned int i1 = 0; i1 < 5; i1++) {
-		NifStream( unknown5Floats[i1], out, version );
+		NifStream( unknown5Floats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], out, version );
+		NifStream( unknown4Shorts[i1], out, info );
 	};
-	NifStream( layerCopy, out, version );
-	NifStream( colFilterCopy, out, version );
+	NifStream( layerCopy, out, info );
+	NifStream( colFilterCopy, out, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unknown7Shorts[i1], out, version );
-	};
-	NifStream( translation, out, version );
-	NifStream( unknownFloat00, out, version );
-	NifStream( rotation.x, out, version );
-	NifStream( rotation.y, out, version );
-	NifStream( rotation.z, out, version );
-	NifStream( rotation.w, out, version );
-	NifStream( linearVelocity, out, version );
-	NifStream( unknownFloat01, out, version );
-	NifStream( angularVelocity, out, version );
-	NifStream( unknownFloat02, out, version );
+		NifStream( unknown7Shorts[i1], out, info );
+	};
+	NifStream( translation, out, info );
+	NifStream( unknownFloat00, out, info );
+	NifStream( rotation.x, out, info );
+	NifStream( rotation.y, out, info );
+	NifStream( rotation.z, out, info );
+	NifStream( rotation.w, out, info );
+	NifStream( linearVelocity, out, info );
+	NifStream( unknownFloat01, out, info );
+	NifStream( angularVelocity, out, info );
+	NifStream( unknownFloat02, out, info );
 	for (unsigned int i1 = 0; i1 < 12; i1++) {
-		NifStream( inertia[i1], out, version );
-	};
-	NifStream( center, out, version );
-	NifStream( unknownFloat03, out, version );
-	NifStream( mass, out, version );
-	NifStream( linearDamping, out, version );
-	NifStream( angularDamping, out, version );
-	NifStream( friction, out, version );
-	NifStream( restitution, out, version );
-	NifStream( maxLinearVelocity, out, version );
-	NifStream( maxAngularVelocity, out, version );
-	NifStream( penetrationDepth, out, version );
-	NifStream( motionSystem, out, version );
-	NifStream( unknownByte1, out, version );
-	NifStream( unknownByte2, out, version );
-	NifStream( qualityType, out, version );
-	NifStream( unknownInt6, out, version );
-	NifStream( unknownInt7, out, version );
-	NifStream( unknownInt8, out, version );
-	NifStream( numConstraints, out, version );
+		NifStream( inertia[i1], out, info );
+	};
+	NifStream( center, out, info );
+	NifStream( unknownFloat03, out, info );
+	NifStream( mass, out, info );
+	NifStream( linearDamping, out, info );
+	NifStream( angularDamping, out, info );
+	NifStream( friction, out, info );
+	NifStream( restitution, out, info );
+	NifStream( maxLinearVelocity, out, info );
+	NifStream( maxAngularVelocity, out, info );
+	NifStream( penetrationDepth, out, info );
+	NifStream( motionSystem, out, info );
+	NifStream( unknownByte1, out, info );
+	NifStream( unknownByte2, out, info );
+	NifStream( qualityType, out, info );
+	NifStream( unknownInt6, out, info );
+	NifStream( unknownInt7, out, info );
+	NifStream( unknownInt8, out, info );
+	NifStream( numConstraints, out, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
 		if ( constraints[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(constraints[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(constraints[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( unknownInt6, out, version );
+	NifStream( unknownInt6, out, info );
 }
 
 std::string bhkRigidBody::InternalAsString( bool verbose ) const {
@@ -3435,10 +3435,10 @@ std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBody::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkRigidBody::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
-		constraints[i1] = FixLink<AbhkConstraint>( objects, link_stack, version );
+		constraints[i1] = FixLink<AbhkConstraint>( objects, link_stack, info );
 	};
 }
 
@@ -3452,12 +3452,12 @@ std::list<NiObjectRef> bhkRigidBody::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkRigidBodyT::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRigidBody::Read( in, link_stack, version, user_version );
+void bhkRigidBodyT::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRigidBody::Read( in, link_stack, info );
 }
 
-void bhkRigidBodyT::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkRigidBody::Write( out, link_map, version, user_version );
+void bhkRigidBodyT::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkRigidBody::Write( out, link_map, info );
 }
 
 std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
@@ -3467,8 +3467,8 @@ std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkRigidBodyT::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkRigidBody::FixLinks( objects, link_stack, version, user_version );
+void bhkRigidBodyT::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkRigidBody::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkRigidBodyT::InternalGetRefs() const {
@@ -3477,30 +3477,30 @@ std::list<NiObjectRef> bhkRigidBodyT::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSimpleShapePhantom::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::Read( in, link_stack, version, user_version );
+void bhkSimpleShapePhantom::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unkownFloats[i1], in, version );
+		NifStream( unkownFloats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
 		for (unsigned int i2 = 0; i2 < 5; i2++) {
-			NifStream( unknownFloats2[i1][i2], in, version );
+			NifStream( unknownFloats2[i1][i2], in, info );
 		};
 	};
-	NifStream( unknownFloat, in, version );
+	NifStream( unknownFloat, in, info );
 }
 
-void bhkSimpleShapePhantom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
+void bhkSimpleShapePhantom::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 7; i1++) {
-		NifStream( unkownFloats[i1], out, version );
+		NifStream( unkownFloats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
 		for (unsigned int i2 = 0; i2 < 5; i2++) {
-			NifStream( unknownFloats2[i1][i2], out, version );
+			NifStream( unknownFloats2[i1][i2], out, info );
 		};
 	};
-	NifStream( unknownFloat, out, version );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
@@ -3537,8 +3537,8 @@ std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSimpleShapePhantom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkSimpleShapePhantom::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSimpleShapePhantom::InternalGetRefs() const {
@@ -3547,12 +3547,12 @@ std::list<NiObjectRef> bhkSimpleShapePhantom::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSPCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::Read( in, link_stack, version, user_version );
+void bhkSPCollisionObject::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::Read( in, link_stack, info );
 }
 
-void bhkSPCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiCollisionObject::Write( out, link_map, version, user_version );
+void bhkSPCollisionObject::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiCollisionObject::Write( out, link_map, info );
 }
 
 std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
@@ -3562,8 +3562,8 @@ std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSPCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiCollisionObject::FixLinks( objects, link_stack, version, user_version );
+void bhkSPCollisionObject::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiCollisionObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSPCollisionObject::InternalGetRefs() const {
@@ -3572,14 +3572,14 @@ std::list<NiObjectRef> bhkSPCollisionObject::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
+void bhkSphereShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::Read( in, link_stack, info );
+	NifStream( radius, in, info );
 }
 
-void bhkSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkConvexShape::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
+void bhkSphereShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkConvexShape::Write( out, link_map, info );
+	NifStream( radius, out, info );
 }
 
 std::string bhkSphereShape::InternalAsString( bool verbose ) const {
@@ -3590,8 +3590,8 @@ std::string bhkSphereShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkConvexShape::FixLinks( objects, link_stack, version, user_version );
+void bhkSphereShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkConvexShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkSphereShape::InternalGetRefs() const {
@@ -3600,18 +3600,18 @@ std::list<NiObjectRef> bhkSphereShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkStiffSpringConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::Read( in, link_stack, version, user_version );
-	NifStream( pivotA, in, version );
-	NifStream( pivotB, in, version );
-	NifStream( length, in, version );
+void bhkStiffSpringConstraint::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::Read( in, link_stack, info );
+	NifStream( pivotA, in, info );
+	NifStream( pivotB, in, info );
+	NifStream( length, in, info );
 }
 
-void bhkStiffSpringConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkConstraint::Write( out, link_map, version, user_version );
-	NifStream( pivotA, out, version );
-	NifStream( pivotB, out, version );
-	NifStream( length, out, version );
+void bhkStiffSpringConstraint::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkConstraint::Write( out, link_map, info );
+	NifStream( pivotA, out, info );
+	NifStream( pivotB, out, info );
+	NifStream( length, out, info );
 }
 
 std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
@@ -3624,8 +3624,8 @@ std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkStiffSpringConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkConstraint::FixLinks( objects, link_stack, version, user_version );
+void bhkStiffSpringConstraint::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkConstraint::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkStiffSpringConstraint::InternalGetRefs() const {
@@ -3634,20 +3634,20 @@ std::list<NiObjectRef> bhkStiffSpringConstraint::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( transform, in, version );
+void bhkTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( transform, in, info );
 }
 
-void bhkTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkEntity::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( transform, out, version );
+void bhkTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkEntity::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( transform, out, info );
 }
 
 std::string bhkTransformShape::InternalAsString( bool verbose ) const {
@@ -3661,8 +3661,8 @@ std::string bhkTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkEntity::FixLinks( objects, link_stack, version, user_version );
+void bhkTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkEntity::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkTransformShape::InternalGetRefs() const {
@@ -3671,12 +3671,12 @@ std::list<NiObjectRef> bhkTransformShape::InternalGetRefs() const {
 	return refs;
 }
 
-void bhkConvexTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkTransformShape::Read( in, link_stack, version, user_version );
+void bhkConvexTransformShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkTransformShape::Read( in, link_stack, info );
 }
 
-void bhkConvexTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	bhkTransformShape::Write( out, link_map, version, user_version );
+void bhkConvexTransformShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	bhkTransformShape::Write( out, link_map, info );
 }
 
 std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
@@ -3686,8 +3686,8 @@ std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void bhkConvexTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	bhkTransformShape::FixLinks( objects, link_stack, version, user_version );
+void bhkConvexTransformShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	bhkTransformShape::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> bhkConvexTransformShape::InternalGetRefs() const {
@@ -3696,16 +3696,16 @@ std::list<NiObjectRef> bhkConvexTransformShape::InternalGetRefs() const {
 	return refs;
 }
 
-void BSBound::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( center, in, version );
-	NifStream( dimensions, in, version );
+void BSBound::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( center, in, info );
+	NifStream( dimensions, in, info );
 }
 
-void BSBound::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( center, out, version );
-	NifStream( dimensions, out, version );
+void BSBound::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( center, out, info );
+	NifStream( dimensions, out, info );
 }
 
 std::string BSBound::InternalAsString( bool verbose ) const {
@@ -3717,8 +3717,8 @@ std::string BSBound::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSBound::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSBound::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSBound::InternalGetRefs() const {
@@ -3727,27 +3727,27 @@ std::list<NiObjectRef> BSBound::InternalGetRefs() const {
 	return refs;
 }
 
-void BSFurnitureMarker::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numPositions, in, version );
+void BSFurnitureMarker::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numPositions, in, info );
 	positions.resize(numPositions);
 	for (unsigned int i1 = 0; i1 < positions.size(); i1++) {
-		NifStream( positions[i1].offset, in, version );
-		NifStream( positions[i1].orientation, in, version );
-		NifStream( positions[i1].positionRef1, in, version );
-		NifStream( positions[i1].positionRef2, in, version );
+		NifStream( positions[i1].offset, in, info );
+		NifStream( positions[i1].orientation, in, info );
+		NifStream( positions[i1].positionRef1, in, info );
+		NifStream( positions[i1].positionRef2, in, info );
 	};
 }
 
-void BSFurnitureMarker::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void BSFurnitureMarker::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numPositions = (unsigned int)(positions.size());
-	NifStream( numPositions, out, version );
+	NifStream( numPositions, out, info );
 	for (unsigned int i1 = 0; i1 < positions.size(); i1++) {
-		NifStream( positions[i1].offset, out, version );
-		NifStream( positions[i1].orientation, out, version );
-		NifStream( positions[i1].positionRef1, out, version );
-		NifStream( positions[i1].positionRef2, out, version );
+		NifStream( positions[i1].offset, out, info );
+		NifStream( positions[i1].orientation, out, info );
+		NifStream( positions[i1].positionRef1, out, info );
+		NifStream( positions[i1].positionRef2, out, info );
 	};
 }
 
@@ -3771,8 +3771,8 @@ std::string BSFurnitureMarker::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSFurnitureMarker::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSFurnitureMarker::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSFurnitureMarker::InternalGetRefs() const {
@@ -3781,14 +3781,14 @@ std::list<NiObjectRef> BSFurnitureMarker::InternalGetRefs() const {
 	return refs;
 }
 
-void BSParentVelocityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat, in, version );
+void BSParentVelocityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat, in, info );
 }
 
-void BSParentVelocityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat, out, version );
+void BSParentVelocityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
@@ -3799,8 +3799,8 @@ std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSParentVelocityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void BSParentVelocityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSParentVelocityModifier::InternalGetRefs() const {
@@ -3809,12 +3809,12 @@ std::list<NiObjectRef> BSParentVelocityModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void BSPSysArrayEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
+void BSPSysArrayEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
 }
 
-void BSPSysArrayEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
+void BSPSysArrayEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
 }
 
 std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
@@ -3824,8 +3824,8 @@ std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSPSysArrayEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void BSPSysArrayEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSPSysArrayEmitter::InternalGetRefs() const {
@@ -3834,14 +3834,14 @@ std::list<NiObjectRef> BSPSysArrayEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void BSXFlags::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void BSXFlags::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void BSXFlags::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void BSXFlags::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string BSXFlags::InternalAsString( bool verbose ) const {
@@ -3852,8 +3852,8 @@ std::string BSXFlags::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSXFlags::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void BSXFlags::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSXFlags::InternalGetRefs() const {
@@ -3862,35 +3862,35 @@ std::list<NiObjectRef> BSXFlags::InternalGetRefs() const {
 	return refs;
 }
 
-void hkPackedNiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::Read( in, link_stack, version, user_version );
-	NifStream( numTriangles, in, version );
+void hkPackedNiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::Read( in, link_stack, info );
+	NifStream( numTriangles, in, info );
 	triangles.resize(numTriangles);
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
-		NifStream( triangles[i1].triangle, in, version );
-		NifStream( triangles[i1].unknownShort, in, version );
-		NifStream( triangles[i1].normal, in, version );
+		NifStream( triangles[i1].triangle, in, info );
+		NifStream( triangles[i1].unknownShort, in, info );
+		NifStream( triangles[i1].normal, in, info );
 	};
-	NifStream( numVertices, in, version );
+	NifStream( numVertices, in, info );
 	vertices.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], in, version );
+		NifStream( vertices[i1], in, info );
 	};
 }
 
-void hkPackedNiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AbhkShapeCollection::Write( out, link_map, version, user_version );
+void hkPackedNiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AbhkShapeCollection::Write( out, link_map, info );
 	numVertices = (unsigned int)(vertices.size());
 	numTriangles = (unsigned int)(triangles.size());
-	NifStream( numTriangles, out, version );
+	NifStream( numTriangles, out, info );
 	for (unsigned int i1 = 0; i1 < triangles.size(); i1++) {
-		NifStream( triangles[i1].triangle, out, version );
-		NifStream( triangles[i1].unknownShort, out, version );
-		NifStream( triangles[i1].normal, out, version );
+		NifStream( triangles[i1].triangle, out, info );
+		NifStream( triangles[i1].unknownShort, out, info );
+		NifStream( triangles[i1].normal, out, info );
 	};
-	NifStream( numVertices, out, version );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < vertices.size(); i1++) {
-		NifStream( vertices[i1], out, version );
+		NifStream( vertices[i1], out, info );
 	};
 }
 
@@ -3927,8 +3927,8 @@ std::string hkPackedNiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void hkPackedNiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AbhkShapeCollection::FixLinks( objects, link_stack, version, user_version );
+void hkPackedNiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AbhkShapeCollection::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> hkPackedNiTriStripsData::InternalGetRefs() const {
@@ -3937,22 +3937,22 @@ std::list<NiObjectRef> hkPackedNiTriStripsData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAlphaController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiAlphaController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiAlphaController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiAlphaController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -3964,10 +3964,10 @@ std::string NiAlphaController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiAlphaController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -3979,16 +3979,16 @@ std::list<NiObjectRef> NiAlphaController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAlphaProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( threshold, in, version );
+void NiAlphaProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( threshold, in, info );
 }
 
-void NiAlphaProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( threshold, out, version );
+void NiAlphaProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( threshold, out, info );
 }
 
 std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
@@ -4000,8 +4000,8 @@ std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAlphaProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiAlphaProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAlphaProperty::InternalGetRefs() const {
@@ -4010,12 +4010,12 @@ std::list<NiObjectRef> NiAlphaProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAmbientLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
+void NiAmbientLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
 }
 
-void NiAmbientLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
+void NiAmbientLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
 }
 
 std::string NiAmbientLight::InternalAsString( bool verbose ) const {
@@ -4025,8 +4025,8 @@ std::string NiAmbientLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAmbientLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiAmbientLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAmbientLight::InternalGetRefs() const {
@@ -4035,47 +4035,47 @@ std::list<NiObjectRef> NiAmbientLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAutoNormalParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04000002 ) {
-		NifStream( numParticles, in, version );
+void NiAutoNormalParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::Read( in, link_stack, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numParticles, in, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( size, in, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( size, in, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numActive, in, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numActive, in, info );
 	};
-	if ( ( version >= 0x0401000C ) && ( version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, in, version );
+	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
+		NifStream( unknownShort, in, info );
 	};
-	NifStream( hasSizes, in, version );
+	NifStream( hasSizes, in, info );
 	if ( (hasSizes != 0) ) {
 		sizes.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], in, version );
+			NifStream( sizes[i2], in, info );
 		};
 	};
 }
 
-void NiAutoNormalParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometryData::Write( out, link_map, version, user_version );
-	if ( version <= 0x04000002 ) {
-		NifStream( numParticles, out, version );
+void NiAutoNormalParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometryData::Write( out, link_map, info );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numParticles, out, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( size, out, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( size, out, info );
 	};
-	if ( version <= 0x04000002 ) {
-		NifStream( numActive, out, version );
+	if ( info.version <= 0x04000002 ) {
+		NifStream( numActive, out, info );
 	};
-	if ( ( version >= 0x0401000C ) && ( version <= 0x0A000100 ) ) {
-		NifStream( unknownShort, out, version );
+	if ( ( info.version >= 0x0401000C ) && ( info.version <= 0x0A000100 ) ) {
+		NifStream( unknownShort, out, info );
 	};
-	NifStream( hasSizes, out, version );
+	NifStream( hasSizes, out, info );
 	if ( (hasSizes != 0) ) {
 		for (unsigned int i2 = 0; i2 < sizes.size(); i2++) {
-			NifStream( sizes[i2], out, version );
+			NifStream( sizes[i2], out, info );
 		};
 	};
 }
@@ -4106,8 +4106,8 @@ std::string NiAutoNormalParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometryData::FixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometryData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAutoNormalParticlesData::InternalGetRefs() const {
@@ -4116,21 +4116,21 @@ std::list<NiObjectRef> NiAutoNormalParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBinaryExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( binaryData.dataSize, in, version );
+void NiBinaryExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( binaryData.dataSize, in, info );
 	binaryData.data.resize(binaryData.dataSize);
 	for (unsigned int i1 = 0; i1 < binaryData.data.size(); i1++) {
-		NifStream( binaryData.data[i1], in, version );
+		NifStream( binaryData.data[i1], in, info );
 	};
 }
 
-void NiBinaryExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiBinaryExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	binaryData.dataSize = (unsigned int)(binaryData.data.size());
-	NifStream( binaryData.dataSize, out, version );
+	NifStream( binaryData.dataSize, out, info );
 	for (unsigned int i1 = 0; i1 < binaryData.data.size(); i1++) {
-		NifStream( binaryData.data[i1], out, version );
+		NifStream( binaryData.data[i1], out, info );
 	};
 }
 
@@ -4155,8 +4155,8 @@ std::string NiBinaryExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBinaryExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiBinaryExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBinaryExtraData::InternalGetRefs() const {
@@ -4165,14 +4165,14 @@ std::list<NiObjectRef> NiBinaryExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
+void NiBlendBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
 }
 
-void NiBlendBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBlendBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 }
 
 std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
@@ -4183,8 +4183,8 @@ std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendBoolInterpolator::InternalGetRefs() const {
@@ -4193,14 +4193,14 @@ std::list<NiObjectRef> NiBlendBoolInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( floatValue, in, version );
+void NiBlendFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( floatValue, in, info );
 }
 
-void NiBlendFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( floatValue, out, version );
+void NiBlendFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( floatValue, out, info );
 }
 
 std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
@@ -4211,8 +4211,8 @@ std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendFloatInterpolator::InternalGetRefs() const {
@@ -4221,14 +4221,14 @@ std::list<NiObjectRef> NiBlendFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( pointValue, in, version );
+void NiBlendPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( pointValue, in, info );
 }
 
-void NiBlendPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( pointValue, out, version );
+void NiBlendPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( pointValue, out, info );
 }
 
 std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
@@ -4239,8 +4239,8 @@ std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBlendPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendPoint3Interpolator::InternalGetRefs() const {
@@ -4249,12 +4249,12 @@ std::list<NiObjectRef> NiBlendPoint3Interpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBlendTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
+void NiBlendTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::Read( in, link_stack, info );
 }
 
-void NiBlendTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
+void NiBlendTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
 }
 
 std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -4264,8 +4264,8 @@ std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiBlendTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBlendTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBlendTransformInterpolator::InternalGetRefs() const {
@@ -4274,54 +4274,54 @@ std::list<NiObjectRef> NiBlendTransformInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	ABoneLODController::Read( in, link_stack, version, user_version );
-	NifStream( numShapeGroups, in, version );
+	ABoneLODController::Read( in, link_stack, info );
+	NifStream( numShapeGroups, in, info );
 	shapeGroups1.resize(numShapeGroups);
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
-		NifStream( shapeGroups1[i1].numLinkPairs, in, version );
+		NifStream( shapeGroups1[i1].numLinkPairs, in, info );
 		shapeGroups1[i1].linkPairs.resize(shapeGroups1[i1].numLinkPairs);
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	NifStream( numShapeGroups2, in, version );
+	NifStream( numShapeGroups2, in, info );
 	shapeGroups2.resize(numShapeGroups2);
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	ABoneLODController::Write( out, link_map, version, user_version );
+void NiBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	ABoneLODController::Write( out, link_map, info );
 	numShapeGroups2 = (unsigned int)(shapeGroups2.size());
 	numShapeGroups = (unsigned int)(shapeGroups1.size());
-	NifStream( numShapeGroups, out, version );
+	NifStream( numShapeGroups, out, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
 		shapeGroups1[i1].numLinkPairs = (unsigned int)(shapeGroups1[i1].linkPairs.size());
-		NifStream( shapeGroups1[i1].numLinkPairs, out, version );
+		NifStream( shapeGroups1[i1].numLinkPairs, out, info );
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
 			if ( shapeGroups1[i1].linkPairs[i2].shape != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].shape) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].shape) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 			if ( shapeGroups1[i1].linkPairs[i2].skinInstance != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].skinInstance) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i1].linkPairs[i2].skinInstance) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	NifStream( numShapeGroups2, out, version );
+	NifStream( numShapeGroups2, out, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
 		if ( shapeGroups2[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(shapeGroups2[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(shapeGroups2[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -4366,16 +4366,16 @@ std::string NiBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
+void NiBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < shapeGroups1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
-			shapeGroups1[i1].linkPairs[i2].shape = FixLink<NiTriShape>( objects, link_stack, version );
-			shapeGroups1[i1].linkPairs[i2].skinInstance = FixLink<NiSkinInstance>( objects, link_stack, version );
+			shapeGroups1[i1].linkPairs[i2].shape = FixLink<NiTriShape>( objects, link_stack, info );
+			shapeGroups1[i1].linkPairs[i2].skinInstance = FixLink<NiSkinInstance>( objects, link_stack, info );
 		};
 	};
 	for (unsigned int i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		shapeGroups2[i1] = FixLink<NiTriShape>( objects, link_stack, version );
+		shapeGroups2[i1] = FixLink<NiTriShape>( objects, link_stack, info );
 	};
 }
 
@@ -4397,27 +4397,27 @@ std::list<NiObjectRef> NiBoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiBoolData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiBoolData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiBoolData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -4445,8 +4445,8 @@ std::string NiBoolData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiBoolData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolData::InternalGetRefs() const {
@@ -4455,14 +4455,14 @@ std::list<NiObjectRef> NiBoolData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBooleanExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( booleanData, in, version );
+void NiBooleanExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( booleanData, in, info );
 }
 
-void NiBooleanExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( booleanData, out, version );
+void NiBooleanExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( booleanData, out, info );
 }
 
 std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
@@ -4473,8 +4473,8 @@ std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBooleanExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiBooleanExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBooleanExtraData::InternalGetRefs() const {
@@ -4483,21 +4483,21 @@ std::list<NiObjectRef> NiBooleanExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBoolInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
@@ -4509,9 +4509,9 @@ std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiBoolData>( objects, link_stack, version );
+void NiBoolInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiBoolData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolInterpolator::InternalGetRefs() const {
@@ -4522,21 +4522,21 @@ std::list<NiObjectRef> NiBoolInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBoolTimelineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiBoolTimelineInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( boolValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( boolValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiBoolTimelineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( boolValue, out, version );
+void NiBoolTimelineInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( boolValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
@@ -4548,9 +4548,9 @@ std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBoolTimelineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiBoolData>( objects, link_stack, version );
+void NiBoolTimelineInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiBoolData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBoolTimelineInterpolator::InternalGetRefs() const {
@@ -4561,12 +4561,12 @@ std::list<NiObjectRef> NiBoolTimelineInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::Read( in, link_stack, version, user_version );
+void NiBSBoneLODController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::Read( in, link_stack, info );
 }
 
-void NiBSBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	ABoneLODController::Write( out, link_map, version, user_version );
+void NiBSBoneLODController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	ABoneLODController::Write( out, link_map, info );
 }
 
 std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
@@ -4576,8 +4576,8 @@ std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	ABoneLODController::FixLinks( objects, link_stack, version, user_version );
+void NiBSBoneLODController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	ABoneLODController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSBoneLODController::InternalGetRefs() const {
@@ -4586,14 +4586,14 @@ std::list<NiObjectRef> NiBSBoneLODController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineBasisData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numControlPt, in, version );
+void NiBSplineBasisData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numControlPt, in, info );
 }
 
-void NiBSplineBasisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( numControlPt, out, version );
+void NiBSplineBasisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( numControlPt, out, info );
 }
 
 std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
@@ -4604,8 +4604,8 @@ std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineBasisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineBasisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineBasisData::InternalGetRefs() const {
@@ -4614,17 +4614,17 @@ std::list<NiObjectRef> NiBSplineBasisData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineCompFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 }
 
-void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 }
 
@@ -4647,8 +4647,8 @@ std::string NiBSplineCompFloatInterpolator::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiBSplineCompFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompFloatInterpolator::InternalGetRefs() const {
@@ -4657,17 +4657,17 @@ std::list<NiObjectRef> NiBSplineCompFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 }
 
-void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 6; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 }
 
@@ -4690,8 +4690,8 @@ std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiBSplineCompPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompPoint3Interpolator::InternalGetRefs() const {
@@ -4700,36 +4700,36 @@ std::list<NiObjectRef> NiBSplineCompPoint3Interpolator::InternalGetRefs() const
 	return refs;
 }
 
-void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	NifStream( translateOffset, in, version );
-	NifStream( rotateOffset, in, version );
-	NifStream( scaleOffset, in, version );
-	NifStream( translateBias, in, version );
-	NifStream( translateMultiplier, in, version );
-	NifStream( rotationBias, in, version );
-	NifStream( rotationMultiplier, in, version );
-	NifStream( scaleBias, in, version );
-	NifStream( scaleMultiplier, in, version );
-}
-
-void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBSplineInterpolator::Write( out, link_map, version, user_version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	NifStream( translateOffset, out, version );
-	NifStream( rotateOffset, out, version );
-	NifStream( scaleOffset, out, version );
-	NifStream( translateBias, out, version );
-	NifStream( translateMultiplier, out, version );
-	NifStream( rotationBias, out, version );
-	NifStream( rotationMultiplier, out, version );
-	NifStream( scaleBias, out, version );
-	NifStream( scaleMultiplier, out, version );
+void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::Read( in, link_stack, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	NifStream( translateOffset, in, info );
+	NifStream( rotateOffset, in, info );
+	NifStream( scaleOffset, in, info );
+	NifStream( translateBias, in, info );
+	NifStream( translateMultiplier, in, info );
+	NifStream( rotationBias, in, info );
+	NifStream( rotationMultiplier, in, info );
+	NifStream( scaleBias, in, info );
+	NifStream( scaleMultiplier, in, info );
+}
+
+void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBSplineInterpolator::Write( out, link_map, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	NifStream( translateOffset, out, info );
+	NifStream( rotateOffset, out, info );
+	NifStream( scaleOffset, out, info );
+	NifStream( translateBias, out, info );
+	NifStream( translateMultiplier, out, info );
+	NifStream( rotationBias, out, info );
+	NifStream( rotationMultiplier, out, info );
+	NifStream( scaleBias, out, info );
+	NifStream( scaleMultiplier, out, info );
 }
 
 std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -4751,8 +4751,8 @@ std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose )
 	return out.str();
 }
 
-void NiBSplineCompTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBSplineInterpolator::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineCompTransformInterpolator::InternalGetRefs() const {
@@ -4761,23 +4761,23 @@ std::list<NiObjectRef> NiBSplineCompTransformInterpolator::InternalGetRefs() con
 	return refs;
 }
 
-void NiBSplineData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
-	NifStream( count, in, version );
+void NiBSplineData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
+	NifStream( count, in, info );
 	controlPoints.resize(count);
 	for (unsigned int i1 = 0; i1 < controlPoints.size(); i1++) {
-		NifStream( controlPoints[i1], in, version );
+		NifStream( controlPoints[i1], in, info );
 	};
 }
 
-void NiBSplineData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiBSplineData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	count = (unsigned int)(controlPoints.size());
-	NifStream( unknownInt, out, version );
-	NifStream( count, out, version );
+	NifStream( unknownInt, out, info );
+	NifStream( count, out, info );
 	for (unsigned int i1 = 0; i1 < controlPoints.size(); i1++) {
-		NifStream( controlPoints[i1], out, version );
+		NifStream( controlPoints[i1], out, info );
 	};
 }
 
@@ -4803,8 +4803,8 @@ std::string NiBSplineData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSplineData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiBSplineData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSplineData::InternalGetRefs() const {
@@ -4813,60 +4813,60 @@ std::list<NiObjectRef> NiBSplineData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCamera::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCamera::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, in, version );
-	};
-	NifStream( frustumLeft, in, version );
-	NifStream( frustumRight, in, version );
-	NifStream( frustumTop, in, version );
-	NifStream( frustumBottom, in, version );
-	NifStream( frustumNear, in, version );
-	NifStream( frustumFar, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( useOrthographicProjection, in, version );
-	};
-	NifStream( viewportLeft, in, version );
-	NifStream( viewportRight, in, version );
-	NifStream( viewportTop, in, version );
-	NifStream( viewportBottom, in, version );
-	NifStream( lodAdjust, in, version );
-	NifStream( block_num, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, in, info );
+	};
+	NifStream( frustumLeft, in, info );
+	NifStream( frustumRight, in, info );
+	NifStream( frustumTop, in, info );
+	NifStream( frustumBottom, in, info );
+	NifStream( frustumNear, in, info );
+	NifStream( frustumFar, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( useOrthographicProjection, in, info );
+	};
+	NifStream( viewportLeft, in, info );
+	NifStream( viewportRight, in, info );
+	NifStream( viewportTop, in, info );
+	NifStream( viewportBottom, in, info );
+	NifStream( lodAdjust, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt, in, version );
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownInt2, in, version );
-	};
-}
-
-void NiCamera::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, out, version );
-	};
-	NifStream( frustumLeft, out, version );
-	NifStream( frustumRight, out, version );
-	NifStream( frustumTop, out, version );
-	NifStream( frustumBottom, out, version );
-	NifStream( frustumNear, out, version );
-	NifStream( frustumFar, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( useOrthographicProjection, out, version );
-	};
-	NifStream( viewportLeft, out, version );
-	NifStream( viewportRight, out, version );
-	NifStream( viewportTop, out, version );
-	NifStream( viewportBottom, out, version );
-	NifStream( lodAdjust, out, version );
+	NifStream( unknownInt, in, info );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownInt2, in, info );
+	};
+}
+
+void NiCamera::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, out, info );
+	};
+	NifStream( frustumLeft, out, info );
+	NifStream( frustumRight, out, info );
+	NifStream( frustumTop, out, info );
+	NifStream( frustumBottom, out, info );
+	NifStream( frustumNear, out, info );
+	NifStream( frustumFar, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( useOrthographicProjection, out, info );
+	};
+	NifStream( viewportLeft, out, info );
+	NifStream( viewportRight, out, info );
+	NifStream( viewportTop, out, info );
+	NifStream( viewportBottom, out, info );
+	NifStream( lodAdjust, out, info );
 	if ( unknownLink_ != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt, out, version );
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownInt2, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt, out, info );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownInt2, out, info );
 	};
 }
 
@@ -4893,9 +4893,9 @@ std::string NiCamera::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCamera::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
-	unknownLink_ = FixLink<NiObject>( objects, link_stack, version );
+void NiCamera::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCamera::InternalGetRefs() const {
@@ -4906,57 +4906,57 @@ std::list<NiObjectRef> NiCamera::InternalGetRefs() const {
 	return refs;
 }
 
-void NiCollisionData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiCollisionData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownInt1, in, version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownInt2, in, version );
+	NifStream( unknownInt1, in, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownInt2, in, info );
 	};
-	NifStream( unknownByte, in, version );
-	NifStream( collisionType, in, version );
+	NifStream( unknownByte, in, info );
+	NifStream( collisionType, in, info );
 	if ( (collisionType == 0) ) {
-		NifStream( unknownInt2, in, version );
-		NifStream( unknownVector, in, version );
+		NifStream( unknownInt2, in, info );
+		NifStream( unknownVector, in, info );
 	};
 	if ( (collisionType == 2) ) {
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknownFloat1[i2], in, version );
+			NifStream( unknownFloat1[i2], in, info );
 		};
 	};
 	if ( (collisionType == 1) ) {
 		for (unsigned int i2 = 0; i2 < 15; i2++) {
-			NifStream( unknownFloat2[i2], in, version );
+			NifStream( unknownFloat2[i2], in, info );
 		};
 	};
 }
 
-void NiCollisionData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiCollisionData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	if ( targetNode != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(targetNode) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(targetNode) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownInt1, out, version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownInt2, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownInt1, out, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownInt2, out, info );
 	};
-	NifStream( unknownByte, out, version );
-	NifStream( collisionType, out, version );
+	NifStream( unknownByte, out, info );
+	NifStream( collisionType, out, info );
 	if ( (collisionType == 0) ) {
-		NifStream( unknownInt2, out, version );
-		NifStream( unknownVector, out, version );
+		NifStream( unknownInt2, out, info );
+		NifStream( unknownVector, out, info );
 	};
 	if ( (collisionType == 2) ) {
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknownFloat1[i2], out, version );
+			NifStream( unknownFloat1[i2], out, info );
 		};
 	};
 	if ( (collisionType == 1) ) {
 		for (unsigned int i2 = 0; i2 < 15; i2++) {
-			NifStream( unknownFloat2[i2], out, version );
+			NifStream( unknownFloat2[i2], out, info );
 		};
 	};
 }
@@ -5004,9 +5004,9 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiCollisionData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	targetNode = FixLink<NiNode>( objects, link_stack, version );
+void NiCollisionData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	targetNode = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiCollisionData::InternalGetRefs() const {
@@ -5015,27 +5015,27 @@ std::list<NiObjectRef> NiCollisionData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiColorData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiColorData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiColorData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiColorData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -5063,8 +5063,8 @@ std::string NiColorData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiColorData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiColorData::InternalGetRefs() const {
@@ -5073,14 +5073,14 @@ std::list<NiObjectRef> NiColorData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiColorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( data, in, version );
+void NiColorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( data, in, info );
 }
 
-void NiColorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( data, out, version );
+void NiColorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( data, out, info );
 }
 
 std::string NiColorExtraData::InternalAsString( bool verbose ) const {
@@ -5091,8 +5091,8 @@ std::string NiColorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiColorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiColorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiColorExtraData::InternalGetRefs() const {
@@ -5101,35 +5101,35 @@ std::list<NiObjectRef> NiColorExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiControllerManager::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerManager::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( cumulative, in, version );
-	NifStream( numControllerSequences, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( cumulative, in, info );
+	NifStream( numControllerSequences, in, info );
 	controllerSequences.resize(numControllerSequences);
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiControllerManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiControllerManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numControllerSequences = (unsigned int)(controllerSequences.size());
-	NifStream( cumulative, out, version );
-	NifStream( numControllerSequences, out, version );
+	NifStream( cumulative, out, info );
+	NifStream( numControllerSequences, out, info );
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
 		if ( controllerSequences[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(controllerSequences[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(controllerSequences[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 	if ( objectPalette != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(objectPalette) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(objectPalette) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiControllerManager::InternalAsString( bool verbose ) const {
@@ -5155,12 +5155,12 @@ std::string NiControllerManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiControllerManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
-		controllerSequences[i1] = FixLink<NiControllerSequence>( objects, link_stack, version );
+		controllerSequences[i1] = FixLink<NiControllerSequence>( objects, link_stack, info );
 	};
-	objectPalette = FixLink<NiDefaultAVObjectPalette>( objects, link_stack, version );
+	objectPalette = FixLink<NiDefaultAVObjectPalette>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiControllerManager::InternalGetRefs() const {
@@ -5175,226 +5175,226 @@ std::list<NiObjectRef> NiControllerManager::InternalGetRefs() const {
 	return refs;
 }
 
-void NiControllerSequence::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiControllerSequence::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( name, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( textKeysName, in, version );
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( name, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( textKeysName, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numControlledBlocks, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownInt1, in, version );
+	NifStream( numControlledBlocks, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownInt1, in, info );
 	};
 	controlledBlocks.resize(numControlledBlocks);
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			NifStream( controlledBlocks[i1].targetName, in, version );
-			NifStream( block_num, in, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( controlledBlocks[i1].targetName, in, info );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( version >= 0x0A01006A ) {
-			NifStream( block_num, in, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( block_num, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
-			NifStream( controlledBlocks[i1].unknownShort0, in, version );
+			NifStream( controlledBlocks[i1].unknownShort0, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority_, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
+			NifStream( controlledBlocks[i1].priority_, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 11 ) ) {
-			NifStream( controlledBlocks[i1].priority_, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+			NifStream( controlledBlocks[i1].priority_, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( block_num, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].nodeName, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].nodeName, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].nodeNameOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].nodeNameOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].propertyType, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].propertyType, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].propertyTypeOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].propertyTypeOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].controllerType, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].controllerType, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].controllerTypeOffset, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].controllerTypeOffset, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable1, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable1, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset1, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset1, in, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable2, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable2, in, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset2, in, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset2, in, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( weight, in, version );
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( weight, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( cycleType, in, version );
+		NifStream( cycleType, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownInt0, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownInt0, in, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( frequency, in, version );
-		NifStream( startTime, in, version );
-		NifStream( stopTime, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( frequency, in, info );
+		NifStream( startTime, in, info );
+		NifStream( stopTime, in, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownFloat2, in, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownFloat2, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownByte, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownByte, in, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( targetName, in, version );
+		NifStream( targetName, in, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiControllerSequence::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiControllerSequence::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numControlledBlocks = (unsigned int)(controlledBlocks.size());
-	NifStream( name, out, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( textKeysName, out, version );
+	NifStream( name, out, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( textKeysName, out, info );
 		if ( textKeys != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numControlledBlocks, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownInt1, out, version );
+	NifStream( numControlledBlocks, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownInt1, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			NifStream( controlledBlocks[i1].targetName, out, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( controlledBlocks[i1].targetName, out, info );
 			if ( controlledBlocks[i1].controller != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( version >= 0x0A01006A ) {
+		if ( info.version >= 0x0A01006A ) {
 			if ( controlledBlocks[i1].interpolator != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].interpolator) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].interpolator) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 			if ( controlledBlocks[i1].controller != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 			if ( controlledBlocks[i1].unknownLink2 != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].unknownLink2) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].unknownLink2) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
-			NifStream( controlledBlocks[i1].unknownShort0, out, version );
+				NifStream( 0xffffffff, out, info );
+			NifStream( controlledBlocks[i1].unknownShort0, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 10 ) ) {
-			NifStream( controlledBlocks[i1].priority_, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 10 ) ) {
+			NifStream( controlledBlocks[i1].priority_, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( user_version == 11 ) ) {
-			NifStream( controlledBlocks[i1].priority_, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.userVersion == 11 ) ) {
+			NifStream( controlledBlocks[i1].priority_, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
+		if ( info.version >= 0x0A020000 ) {
 			if ( controlledBlocks[i1].stringPalette != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].stringPalette) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].stringPalette) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].nodeName, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].nodeName, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].nodeNameOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].nodeNameOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].propertyType, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].propertyType, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].propertyTypeOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].propertyTypeOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].controllerType, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].controllerType, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].controllerTypeOffset, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].controllerTypeOffset, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable1, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable1, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset1, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset1, out, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( controlledBlocks[i1].variable2, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( controlledBlocks[i1].variable2, out, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			NifStream( controlledBlocks[i1].variableOffset2, out, version );
+		if ( info.version >= 0x0A020000 ) {
+			NifStream( controlledBlocks[i1].variableOffset2, out, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( weight, out, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( weight, out, info );
 		if ( textKeys != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( cycleType, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( cycleType, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownInt0, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownInt0, out, info );
 	};
-	if ( version >= 0x0A01006A ) {
-		NifStream( frequency, out, version );
-		NifStream( startTime, out, version );
-		NifStream( stopTime, out, version );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( frequency, out, info );
+		NifStream( startTime, out, info );
+		NifStream( stopTime, out, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownFloat2, out, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownFloat2, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknownByte, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknownByte, out, info );
 	};
-	if ( version >= 0x0A01006A ) {
+	if ( info.version >= 0x0A01006A ) {
 		if ( manager != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(manager) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(manager) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( targetName, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( targetName, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( stringPalette != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(stringPalette) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(stringPalette) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5446,32 +5446,32 @@ std::string NiControllerSequence::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiControllerSequence::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
+void NiControllerSequence::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, info );
 	};
 	for (unsigned int i1 = 0; i1 < controlledBlocks.size(); i1++) {
-		if ( version <= 0x0A010000 ) {
-			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
+		if ( info.version <= 0x0A010000 ) {
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, info );
 		};
-		if ( version >= 0x0A01006A ) {
-			controlledBlocks[i1].interpolator = FixLink<NiInterpolator>( objects, link_stack, version );
-			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, version );
+		if ( info.version >= 0x0A01006A ) {
+			controlledBlocks[i1].interpolator = FixLink<NiInterpolator>( objects, link_stack, info );
+			controlledBlocks[i1].controller = FixLink<NiTimeController>( objects, link_stack, info );
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			controlledBlocks[i1].unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			controlledBlocks[i1].unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 		};
-		if ( version >= 0x0A020000 ) {
-			controlledBlocks[i1].stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
+		if ( info.version >= 0x0A020000 ) {
+			controlledBlocks[i1].stringPalette = FixLink<NiStringPalette>( objects, link_stack, info );
 		};
 	};
-	if ( version >= 0x0A01006A ) {
-		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, version );
-		manager = FixLink<NiControllerManager>( objects, link_stack, version );
+	if ( info.version >= 0x0A01006A ) {
+		textKeys = FixLink<NiTextKeyExtraData>( objects, link_stack, info );
+		manager = FixLink<NiControllerManager>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		stringPalette = FixLink<NiStringPalette>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		stringPalette = FixLink<NiStringPalette>( objects, link_stack, info );
 	};
 }
 
@@ -5495,30 +5495,30 @@ std::list<NiObjectRef> NiControllerSequence::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDefaultAVObjectPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiDefaultAVObjectPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt, in, version );
-	NifStream( numObjs, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownInt, in, info );
+	NifStream( numObjs, in, info );
 	objs.resize(numObjs);
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		NifStream( objs[i1].name, in, version );
-		NifStream( block_num, in, version );
+		NifStream( objs[i1].name, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiDefaultAVObjectPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiDefaultAVObjectPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numObjs = (unsigned int)(objs.size());
-	NifStream( unknownInt, out, version );
-	NifStream( numObjs, out, version );
+	NifStream( unknownInt, out, info );
+	NifStream( numObjs, out, info );
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		NifStream( objs[i1].name, out, version );
+		NifStream( objs[i1].name, out, info );
 		if ( objs[i1].avObject != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(objs[i1].avObject) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(objs[i1].avObject) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5541,10 +5541,10 @@ std::string NiDefaultAVObjectPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDefaultAVObjectPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
-		objs[i1].avObject = FixLink<NiAVObject>( objects, link_stack, version );
+		objs[i1].avObject = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 }
 
@@ -5556,12 +5556,12 @@ std::list<NiObjectRef> NiDefaultAVObjectPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDirectionalLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
+void NiDirectionalLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
 }
 
-void NiDirectionalLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
+void NiDirectionalLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
 }
 
 std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
@@ -5571,8 +5571,8 @@ std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDirectionalLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiDirectionalLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiDirectionalLight::InternalGetRefs() const {
@@ -5581,14 +5581,14 @@ std::list<NiObjectRef> NiDirectionalLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiDitherProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiDitherProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiDitherProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiDitherProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiDitherProperty::InternalAsString( bool verbose ) const {
@@ -5599,8 +5599,8 @@ std::string NiDitherProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiDitherProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiDitherProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiDitherProperty::InternalGetRefs() const {
@@ -5609,36 +5609,36 @@ std::list<NiObjectRef> NiDitherProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFlipController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFlipController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( textureSlot, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt2, in, version );
-		NifStream( delta, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( textureSlot, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt2, in, info );
+		NifStream( delta, in, info );
 	};
-	NifStream( numSources, in, version );
+	NifStream( numSources, in, info );
 	sources.resize(numSources);
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiFlipController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
+void NiFlipController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
 	numSources = (unsigned int)(sources.size());
-	NifStream( textureSlot, out, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt2, out, version );
-		NifStream( delta, out, version );
+	NifStream( textureSlot, out, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt2, out, info );
+		NifStream( delta, out, info );
 	};
-	NifStream( numSources, out, version );
+	NifStream( numSources, out, info );
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
 		if ( sources[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(sources[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(sources[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -5666,10 +5666,10 @@ std::string NiFlipController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFlipController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void NiFlipController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < sources.size(); i1++) {
-		sources[i1] = FixLink<NiSourceTexture>( objects, link_stack, version );
+		sources[i1] = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 }
 
@@ -5683,27 +5683,27 @@ std::list<NiObjectRef> NiFlipController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiFloatData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiFloatData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiFloatData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -5731,8 +5731,8 @@ std::string NiFloatData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatData::InternalGetRefs() const {
@@ -5741,14 +5741,14 @@ std::list<NiObjectRef> NiFloatData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( floatData, in, version );
+void NiFloatExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( floatData, in, info );
 }
 
-void NiFloatExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( floatData, out, version );
+void NiFloatExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( floatData, out, info );
 }
 
 std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
@@ -5759,8 +5759,8 @@ std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatExtraData::InternalGetRefs() const {
@@ -5769,24 +5769,24 @@ std::list<NiObjectRef> NiFloatExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatExtraDataController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatExtraDataController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( unknownString, in, version );
+		NifStream( unknownString, in, info );
 	};
 }
 
-void NiFloatExtraDataController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x14000004 ) {
+void NiFloatExtraDataController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x14000004 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( unknownString, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( unknownString, out, info );
 	};
 }
 
@@ -5799,10 +5799,10 @@ std::string NiFloatExtraDataController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatExtraDataController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x14000004 ) {
-		unknownLink = FixLink<NiObject>( objects, link_stack, version );
+void NiFloatExtraDataController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x14000004 ) {
+		unknownLink = FixLink<NiObject>( objects, link_stack, info );
 	};
 }
 
@@ -5814,21 +5814,21 @@ std::list<NiObjectRef> NiFloatExtraDataController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiFloatInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( floatValue, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( floatValue, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( floatValue, out, version );
+void NiFloatInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( floatValue, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
@@ -5840,9 +5840,9 @@ std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiFloatInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatInterpolator::InternalGetRefs() const {
@@ -5853,21 +5853,21 @@ std::list<NiObjectRef> NiFloatInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFloatsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numFloats, in, version );
+void NiFloatsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numFloats, in, info );
 	data.resize(numFloats);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiFloatsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiFloatsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numFloats = (unsigned int)(data.size());
-	NifStream( numFloats, out, version );
+	NifStream( numFloats, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -5892,8 +5892,8 @@ std::string NiFloatsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFloatsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiFloatsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFloatsExtraData::InternalGetRefs() const {
@@ -5902,18 +5902,18 @@ std::list<NiObjectRef> NiFloatsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiFogProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( fogDepth, in, version );
-	NifStream( fogColor, in, version );
+void NiFogProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( fogDepth, in, info );
+	NifStream( fogColor, in, info );
 }
 
-void NiFogProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( fogDepth, out, version );
-	NifStream( fogColor, out, version );
+void NiFogProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( fogDepth, out, info );
+	NifStream( fogColor, out, info );
 }
 
 std::string NiFogProperty::InternalAsString( bool verbose ) const {
@@ -5926,8 +5926,8 @@ std::string NiFogProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiFogProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiFogProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiFogProperty::InternalGetRefs() const {
@@ -5936,63 +5936,63 @@ std::list<NiObjectRef> NiFogProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGeomMorpherController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiGeomMorpherController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown, in, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknown2, in, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknown2, in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownByte, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( numInterpolators, in, version );
+	NifStream( unknownByte, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( numInterpolators, in, info );
 		interpolators.resize(numInterpolators);
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( numUnknownInts, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( numUnknownInts, in, info );
 		unknownInts.resize(numUnknownInts);
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], in, version );
+			NifStream( unknownInts[i2], in, info );
 		};
 	};
 }
 
-void NiGeomMorpherController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiGeomMorpherController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numUnknownInts = (unsigned int)(unknownInts.size());
 	numInterpolators = (unsigned int)(interpolators.size());
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown, out, info );
 	};
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-		NifStream( unknown2, out, version );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+		NifStream( unknown2, out, info );
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownByte, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( numInterpolators, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownByte, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( numInterpolators, out, info );
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
 			if ( interpolators[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(interpolators[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(interpolators[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( numUnknownInts, out, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( numUnknownInts, out, info );
 		for (unsigned int i2 = 0; i2 < unknownInts.size(); i2++) {
-			NifStream( unknownInts[i2], out, version );
+			NifStream( unknownInts[i2], out, info );
 		};
 	};
 }
@@ -6036,12 +6036,12 @@ std::string NiGeomMorpherController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGeomMorpherController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiMorphData>( objects, link_stack, version );
-	if ( version >= 0x0A01006A ) {
+void NiGeomMorpherController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiMorphData>( objects, link_stack, info );
+	if ( info.version >= 0x0A01006A ) {
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
-			interpolators[i2] = FixLink<NiInterpolator>( objects, link_stack, version );
+			interpolators[i2] = FixLink<NiInterpolator>( objects, link_stack, info );
 		};
 	};
 }
@@ -6058,22 +6058,22 @@ std::list<NiObjectRef> NiGeomMorpherController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiGravity::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( force, in, version );
-	NifStream( type, in, version );
-	NifStream( position, in, version );
-	NifStream( direction, in, version );
+void NiGravity::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( force, in, info );
+	NifStream( type, in, info );
+	NifStream( position, in, info );
+	NifStream( direction, in, info );
 }
 
-void NiGravity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( force, out, version );
-	NifStream( type, out, version );
-	NifStream( position, out, version );
-	NifStream( direction, out, version );
+void NiGravity::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( force, out, info );
+	NifStream( type, out, info );
+	NifStream( position, out, info );
+	NifStream( direction, out, info );
 }
 
 std::string NiGravity::InternalAsString( bool verbose ) const {
@@ -6088,8 +6088,8 @@ std::string NiGravity::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiGravity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiGravity::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiGravity::InternalGetRefs() const {
@@ -6098,14 +6098,14 @@ std::list<NiObjectRef> NiGravity::InternalGetRefs() const {
 	return refs;
 }
 
-void NiIntegerExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( integerData, in, version );
+void NiIntegerExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( integerData, in, info );
 }
 
-void NiIntegerExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( integerData, out, version );
+void NiIntegerExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( integerData, out, info );
 }
 
 std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
@@ -6116,8 +6116,8 @@ std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegerExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiIntegerExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiIntegerExtraData::InternalGetRefs() const {
@@ -6126,21 +6126,21 @@ std::list<NiObjectRef> NiIntegerExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiIntegersExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numIntegers, in, version );
+void NiIntegersExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numIntegers, in, info );
 	data.resize(numIntegers);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiIntegersExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiIntegersExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numIntegers = (unsigned int)(data.size());
-	NifStream( numIntegers, out, version );
+	NifStream( numIntegers, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -6165,8 +6165,8 @@ std::string NiIntegersExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiIntegersExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiIntegersExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiIntegersExtraData::InternalGetRefs() const {
@@ -6175,19 +6175,19 @@ std::list<NiObjectRef> NiIntegersExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiKeyframeController::InternalAsString( bool verbose ) const {
@@ -6198,9 +6198,9 @@ std::string NiKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiKeyframeData>( objects, link_stack, version );
+void NiKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiKeyframeData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiKeyframeController::InternalGetRefs() const {
@@ -6211,19 +6211,19 @@ std::list<NiObjectRef> NiKeyframeController::InternalGetRefs() const {
 	return refs;
 }
 
-void BSKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void BSKeyframeController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiKeyframeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiKeyframeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void BSKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiKeyframeController::Write( out, link_map, version, user_version );
+void BSKeyframeController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiKeyframeController::Write( out, link_map, info );
 	if ( data2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string BSKeyframeController::InternalAsString( bool verbose ) const {
@@ -6234,9 +6234,9 @@ std::string BSKeyframeController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void BSKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeController::FixLinks( objects, link_stack, version, user_version );
-	data2 = FixLink<NiKeyframeData>( objects, link_stack, version );
+void BSKeyframeController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeController::FixLinks( objects, link_stack, info );
+	data2 = FixLink<NiKeyframeData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> BSKeyframeController::InternalGetRefs() const {
@@ -6247,96 +6247,96 @@ std::list<NiObjectRef> BSKeyframeController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiKeyframeData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( numRotationKeys, in, version );
+void NiKeyframeData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( numRotationKeys, in, info );
 	if ( (numRotationKeys != 0) ) {
-		NifStream( rotationType, in, version );
+		NifStream( rotationType, in, info );
 	};
 	if ( (rotationType != 4) ) {
 		quaternionKeys.resize(numRotationKeys);
 		for (unsigned int i2 = 0; i2 < quaternionKeys.size(); i2++) {
-			NifStream( quaternionKeys[i2], in, version, rotationType );
+			NifStream( quaternionKeys[i2], in, info, rotationType );
 		};
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( (rotationType == 4) ) {
-			NifStream( unknownFloat, in, version );
+			NifStream( unknownFloat, in, info );
 		};
 	};
 	if ( (rotationType == 4) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( xyzRotations[i2].numKeys, in, version );
+			NifStream( xyzRotations[i2].numKeys, in, info );
 			if ( (xyzRotations[i2].numKeys != 0) ) {
-				NifStream( xyzRotations[i2].interpolation, in, version );
+				NifStream( xyzRotations[i2].interpolation, in, info );
 			};
 			xyzRotations[i2].keys.resize(xyzRotations[i2].numKeys);
 			for (unsigned int i3 = 0; i3 < xyzRotations[i2].keys.size(); i3++) {
-				NifStream( xyzRotations[i2].keys[i3], in, version, xyzRotations[i2].interpolation );
+				NifStream( xyzRotations[i2].keys[i3], in, info, xyzRotations[i2].interpolation );
 			};
 		};
 	};
-	NifStream( translations.numKeys, in, version );
+	NifStream( translations.numKeys, in, info );
 	if ( (translations.numKeys != 0) ) {
-		NifStream( translations.interpolation, in, version );
+		NifStream( translations.interpolation, in, info );
 	};
 	translations.keys.resize(translations.numKeys);
 	for (unsigned int i1 = 0; i1 < translations.keys.size(); i1++) {
-		NifStream( translations.keys[i1], in, version, translations.interpolation );
+		NifStream( translations.keys[i1], in, info, translations.interpolation );
 	};
-	NifStream( scales.numKeys, in, version );
+	NifStream( scales.numKeys, in, info );
 	if ( (scales.numKeys != 0) ) {
-		NifStream( scales.interpolation, in, version );
+		NifStream( scales.interpolation, in, info );
 	};
 	scales.keys.resize(scales.numKeys);
 	for (unsigned int i1 = 0; i1 < scales.keys.size(); i1++) {
-		NifStream( scales.keys[i1], in, version, scales.interpolation );
+		NifStream( scales.keys[i1], in, info, scales.interpolation );
 	};
 }
 
-void NiKeyframeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
-	NifStream( numRotationKeys, out, version );
+void NiKeyframeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
+	NifStream( numRotationKeys, out, info );
 	if ( (numRotationKeys != 0) ) {
-		NifStream( rotationType, out, version );
+		NifStream( rotationType, out, info );
 	};
 	if ( (rotationType != 4) ) {
 		for (unsigned int i2 = 0; i2 < quaternionKeys.size(); i2++) {
-			NifStream( quaternionKeys[i2], out, version, rotationType );
+			NifStream( quaternionKeys[i2], out, info, rotationType );
 		};
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( (rotationType == 4) ) {
-			NifStream( unknownFloat, out, version );
+			NifStream( unknownFloat, out, info );
 		};
 	};
 	if ( (rotationType == 4) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
 			xyzRotations[i2].numKeys = (unsigned int)(xyzRotations[i2].keys.size());
-			NifStream( xyzRotations[i2].numKeys, out, version );
+			NifStream( xyzRotations[i2].numKeys, out, info );
 			if ( (xyzRotations[i2].numKeys != 0) ) {
-				NifStream( xyzRotations[i2].interpolation, out, version );
+				NifStream( xyzRotations[i2].interpolation, out, info );
 			};
 			for (unsigned int i3 = 0; i3 < xyzRotations[i2].keys.size(); i3++) {
-				NifStream( xyzRotations[i2].keys[i3], out, version, xyzRotations[i2].interpolation );
+				NifStream( xyzRotations[i2].keys[i3], out, info, xyzRotations[i2].interpolation );
 			};
 		};
 	};
 	translations.numKeys = (unsigned int)(translations.keys.size());
-	NifStream( translations.numKeys, out, version );
+	NifStream( translations.numKeys, out, info );
 	if ( (translations.numKeys != 0) ) {
-		NifStream( translations.interpolation, out, version );
+		NifStream( translations.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < translations.keys.size(); i1++) {
-		NifStream( translations.keys[i1], out, version, translations.interpolation );
+		NifStream( translations.keys[i1], out, info, translations.interpolation );
 	};
 	scales.numKeys = (unsigned int)(scales.keys.size());
-	NifStream( scales.numKeys, out, version );
+	NifStream( scales.numKeys, out, info );
 	if ( (scales.numKeys != 0) ) {
-		NifStream( scales.interpolation, out, version );
+		NifStream( scales.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < scales.keys.size(); i1++) {
-		NifStream( scales.keys[i1], out, version, scales.interpolation );
+		NifStream( scales.keys[i1], out, info, scales.interpolation );
 	};
 }
 
@@ -6426,8 +6426,8 @@ std::string NiKeyframeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiKeyframeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiKeyframeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiKeyframeData::InternalGetRefs() const {
@@ -6436,40 +6436,40 @@ std::list<NiObjectRef> NiKeyframeData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLightColorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightColorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownShort, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownShort, in, info );
 	};
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( unknownShort, in, version );
+		NifStream( unknownShort, in, info );
 	};
 }
 
-void NiLightColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A010000 ) ) {
-		NifStream( unknownShort, out, version );
+void NiLightColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A010000 ) ) {
+		NifStream( unknownShort, out, info );
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( interpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( unknownShort, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( unknownShort, out, info );
 	};
 }
 
@@ -6483,13 +6483,13 @@ std::string NiLightColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPosData>( objects, link_stack, version );
+void NiLightColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPosData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		interpolator = FixLink<NiPoint3Interpolator>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		interpolator = FixLink<NiPoint3Interpolator>( objects, link_stack, info );
 	};
 }
 
@@ -6503,19 +6503,19 @@ std::list<NiObjectRef> NiLightColorController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLightDimmerController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLightDimmerController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLightDimmerController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiLightDimmerController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
@@ -6526,9 +6526,9 @@ std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLightDimmerController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	unknownLink = FixLink<NiInterpolator>( objects, link_stack, version );
+void NiLightDimmerController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	unknownLink = FixLink<NiInterpolator>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLightDimmerController::InternalGetRefs() const {
@@ -6539,25 +6539,25 @@ std::list<NiObjectRef> NiLightDimmerController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLookAtController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown1, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown1, in, info );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLookAtController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknown1, out, version );
+void NiLookAtController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknown1, out, info );
 	};
 	if ( lookAtNode != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(lookAtNode) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(lookAtNode) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLookAtController::InternalAsString( bool verbose ) const {
@@ -6569,9 +6569,9 @@ std::string NiLookAtController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	lookAtNode = FixLink<NiNode>( objects, link_stack, version );
+void NiLookAtController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	lookAtNode = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLookAtController::InternalGetRefs() const {
@@ -6582,47 +6582,47 @@ std::list<NiObjectRef> NiLookAtController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLookAtInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLookAtInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownFloat, in, version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	NifStream( block_num, in, version );
+	NifStream( unknownFloat, in, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiLookAtInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
+void NiLookAtInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
 	if ( lookAt != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(lookAt) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(lookAt) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownFloat, out, version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownFloat, out, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
 	if ( unknownLink1 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink3 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink3) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink3) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
@@ -6641,12 +6641,12 @@ std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLookAtInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	lookAt = FixLink<NiNode>( objects, link_stack, version );
-	unknownLink1 = FixLink<NiPoint3Interpolator>( objects, link_stack, version );
-	unknownLink2 = FixLink<NiFloatInterpolator>( objects, link_stack, version );
-	unknownLink3 = FixLink<NiFloatInterpolator>( objects, link_stack, version );
+void NiLookAtInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	lookAt = FixLink<NiNode>( objects, link_stack, info );
+	unknownLink1 = FixLink<NiPoint3Interpolator>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiFloatInterpolator>( objects, link_stack, info );
+	unknownLink3 = FixLink<NiFloatInterpolator>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLookAtInterpolator::InternalGetRefs() const {
@@ -6663,28 +6663,28 @@ std::list<NiObjectRef> NiLookAtInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMaterialColorController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMaterialColorController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( targetColor, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( targetColor, in, info );
 	};
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMaterialColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( targetColor, out, version );
+void NiMaterialColorController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( targetColor, out, info );
 	};
-	if ( version <= 0x0A010000 ) {
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -6697,10 +6697,10 @@ std::string NiMaterialColorController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPosData>( objects, link_stack, version );
+void NiMaterialColorController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPosData>( objects, link_stack, info );
 	};
 }
 
@@ -6712,30 +6712,30 @@ std::list<NiObjectRef> NiMaterialColorController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMaterialProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+void NiMaterialProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( ambientColor, in, version );
-	NifStream( diffuseColor, in, version );
-	NifStream( specularColor, in, version );
-	NifStream( emissiveColor, in, version );
-	NifStream( glossiness, in, version );
-	NifStream( alpha, in, version );
+	NifStream( ambientColor, in, info );
+	NifStream( diffuseColor, in, info );
+	NifStream( specularColor, in, info );
+	NifStream( emissiveColor, in, info );
+	NifStream( glossiness, in, info );
+	NifStream( alpha, in, info );
 }
 
-void NiMaterialProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+void NiMaterialProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( ambientColor, out, version );
-	NifStream( diffuseColor, out, version );
-	NifStream( specularColor, out, version );
-	NifStream( emissiveColor, out, version );
-	NifStream( glossiness, out, version );
-	NifStream( alpha, out, version );
+	NifStream( ambientColor, out, info );
+	NifStream( diffuseColor, out, info );
+	NifStream( specularColor, out, info );
+	NifStream( emissiveColor, out, info );
+	NifStream( glossiness, out, info );
+	NifStream( alpha, out, info );
 }
 
 std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
@@ -6752,8 +6752,8 @@ std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMaterialProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiMaterialProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMaterialProperty::InternalGetRefs() const {
@@ -6762,104 +6762,104 @@ std::list<NiObjectRef> NiMaterialProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMeshPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMeshPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysData::Read( in, link_stack, version, user_version );
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownByte11, in, version );
+	APSysData::Read( in, link_stack, info );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownByte11, in, info );
 	};
-	if ( version <= 0x14000004 ) {
+	if ( info.version <= 0x14000004 ) {
 		unknownFloats4.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], in, version );
+				NifStream( unknownFloats4[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x14000005 ) {
+	if ( info.version >= 0x14000005 ) {
 		unknownFloats5.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats5.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 12; i3++) {
-				NifStream( unknownFloats5[i2][i3], in, version );
+				NifStream( unknownFloats5[i2][i3], in, info );
 			};
 		};
 	};
-	NifStream( unknownInt1, in, version );
-	if ( version <= 0x14000004 ) {
-		NifStream( block_num, in, version );
+	NifStream( unknownInt1, in, info );
+	if ( info.version <= 0x14000004 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
-		NifStream( unknownByte2, in, version );
-		NifStream( numUnknownLinks, in, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
+		NifStream( unknownByte2, in, info );
+		NifStream( numUnknownLinks, in, info );
 		unknownLinks.resize(numUnknownLinks);
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownShort4, in, version );
-		NifStream( unknownInt2, in, version );
-		NifStream( unknownByte12, in, version );
-		NifStream( unknownInt3, in, version );
-		NifStream( unknownInt4, in, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownShort4, in, info );
+		NifStream( unknownInt2, in, info );
+		NifStream( unknownByte12, in, info );
+		NifStream( unknownInt3, in, info );
+		NifStream( unknownInt4, in, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMeshPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysData::Write( out, link_map, version, user_version );
+void NiMeshPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysData::Write( out, link_map, info );
 	numUnknownLinks = (unsigned int)(unknownLinks.size());
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownByte11, out, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownByte11, out, info );
 	};
-	if ( version <= 0x14000004 ) {
+	if ( info.version <= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], out, version );
+				NifStream( unknownFloats4[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x14000005 ) {
+	if ( info.version >= 0x14000005 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats5.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 12; i3++) {
-				NifStream( unknownFloats5[i2][i3], out, version );
+				NifStream( unknownFloats5[i2][i3], out, info );
 			};
 		};
 	};
-	NifStream( unknownInt1, out, version );
-	if ( version <= 0x14000004 ) {
+	NifStream( unknownInt1, out, info );
+	if ( info.version <= 0x14000004 ) {
 		if ( modifier != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(modifier) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(modifier) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
-		NifStream( unknownByte2, out, version );
-		NifStream( numUnknownLinks, out, version );
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
+		NifStream( unknownByte2, out, info );
+		NifStream( numUnknownLinks, out, info );
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
 			if ( unknownLinks[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLinks[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLinks[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version >= 0x14000005 ) {
-		NifStream( unknownShort4, out, version );
-		NifStream( unknownInt2, out, version );
-		NifStream( unknownByte12, out, version );
-		NifStream( unknownInt3, out, version );
-		NifStream( unknownInt4, out, version );
+	if ( info.version >= 0x14000005 ) {
+		NifStream( unknownShort4, out, info );
+		NifStream( unknownInt2, out, info );
+		NifStream( unknownByte12, out, info );
+		NifStream( unknownInt3, out, info );
+		NifStream( unknownInt4, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( unknownLink2 != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -6922,18 +6922,18 @@ std::string NiMeshPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x14000004 ) {
-		modifier = FixLink<NiObject>( objects, link_stack, version );
+void NiMeshPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x14000004 ) {
+		modifier = FixLink<NiObject>( objects, link_stack, info );
 	};
-	if ( ( version >= 0x0A020000 ) && ( version <= 0x14000004 ) ) {
+	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000004 ) ) {
 		for (unsigned int i2 = 0; i2 < unknownLinks.size(); i2++) {
-			unknownLinks[i2] = FixLink<NiObject>( objects, link_stack, version );
+			unknownLinks[i2] = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
-	if ( version >= 0x0A020000 ) {
-		unknownLink2 = FixLink<NiNode>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		unknownLink2 = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -6951,57 +6951,57 @@ std::list<NiObjectRef> NiMeshPSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMorphData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numMorphs, in, version );
-	NifStream( numVertices, in, version );
-	NifStream( unknownByte, in, version );
+void NiMorphData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numMorphs, in, info );
+	NifStream( numVertices, in, info );
+	NifStream( unknownByte, in, info );
 	morphs.resize(numMorphs);
 	for (unsigned int i1 = 0; i1 < morphs.size(); i1++) {
-		if ( version >= 0x0A01006A ) {
-			NifStream( morphs[i1].frameName, in, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( morphs[i1].frameName, in, info );
 		};
-		if ( version <= 0x0A010000 ) {
-			NifStream( morphs[i1].numKeys, in, version );
-			NifStream( morphs[i1].interpolation, in, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( morphs[i1].numKeys, in, info );
+			NifStream( morphs[i1].interpolation, in, info );
 			morphs[i1].keys.resize(morphs[i1].numKeys);
 			for (unsigned int i3 = 0; i3 < morphs[i1].keys.size(); i3++) {
-				NifStream( morphs[i1].keys[i3], in, version, morphs[i1].interpolation );
+				NifStream( morphs[i1].keys[i3], in, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( morphs[i1].unknownInt, in, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( morphs[i1].unknownInt, in, info );
 		};
 		morphs[i1].vectors.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
-			NifStream( morphs[i1].vectors[i2], in, version );
+			NifStream( morphs[i1].vectors[i2], in, info );
 		};
 	};
 }
 
-void NiMorphData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiMorphData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numMorphs = (unsigned int)(morphs.size());
-	NifStream( numMorphs, out, version );
-	NifStream( numVertices, out, version );
-	NifStream( unknownByte, out, version );
+	NifStream( numMorphs, out, info );
+	NifStream( numVertices, out, info );
+	NifStream( unknownByte, out, info );
 	for (unsigned int i1 = 0; i1 < morphs.size(); i1++) {
 		morphs[i1].numKeys = (unsigned int)(morphs[i1].keys.size());
-		if ( version >= 0x0A01006A ) {
-			NifStream( morphs[i1].frameName, out, version );
+		if ( info.version >= 0x0A01006A ) {
+			NifStream( morphs[i1].frameName, out, info );
 		};
-		if ( version <= 0x0A010000 ) {
-			NifStream( morphs[i1].numKeys, out, version );
-			NifStream( morphs[i1].interpolation, out, version );
+		if ( info.version <= 0x0A010000 ) {
+			NifStream( morphs[i1].numKeys, out, info );
+			NifStream( morphs[i1].interpolation, out, info );
 			for (unsigned int i3 = 0; i3 < morphs[i1].keys.size(); i3++) {
-				NifStream( morphs[i1].keys[i3], out, version, morphs[i1].interpolation );
+				NifStream( morphs[i1].keys[i3], out, info, morphs[i1].interpolation );
 			};
 		};
-		if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
-			NifStream( morphs[i1].unknownInt, out, version );
+		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
+			NifStream( morphs[i1].unknownInt, out, info );
 		};
 		for (unsigned int i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
-			NifStream( morphs[i1].vectors[i2], out, version );
+			NifStream( morphs[i1].vectors[i2], out, info );
 		};
 	};
 }
@@ -7053,8 +7053,8 @@ std::string NiMorphData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMorphData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiMorphData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMorphData::InternalGetRefs() const {
@@ -7063,26 +7063,26 @@ std::list<NiObjectRef> NiMorphData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMultiTargetTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiMultiTargetTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( numExtraTargets, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( numExtraTargets, in, info );
 	extraTargets.resize(numExtraTargets);
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiMultiTargetTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiMultiTargetTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numExtraTargets = (unsigned short)(extraTargets.size());
-	NifStream( numExtraTargets, out, version );
+	NifStream( numExtraTargets, out, info );
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
 		if ( extraTargets[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(extraTargets[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(extraTargets[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7107,10 +7107,10 @@ std::string NiMultiTargetTransformController::InternalAsString( bool verbose ) c
 	return out.str();
 }
 
-void NiMultiTargetTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiMultiTargetTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
-		extraTargets[i1] = FixLink<NiNode>( objects, link_stack, version );
+		extraTargets[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -7122,40 +7122,40 @@ std::list<NiObjectRef> NiMultiTargetTransformController::InternalGetRefs() const
 	return refs;
 }
 
-void NiNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiAVObject::Read( in, link_stack, version, user_version );
-	NifStream( numChildren, in, version );
+	NiAVObject::Read( in, link_stack, info );
+	NifStream( numChildren, in, info );
 	children.resize(numChildren);
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( numEffects, in, version );
+	NifStream( numEffects, in, info );
 	effects.resize(numEffects);
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAVObject::Write( out, link_map, version, user_version );
+void NiNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAVObject::Write( out, link_map, info );
 	numEffects = (unsigned int)(effects.size());
 	numChildren = (unsigned int)(children.size());
-	NifStream( numChildren, out, version );
+	NifStream( numChildren, out, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
 		if ( children[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( numEffects, out, version );
+	NifStream( numEffects, out, info );
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
 		if ( effects[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(effects[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(effects[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7194,13 +7194,13 @@ std::string NiNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAVObject::FixLinks( objects, link_stack, version, user_version );
+void NiNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAVObject::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
-		children[i1] = FixLink<NiAVObject>( objects, link_stack, version );
+		children[i1] = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
-		effects[i1] = FixLink<NiDynamicEffect>( objects, link_stack, version );
+		effects[i1] = FixLink<NiDynamicEffect>( objects, link_stack, info );
 	};
 }
 
@@ -7218,12 +7218,12 @@ std::list<NiObjectRef> NiNode::InternalGetRefs() const {
 	return refs;
 }
 
-void AvoidNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void AvoidNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void AvoidNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void AvoidNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string AvoidNode::InternalAsString( bool verbose ) const {
@@ -7233,8 +7233,8 @@ std::string AvoidNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void AvoidNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void AvoidNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> AvoidNode::InternalGetRefs() const {
@@ -7243,19 +7243,19 @@ std::list<NiObjectRef> AvoidNode::InternalGetRefs() const {
 	return refs;
 }
 
-void FxWidget::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
-	NifStream( unknown1, in, version );
+void FxWidget::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
+	NifStream( unknown1, in, info );
 	for (unsigned int i1 = 0; i1 < 292; i1++) {
-		NifStream( unknown292Bytes[i1], in, version );
+		NifStream( unknown292Bytes[i1], in, info );
 	};
 }
 
-void FxWidget::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
-	NifStream( unknown1, out, version );
+void FxWidget::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
+	NifStream( unknown1, out, info );
 	for (unsigned int i1 = 0; i1 < 292; i1++) {
-		NifStream( unknown292Bytes[i1], out, version );
+		NifStream( unknown292Bytes[i1], out, info );
 	};
 }
 
@@ -7279,8 +7279,8 @@ std::string FxWidget::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxWidget::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void FxWidget::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> FxWidget::InternalGetRefs() const {
@@ -7289,12 +7289,12 @@ std::list<NiObjectRef> FxWidget::InternalGetRefs() const {
 	return refs;
 }
 
-void FxButton::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::Read( in, link_stack, version, user_version );
+void FxButton::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::Read( in, link_stack, info );
 }
 
-void FxButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	FxWidget::Write( out, link_map, version, user_version );
+void FxButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	FxWidget::Write( out, link_map, info );
 }
 
 std::string FxButton::InternalAsString( bool verbose ) const {
@@ -7304,8 +7304,8 @@ std::string FxButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::FixLinks( objects, link_stack, version, user_version );
+void FxButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> FxButton::InternalGetRefs() const {
@@ -7314,32 +7314,32 @@ std::list<NiObjectRef> FxButton::InternalGetRefs() const {
 	return refs;
 }
 
-void FxRadioButton::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void FxRadioButton::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	FxWidget::Read( in, link_stack, version, user_version );
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( numButtons, in, version );
+	FxWidget::Read( in, link_stack, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( numButtons, in, info );
 	buttons.resize(numButtons);
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void FxRadioButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	FxWidget::Write( out, link_map, version, user_version );
+void FxRadioButton::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	FxWidget::Write( out, link_map, info );
 	numButtons = (unsigned int)(buttons.size());
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( numButtons, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( numButtons, out, info );
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
 		if ( buttons[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(buttons[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(buttons[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7367,10 +7367,10 @@ std::string FxRadioButton::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void FxRadioButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	FxWidget::FixLinks( objects, link_stack, version, user_version );
+void FxRadioButton::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	FxWidget::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
-		buttons[i1] = FixLink<FxRadioButton>( objects, link_stack, version );
+		buttons[i1] = FixLink<FxRadioButton>( objects, link_stack, info );
 	};
 }
 
@@ -7382,17 +7382,17 @@ std::list<NiObjectRef> FxRadioButton::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBillboardNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( billboardMode, in, version );
+void NiBillboardNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( billboardMode, in, info );
 	};
 }
 
-void NiBillboardNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( billboardMode, out, version );
+void NiBillboardNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( billboardMode, out, info );
 	};
 }
 
@@ -7404,8 +7404,8 @@ std::string NiBillboardNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBillboardNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBillboardNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBillboardNode::InternalGetRefs() const {
@@ -7414,12 +7414,12 @@ std::list<NiObjectRef> NiBillboardNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSAnimationNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void NiBSAnimationNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void NiBSAnimationNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiBSAnimationNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
@@ -7429,8 +7429,8 @@ std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSAnimationNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBSAnimationNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSAnimationNode::InternalGetRefs() const {
@@ -7439,12 +7439,12 @@ std::list<NiObjectRef> NiBSAnimationNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSParticleNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void NiBSParticleNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void NiBSParticleNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiBSParticleNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
@@ -7454,8 +7454,8 @@ std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSParticleNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void NiBSParticleNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSParticleNode::InternalGetRefs() const {
@@ -7464,48 +7464,48 @@ std::list<NiObjectRef> NiBSParticleNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLODNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiLODNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiNode::Read( in, link_stack, version, user_version );
+	NiNode::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Bytes[i1], in, version );
+		NifStream( unknown4Bytes[i1], in, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( lodCenter, in, version );
-		NifStream( numLodLevels, in, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( lodCenter, in, info );
+		NifStream( numLodLevels, in, info );
 		lodLevels.resize(numLodLevels);
 		for (unsigned int i2 = 0; i2 < lodLevels.size(); i2++) {
-			NifStream( lodLevels[i2].nearExtent, in, version );
-			NifStream( lodLevels[i2].farExtent, in, version );
+			NifStream( lodLevels[i2].nearExtent, in, info );
+			NifStream( lodLevels[i2].farExtent, in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, in, version );
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, in, info );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiLODNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void NiLODNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 	numLodLevels = (unsigned int)(lodLevels.size());
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Bytes[i1], out, version );
+		NifStream( unknown4Bytes[i1], out, info );
 	};
-	if ( version <= 0x0A000100 ) {
-		NifStream( lodCenter, out, version );
-		NifStream( numLodLevels, out, version );
+	if ( info.version <= 0x0A000100 ) {
+		NifStream( lodCenter, out, info );
+		NifStream( numLodLevels, out, info );
 		for (unsigned int i2 = 0; i2 < lodLevels.size(); i2++) {
-			NifStream( lodLevels[i2].nearExtent, out, version );
-			NifStream( lodLevels[i2].farExtent, out, version );
+			NifStream( lodLevels[i2].nearExtent, out, info );
+			NifStream( lodLevels[i2].farExtent, out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort, out, info );
 		if ( lodLevelData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(lodLevelData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(lodLevelData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7542,10 +7542,10 @@ std::string NiLODNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		lodLevelData = FixLink<NiLODData>( objects, link_stack, version );
+void NiLODNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		lodLevelData = FixLink<NiLODData>( objects, link_stack, info );
 	};
 }
 
@@ -7557,24 +7557,24 @@ std::list<NiObjectRef> NiLODNode::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( unknownByte, in, version );
-	NifStream( numEntries_, in, version );
+void NiPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( unknownByte, in, info );
+	NifStream( numEntries_, in, info );
 	for (unsigned int i1 = 0; i1 < 256; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( palette[i1][i2], in, version );
+			NifStream( palette[i1][i2], in, info );
 		};
 	};
 }
 
-void NiPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( unknownByte, out, version );
-	NifStream( numEntries_, out, version );
+void NiPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( unknownByte, out, info );
+	NifStream( numEntries_, out, info );
 	for (unsigned int i1 = 0; i1 < 256; i1++) {
 		for (unsigned int i2 = 0; i2 < 4; i2++) {
-			NifStream( palette[i1][i2], out, version );
+			NifStream( palette[i1][i2], out, info );
 		};
 	};
 }
@@ -7602,8 +7602,8 @@ std::string NiPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPalette::InternalGetRefs() const {
@@ -7612,36 +7612,36 @@ std::list<NiObjectRef> NiPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleBomb::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-}
-
-void NiParticleBomb::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
+void NiParticleBomb::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+}
+
+void NiParticleBomb::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
 }
 
 std::string NiParticleBomb::InternalAsString( bool verbose ) const {
@@ -7663,8 +7663,8 @@ std::string NiParticleBomb::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleBomb::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleBomb::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleBomb::InternalGetRefs() const {
@@ -7673,19 +7673,19 @@ std::list<NiObjectRef> NiParticleBomb::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiParticleColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
+void NiParticleColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
 	if ( colorData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
@@ -7696,9 +7696,9 @@ std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
-	colorData = FixLink<NiColorData>( objects, link_stack, version );
+void NiParticleColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
+	colorData = FixLink<NiColorData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleColorModifier::InternalGetRefs() const {
@@ -7709,16 +7709,16 @@ std::list<NiObjectRef> NiParticleColorModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleGrowFade::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( grow, in, version );
-	NifStream( fade, in, version );
+void NiParticleGrowFade::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( grow, in, info );
+	NifStream( fade, in, info );
 }
 
-void NiParticleGrowFade::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( grow, out, version );
-	NifStream( fade, out, version );
+void NiParticleGrowFade::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( grow, out, info );
+	NifStream( fade, out, info );
 }
 
 std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
@@ -7730,8 +7730,8 @@ std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleGrowFade::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleGrowFade::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleGrowFade::InternalGetRefs() const {
@@ -7740,26 +7740,26 @@ std::list<NiObjectRef> NiParticleGrowFade::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( numParticleMeshes, in, version );
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( numParticleMeshes, in, info );
 	particleMeshes.resize(numParticleMeshes);
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiParticleMeshModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
+void NiParticleMeshModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
 	numParticleMeshes = (unsigned int)(particleMeshes.size());
-	NifStream( numParticleMeshes, out, version );
+	NifStream( numParticleMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
 		if ( particleMeshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(particleMeshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(particleMeshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -7784,10 +7784,10 @@ std::string NiParticleMeshModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
-		particleMeshes[i1] = FixLink<NiAVObject>( objects, link_stack, version );
+		particleMeshes[i1] = FixLink<NiAVObject>( objects, link_stack, info );
 	};
 }
 
@@ -7801,22 +7801,22 @@ std::list<NiObjectRef> NiParticleMeshModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleRotation::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownByte, in, version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
+void NiParticleRotation::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownByte, in, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
 }
 
-void NiParticleRotation::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownByte, out, version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
+void NiParticleRotation::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownByte, out, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
 }
 
 std::string NiParticleRotation::InternalAsString( bool verbose ) const {
@@ -7831,8 +7831,8 @@ std::string NiParticleRotation::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleRotation::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiParticleRotation::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleRotation::InternalGetRefs() const {
@@ -7841,12 +7841,12 @@ std::list<NiObjectRef> NiParticleRotation::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::Read( in, link_stack, version, user_version );
+void NiParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::Read( in, link_stack, info );
 }
 
-void NiParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiGeometry::Write( out, link_map, version, user_version );
+void NiParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiGeometry::Write( out, link_map, info );
 }
 
 std::string NiParticles::InternalAsString( bool verbose ) const {
@@ -7856,8 +7856,8 @@ std::string NiParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiGeometry::FixLinks( objects, link_stack, version, user_version );
+void NiParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiGeometry::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticles::InternalGetRefs() const {
@@ -7866,12 +7866,12 @@ std::list<NiObjectRef> NiParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiAutoNormalParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiAutoNormalParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiAutoNormalParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiAutoNormalParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
@@ -7881,8 +7881,8 @@ std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiAutoNormalParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiAutoNormalParticles::InternalGetRefs() const {
@@ -7891,12 +7891,12 @@ std::list<NiObjectRef> NiAutoNormalParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshes::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiParticleMeshes::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiParticleMeshes::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiParticleMeshes::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
@@ -7906,8 +7906,8 @@ std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshes::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshes::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleMeshes::InternalGetRefs() const {
@@ -7916,42 +7916,42 @@ std::list<NiObjectRef> NiParticleMeshes::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAutoNormalParticlesData::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( numActive, in, version );
-		NifStream( hasUnknownFloats, in, version );
+void NiParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAutoNormalParticlesData::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numActive, in, info );
+		NifStream( hasUnknownFloats, in, info );
 		if ( (hasUnknownFloats != 0) ) {
 			unknownFloats.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownFloats.size(); i3++) {
-				NifStream( unknownFloats[i3], in, version );
+				NifStream( unknownFloats[i3], in, info );
 			};
 		};
 	};
-	NifStream( hasRotations, in, version );
+	NifStream( hasRotations, in, info );
 	if ( (hasRotations != 0) ) {
 		rotations.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < rotations.size(); i2++) {
-			NifStream( rotations[i2], in, version );
+			NifStream( rotations[i2], in, info );
 		};
 	};
 }
 
-void NiParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiAutoNormalParticlesData::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( numActive, out, version );
-		NifStream( hasUnknownFloats, out, version );
+void NiParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiAutoNormalParticlesData::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( numActive, out, info );
+		NifStream( hasUnknownFloats, out, info );
 		if ( (hasUnknownFloats != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownFloats.size(); i3++) {
-				NifStream( unknownFloats[i3], out, version );
+				NifStream( unknownFloats[i3], out, info );
 			};
 		};
 	};
-	NifStream( hasRotations, out, version );
+	NifStream( hasRotations, out, info );
 	if ( (hasRotations != 0) ) {
 		for (unsigned int i2 = 0; i2 < rotations.size(); i2++) {
-			NifStream( rotations[i2], out, version );
+			NifStream( rotations[i2], out, info );
 		};
 	};
 }
@@ -7994,8 +7994,8 @@ std::string NiParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiAutoNormalParticlesData::FixLinks( objects, link_stack, version, user_version );
+void NiParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiAutoNormalParticlesData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticlesData::InternalGetRefs() const {
@@ -8004,19 +8004,19 @@ std::list<NiObjectRef> NiParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleMeshesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleMeshesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiParticlesData::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiParticlesData::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiParticleMeshesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticlesData::Write( out, link_map, version, user_version );
+void NiParticleMeshesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticlesData::Write( out, link_map, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
@@ -8027,9 +8027,9 @@ std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleMeshesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
-	unknownLink2 = FixLink<NiAVObject>( objects, link_stack, version );
+void NiParticleMeshesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::FixLinks( objects, link_stack, info );
+	unknownLink2 = FixLink<NiAVObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleMeshesData::InternalGetRefs() const {
@@ -8040,31 +8040,31 @@ std::list<NiObjectRef> NiParticleMeshesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiParticles::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownBool, in, version );
-		NifStream( numModifiers, in, version );
+	NiParticles::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownBool, in, info );
+		NifStream( numModifiers, in, info );
 		modifiers.resize(numModifiers);
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
 }
 
-void NiParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 	numModifiers = (unsigned int)(modifiers.size());
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownBool, out, version );
-		NifStream( numModifiers, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownBool, out, info );
+		NifStream( numModifiers, out, info );
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
 			if ( modifiers[i2] != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(modifiers[i2]) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(modifiers[i2]) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
 }
@@ -8091,11 +8091,11 @@ std::string NiParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
-			modifiers[i2] = FixLink<NiPSysModifier>( objects, link_stack, version );
+			modifiers[i2] = FixLink<NiPSysModifier>( objects, link_stack, info );
 		};
 	};
 }
@@ -8110,12 +8110,12 @@ std::list<NiObjectRef> NiParticleSystem::InternalGetRefs() const {
 	return refs;
 }
 
-void NiMeshParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystem::Read( in, link_stack, version, user_version );
+void NiMeshParticleSystem::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystem::Read( in, link_stack, info );
 }
 
-void NiMeshParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticleSystem::Write( out, link_map, version, user_version );
+void NiMeshParticleSystem::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticleSystem::Write( out, link_map, info );
 }
 
 std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
@@ -8125,8 +8125,8 @@ std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiMeshParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystem::FixLinks( objects, link_stack, version, user_version );
+void NiMeshParticleSystem::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystem::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiMeshParticleSystem::InternalGetRefs() const {
@@ -8135,117 +8135,117 @@ std::list<NiObjectRef> NiMeshParticleSystem::InternalGetRefs() const {
 	return refs;
 }
 
-void NiParticleSystemController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiParticleSystemController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( speed, in, version );
-	NifStream( speedRandom, in, version );
-	NifStream( verticalDirection, in, version );
-	NifStream( verticalAngle, in, version );
-	NifStream( horizontalDirection, in, version );
-	NifStream( horizontalAngle, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-	NifStream( unknownFloat11, in, version );
-	NifStream( size, in, version );
-	NifStream( emitStartTime, in, version );
-	NifStream( emitStopTime, in, version );
-	NifStream( unknownByte, in, version );
-	NifStream( emitRate, in, version );
-	NifStream( lifetime, in, version );
-	NifStream( lifetimeRandom, in, version );
-	NifStream( emitFlags, in, version );
-	NifStream( startRandom, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( speed, in, info );
+	NifStream( speedRandom, in, info );
+	NifStream( verticalDirection, in, info );
+	NifStream( verticalAngle, in, info );
+	NifStream( horizontalDirection, in, info );
+	NifStream( horizontalAngle, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+	NifStream( unknownFloat11, in, info );
+	NifStream( size, in, info );
+	NifStream( emitStartTime, in, info );
+	NifStream( emitStopTime, in, info );
+	NifStream( unknownByte, in, info );
+	NifStream( emitRate, in, info );
+	NifStream( lifetime, in, info );
+	NifStream( lifetimeRandom, in, info );
+	NifStream( emitFlags, in, info );
+	NifStream( startRandom, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( unknownShort2_, in, version );
-	NifStream( unknownFloat13_, in, version );
-	NifStream( unknownInt1_, in, version );
-	NifStream( unknownInt2_, in, version );
-	NifStream( unknownShort3_, in, version );
-	NifStream( numParticles, in, version );
-	NifStream( numValid, in, version );
+	NifStream( unknownShort2_, in, info );
+	NifStream( unknownFloat13_, in, info );
+	NifStream( unknownInt1_, in, info );
+	NifStream( unknownInt2_, in, info );
+	NifStream( unknownShort3_, in, info );
+	NifStream( numParticles, in, info );
+	NifStream( numValid, in, info );
 	particles.resize(numParticles);
 	for (unsigned int i1 = 0; i1 < particles.size(); i1++) {
-		NifStream( particles[i1].velocity, in, version );
-		NifStream( particles[i1].unknownVector, in, version );
-		NifStream( particles[i1].lifetime, in, version );
-		NifStream( particles[i1].lifespan, in, version );
-		NifStream( particles[i1].timestamp, in, version );
-		NifStream( particles[i1].unknownShort, in, version );
-		NifStream( particles[i1].vertexId, in, version );
-	};
-	NifStream( block_num, in, version );
+		NifStream( particles[i1].velocity, in, info );
+		NifStream( particles[i1].unknownVector, in, info );
+		NifStream( particles[i1].lifetime, in, info );
+		NifStream( particles[i1].lifespan, in, info );
+		NifStream( particles[i1].timestamp, in, info );
+		NifStream( particles[i1].unknownShort, in, info );
+		NifStream( particles[i1].vertexId, in, info );
+	};
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( trailer, in, version );
+	NifStream( trailer, in, info );
 }
 
-void NiParticleSystemController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiParticleSystemController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 	numParticles = (unsigned short)(particles.size());
-	NifStream( speed, out, version );
-	NifStream( speedRandom, out, version );
-	NifStream( verticalDirection, out, version );
-	NifStream( verticalAngle, out, version );
-	NifStream( horizontalDirection, out, version );
-	NifStream( horizontalAngle, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
-	NifStream( unknownFloat11, out, version );
-	NifStream( size, out, version );
-	NifStream( emitStartTime, out, version );
-	NifStream( emitStopTime, out, version );
-	NifStream( unknownByte, out, version );
-	NifStream( emitRate, out, version );
-	NifStream( lifetime, out, version );
-	NifStream( lifetimeRandom, out, version );
-	NifStream( emitFlags, out, version );
-	NifStream( startRandom, out, version );
+	NifStream( speed, out, info );
+	NifStream( speedRandom, out, info );
+	NifStream( verticalDirection, out, info );
+	NifStream( verticalAngle, out, info );
+	NifStream( horizontalDirection, out, info );
+	NifStream( horizontalAngle, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
+	NifStream( unknownFloat11, out, info );
+	NifStream( size, out, info );
+	NifStream( emitStartTime, out, info );
+	NifStream( emitStopTime, out, info );
+	NifStream( unknownByte, out, info );
+	NifStream( emitRate, out, info );
+	NifStream( lifetime, out, info );
+	NifStream( lifetimeRandom, out, info );
+	NifStream( emitFlags, out, info );
+	NifStream( startRandom, out, info );
 	if ( emitter != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(emitter) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(emitter) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( unknownShort2_, out, version );
-	NifStream( unknownFloat13_, out, version );
-	NifStream( unknownInt1_, out, version );
-	NifStream( unknownInt2_, out, version );
-	NifStream( unknownShort3_, out, version );
-	NifStream( numParticles, out, version );
-	NifStream( numValid, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( unknownShort2_, out, info );
+	NifStream( unknownFloat13_, out, info );
+	NifStream( unknownInt1_, out, info );
+	NifStream( unknownInt2_, out, info );
+	NifStream( unknownShort3_, out, info );
+	NifStream( numParticles, out, info );
+	NifStream( numValid, out, info );
 	for (unsigned int i1 = 0; i1 < particles.size(); i1++) {
-		NifStream( particles[i1].velocity, out, version );
-		NifStream( particles[i1].unknownVector, out, version );
-		NifStream( particles[i1].lifetime, out, version );
-		NifStream( particles[i1].lifespan, out, version );
-		NifStream( particles[i1].timestamp, out, version );
-		NifStream( particles[i1].unknownShort, out, version );
-		NifStream( particles[i1].vertexId, out, version );
+		NifStream( particles[i1].velocity, out, info );
+		NifStream( particles[i1].unknownVector, out, info );
+		NifStream( particles[i1].lifetime, out, info );
+		NifStream( particles[i1].lifespan, out, info );
+		NifStream( particles[i1].timestamp, out, info );
+		NifStream( particles[i1].unknownShort, out, info );
+		NifStream( particles[i1].vertexId, out, info );
 	};
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( particleExtra != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(particleExtra) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(particleExtra) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink2 != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( trailer, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( trailer, out, info );
 }
 
 std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
@@ -8304,12 +8304,12 @@ std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiParticleSystemController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	emitter = FixLink<NiObject>( objects, link_stack, version );
-	unknownLink = FixLink<NiObject>( objects, link_stack, version );
-	particleExtra = FixLink<AParticleModifier>( objects, link_stack, version );
-	unknownLink2 = FixLink<NiObject>( objects, link_stack, version );
+void NiParticleSystemController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	emitter = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink = FixLink<NiObject>( objects, link_stack, info );
+	particleExtra = FixLink<AParticleModifier>( objects, link_stack, info );
+	unknownLink2 = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
@@ -8324,12 +8324,12 @@ std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiBSPArrayController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystemController::Read( in, link_stack, version, user_version );
+void NiBSPArrayController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystemController::Read( in, link_stack, info );
 }
 
-void NiBSPArrayController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticleSystemController::Write( out, link_map, version, user_version );
+void NiBSPArrayController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticleSystemController::Write( out, link_map, info );
 }
 
 std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
@@ -8339,8 +8339,8 @@ std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiBSPArrayController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticleSystemController::FixLinks( objects, link_stack, version, user_version );
+void NiBSPArrayController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticleSystemController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiBSPArrayController::InternalGetRefs() const {
@@ -8349,39 +8349,39 @@ std::list<NiObjectRef> NiBSPArrayController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPathController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort2, in, version );
-	};
-	NifStream( unknownInt1, in, version );
-	NifStream( unknownInt2, in, version );
-	NifStream( unknownInt3, in, version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort2, in, info );
+	};
+	NifStream( unknownInt1, in, info );
+	NifStream( unknownInt2, in, info );
+	NifStream( unknownInt3, in, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPathController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( unknownShort2, out, version );
+void NiPathController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( unknownShort2, out, info );
 	};
-	NifStream( unknownInt1, out, version );
-	NifStream( unknownInt2, out, version );
-	NifStream( unknownInt3, out, version );
-	NifStream( unknownShort, out, version );
+	NifStream( unknownInt1, out, info );
+	NifStream( unknownInt2, out, info );
+	NifStream( unknownInt3, out, info );
+	NifStream( unknownShort, out, info );
 	if ( posData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( floatData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPathController::InternalAsString( bool verbose ) const {
@@ -8398,10 +8398,10 @@ std::string NiPathController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	posData = FixLink<NiPosData>( objects, link_stack, version );
-	floatData = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPathController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	posData = FixLink<NiPosData>( objects, link_stack, info );
+	floatData = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPathController::InternalGetRefs() const {
@@ -8414,31 +8414,31 @@ std::list<NiObjectRef> NiPathController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPathInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPathInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiBlendInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	NifStream( unknownShort2, in, version );
-	NifStream( block_num, in, version );
+	NiBlendInterpolator::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	NifStream( unknownShort2, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPathInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiBlendInterpolator::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	NifStream( unknownShort2, out, version );
+void NiPathInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiBlendInterpolator::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	NifStream( unknownShort2, out, info );
 	if ( posData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( floatData != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
@@ -8453,10 +8453,10 @@ std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPathInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiBlendInterpolator::FixLinks( objects, link_stack, version, user_version );
-	posData = FixLink<NiPosData>( objects, link_stack, version );
-	floatData = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPathInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiBlendInterpolator::FixLinks( objects, link_stack, info );
+	posData = FixLink<NiPosData>( objects, link_stack, info );
+	floatData = FixLink<NiFloatData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPathInterpolator::InternalGetRefs() const {
@@ -8469,88 +8469,88 @@ std::list<NiObjectRef> NiPathInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPixelData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPixelData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( pixelFormat, in, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( redMask, in, version );
-		NifStream( greenMask, in, version );
-		NifStream( blueMask, in, version );
-		NifStream( alphaMask, in, version );
-		NifStream( bitsPerPixel, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( pixelFormat, in, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( redMask, in, info );
+		NifStream( greenMask, in, info );
+		NifStream( blueMask, in, info );
+		NifStream( alphaMask, in, info );
+		NifStream( bitsPerPixel, in, info );
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknown8Bytes[i2], in, version );
+			NifStream( unknown8Bytes[i2], in, info );
 		};
 	};
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownInt, in, version );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownInt, in, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < 54; i2++) {
-			NifStream( unknown54Bytes[i2], in, version );
+			NifStream( unknown54Bytes[i2], in, info );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( numMipmaps, in, version );
-	NifStream( bytesPerPixel, in, version );
+	NifStream( numMipmaps, in, info );
+	NifStream( bytesPerPixel, in, info );
 	mipmaps.resize(numMipmaps);
 	for (unsigned int i1 = 0; i1 < mipmaps.size(); i1++) {
-		NifStream( mipmaps[i1].width, in, version );
-		NifStream( mipmaps[i1].height, in, version );
-		NifStream( mipmaps[i1].offset, in, version );
+		NifStream( mipmaps[i1].width, in, info );
+		NifStream( mipmaps[i1].height, in, info );
+		NifStream( mipmaps[i1].offset, in, info );
 	};
-	NifStream( pixelData.dataSize, in, version );
+	NifStream( pixelData.dataSize, in, info );
 	pixelData.data.resize(pixelData.dataSize);
 	for (unsigned int i1 = 0; i1 < pixelData.data.size(); i1++) {
-		NifStream( pixelData.data[i1], in, version );
+		NifStream( pixelData.data[i1], in, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownInt2, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownInt2, in, info );
 	};
 }
 
-void NiPixelData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiPixelData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numMipmaps = (unsigned int)(mipmaps.size());
-	NifStream( pixelFormat, out, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( redMask, out, version );
-		NifStream( greenMask, out, version );
-		NifStream( blueMask, out, version );
-		NifStream( alphaMask, out, version );
-		NifStream( bitsPerPixel, out, version );
+	NifStream( pixelFormat, out, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( redMask, out, info );
+		NifStream( greenMask, out, info );
+		NifStream( blueMask, out, info );
+		NifStream( alphaMask, out, info );
+		NifStream( bitsPerPixel, out, info );
 		for (unsigned int i2 = 0; i2 < 8; i2++) {
-			NifStream( unknown8Bytes[i2], out, version );
+			NifStream( unknown8Bytes[i2], out, info );
 		};
 	};
-	if ( ( version >= 0x0A010000 ) && ( version <= 0x0A020000 ) ) {
-		NifStream( unknownInt, out, version );
+	if ( ( info.version >= 0x0A010000 ) && ( info.version <= 0x0A020000 ) ) {
+		NifStream( unknownInt, out, info );
 	};
-	if ( version >= 0x14000004 ) {
+	if ( info.version >= 0x14000004 ) {
 		for (unsigned int i2 = 0; i2 < 54; i2++) {
-			NifStream( unknown54Bytes[i2], out, version );
+			NifStream( unknown54Bytes[i2], out, info );
 		};
 	};
 	if ( palette != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(palette) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(palette) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( numMipmaps, out, version );
-	NifStream( bytesPerPixel, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( numMipmaps, out, info );
+	NifStream( bytesPerPixel, out, info );
 	for (unsigned int i1 = 0; i1 < mipmaps.size(); i1++) {
-		NifStream( mipmaps[i1].width, out, version );
-		NifStream( mipmaps[i1].height, out, version );
-		NifStream( mipmaps[i1].offset, out, version );
+		NifStream( mipmaps[i1].width, out, info );
+		NifStream( mipmaps[i1].height, out, info );
+		NifStream( mipmaps[i1].offset, out, info );
 	};
 	pixelData.dataSize = (unsigned int)(pixelData.data.size());
-	NifStream( pixelData.dataSize, out, version );
+	NifStream( pixelData.dataSize, out, info );
 	for (unsigned int i1 = 0; i1 < pixelData.data.size(); i1++) {
-		NifStream( pixelData.data[i1], out, version );
+		NifStream( pixelData.data[i1], out, info );
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownInt2, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownInt2, out, info );
 	};
 }
 
@@ -8621,9 +8621,9 @@ std::string NiPixelData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPixelData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	palette = FixLink<NiPalette>( objects, link_stack, version );
+void NiPixelData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	palette = FixLink<NiPalette>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPixelData::InternalGetRefs() const {
@@ -8634,56 +8634,56 @@ std::list<NiObjectRef> NiPixelData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( unknownShort, in, version );
-	};
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownFloat2, in, version );
-	if ( ( version >= 0x04020200 ) && ( version <= 0x04020200 ) ) {
-		NifStream( unknownShort2, in, version );
-	};
-	NifStream( unknownFloat3, in, version );
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownFloat5, in, version );
-	NifStream( unknownFloat6, in, version );
-	NifStream( unknownFloat7, in, version );
-	NifStream( unknownFloat8, in, version );
-	NifStream( unknownFloat9, in, version );
-	NifStream( unknownFloat10, in, version );
-	NifStream( unknownFloat11, in, version );
-	NifStream( unknownFloat12, in, version );
-	NifStream( unknownFloat13, in, version );
-	NifStream( unknownFloat14, in, version );
-	NifStream( unknownFloat15, in, version );
-	NifStream( unknownFloat16, in, version );
-}
-
-void NiPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	if ( version >= 0x0A000100 ) {
-		NifStream( unknownShort, out, version );
-	};
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownFloat2, out, version );
-	if ( ( version >= 0x04020200 ) && ( version <= 0x04020200 ) ) {
-		NifStream( unknownShort2, out, version );
-	};
-	NifStream( unknownFloat3, out, version );
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownFloat5, out, version );
-	NifStream( unknownFloat6, out, version );
-	NifStream( unknownFloat7, out, version );
-	NifStream( unknownFloat8, out, version );
-	NifStream( unknownFloat9, out, version );
-	NifStream( unknownFloat10, out, version );
-	NifStream( unknownFloat11, out, version );
-	NifStream( unknownFloat12, out, version );
-	NifStream( unknownFloat13, out, version );
-	NifStream( unknownFloat14, out, version );
-	NifStream( unknownFloat15, out, version );
-	NifStream( unknownFloat16, out, version );
+void NiPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( unknownShort, in, info );
+	};
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownFloat2, in, info );
+	if ( ( info.version >= 0x04020200 ) && ( info.version <= 0x04020200 ) ) {
+		NifStream( unknownShort2, in, info );
+	};
+	NifStream( unknownFloat3, in, info );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownFloat5, in, info );
+	NifStream( unknownFloat6, in, info );
+	NifStream( unknownFloat7, in, info );
+	NifStream( unknownFloat8, in, info );
+	NifStream( unknownFloat9, in, info );
+	NifStream( unknownFloat10, in, info );
+	NifStream( unknownFloat11, in, info );
+	NifStream( unknownFloat12, in, info );
+	NifStream( unknownFloat13, in, info );
+	NifStream( unknownFloat14, in, info );
+	NifStream( unknownFloat15, in, info );
+	NifStream( unknownFloat16, in, info );
+}
+
+void NiPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( unknownShort, out, info );
+	};
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownFloat2, out, info );
+	if ( ( info.version >= 0x04020200 ) && ( info.version <= 0x04020200 ) ) {
+		NifStream( unknownShort2, out, info );
+	};
+	NifStream( unknownFloat3, out, info );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownFloat5, out, info );
+	NifStream( unknownFloat6, out, info );
+	NifStream( unknownFloat7, out, info );
+	NifStream( unknownFloat8, out, info );
+	NifStream( unknownFloat9, out, info );
+	NifStream( unknownFloat10, out, info );
+	NifStream( unknownFloat11, out, info );
+	NifStream( unknownFloat12, out, info );
+	NifStream( unknownFloat13, out, info );
+	NifStream( unknownFloat14, out, info );
+	NifStream( unknownFloat15, out, info );
+	NifStream( unknownFloat16, out, info );
 }
 
 std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
@@ -8711,8 +8711,8 @@ std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPlanarCollider::InternalGetRefs() const {
@@ -8721,21 +8721,21 @@ std::list<NiObjectRef> NiPlanarCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPoint3Interpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( point3Value, in, version );
-	NifStream( block_num, in, version );
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( point3Value, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( point3Value, out, version );
+void NiPoint3Interpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( point3Value, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
@@ -8747,9 +8747,9 @@ std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiPosData>( objects, link_stack, version );
+void NiPoint3Interpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiPosData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPoint3Interpolator::InternalGetRefs() const {
@@ -8760,18 +8760,18 @@ std::list<NiObjectRef> NiPoint3Interpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPointLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::Read( in, link_stack, version, user_version );
-	NifStream( constantAttenuation, in, version );
-	NifStream( linearAttenuation, in, version );
-	NifStream( quadraticAttenuation, in, version );
+void NiPointLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::Read( in, link_stack, info );
+	NifStream( constantAttenuation, in, info );
+	NifStream( linearAttenuation, in, info );
+	NifStream( quadraticAttenuation, in, info );
 }
 
-void NiPointLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLight::Write( out, link_map, version, user_version );
-	NifStream( constantAttenuation, out, version );
-	NifStream( linearAttenuation, out, version );
-	NifStream( quadraticAttenuation, out, version );
+void NiPointLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLight::Write( out, link_map, info );
+	NifStream( constantAttenuation, out, info );
+	NifStream( linearAttenuation, out, info );
+	NifStream( quadraticAttenuation, out, info );
 }
 
 std::string NiPointLight::InternalAsString( bool verbose ) const {
@@ -8784,8 +8784,8 @@ std::string NiPointLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPointLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLight::FixLinks( objects, link_stack, version, user_version );
+void NiPointLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPointLight::InternalGetRefs() const {
@@ -8794,27 +8794,27 @@ std::list<NiObjectRef> NiPointLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPosData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( data.numKeys, in, version );
+void NiPosData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( data.numKeys, in, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, in, version );
+		NifStream( data.interpolation, in, info );
 	};
 	data.keys.resize(data.numKeys);
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], in, version, data.interpolation );
+		NifStream( data.keys[i1], in, info, data.interpolation );
 	};
 }
 
-void NiPosData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiPosData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	data.numKeys = (unsigned int)(data.keys.size());
-	NifStream( data.numKeys, out, version );
+	NifStream( data.numKeys, out, info );
 	if ( (data.numKeys != 0) ) {
-		NifStream( data.interpolation, out, version );
+		NifStream( data.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < data.keys.size(); i1++) {
-		NifStream( data.keys[i1], out, version, data.interpolation );
+		NifStream( data.keys[i1], out, info, data.interpolation );
 	};
 }
 
@@ -8842,8 +8842,8 @@ std::string NiPosData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPosData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiPosData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPosData::InternalGetRefs() const {
@@ -8852,21 +8852,21 @@ std::list<NiObjectRef> NiPosData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysAgeDeathModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysAgeDeathModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( spawnOnDeath, in, version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( spawnOnDeath, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysAgeDeathModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( spawnOnDeath, out, version );
+void NiPSysAgeDeathModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( spawnOnDeath, out, info );
 	if ( spawnModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
@@ -8878,9 +8878,9 @@ std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysAgeDeathModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, version );
+void NiPSysAgeDeathModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysAgeDeathModifier::InternalGetRefs() const {
@@ -8891,36 +8891,36 @@ std::list<NiObjectRef> NiPSysAgeDeathModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBombModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysBombModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts1[i1], in, version );
+		NifStream( unknownInts1[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats[i1], in, version );
+		NifStream( unknownFloats[i1], in, info );
 	};
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts2[i1], in, version );
+		NifStream( unknownInts2[i1], in, info );
 	};
 }
 
-void NiPSysBombModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysBombModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( unknownLink != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts1[i1], out, version );
+		NifStream( unknownInts1[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknownFloats[i1], out, version );
+		NifStream( unknownFloats[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < 2; i1++) {
-		NifStream( unknownInts2[i1], out, version );
+		NifStream( unknownInts2[i1], out, info );
 	};
 }
 
@@ -8968,9 +8968,9 @@ std::string NiPSysBombModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBombModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	unknownLink = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysBombModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	unknownLink = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBombModifier::InternalGetRefs() const {
@@ -8979,14 +8979,14 @@ std::list<NiObjectRef> NiPSysBombModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBoundUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( updateSkip, in, version );
+void NiPSysBoundUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( updateSkip, in, info );
 }
 
-void NiPSysBoundUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( updateSkip, out, version );
+void NiPSysBoundUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( updateSkip, out, info );
 }
 
 std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
@@ -8997,8 +8997,8 @@ std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoundUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBoundUpdateModifier::InternalGetRefs() const {
@@ -9007,18 +9007,18 @@ std::list<NiObjectRef> NiPSysBoundUpdateModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysBoxEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( width, in, version );
-	NifStream( height, in, version );
-	NifStream( depth, in, version );
+void NiPSysBoxEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( width, in, info );
+	NifStream( height, in, info );
+	NifStream( depth, in, info );
 }
 
-void NiPSysBoxEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( width, out, version );
-	NifStream( height, out, version );
-	NifStream( depth, out, version );
+void NiPSysBoxEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( width, out, info );
+	NifStream( height, out, info );
+	NifStream( depth, out, info );
 }
 
 std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
@@ -9031,8 +9031,8 @@ std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysBoxEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysBoxEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysBoxEmitter::InternalGetRefs() const {
@@ -9041,19 +9041,19 @@ std::list<NiObjectRef> NiPSysBoxEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysColliderManager::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColliderManager::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysColliderManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysColliderManager::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( collider != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(collider) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(collider) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
@@ -9064,9 +9064,9 @@ std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColliderManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	collider = FixLink<NiPSysPlanarCollider>( objects, link_stack, version );
+void NiPSysColliderManager::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	collider = FixLink<NiPSysPlanarCollider>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysColliderManager::InternalGetRefs() const {
@@ -9077,19 +9077,19 @@ std::list<NiObjectRef> NiPSysColliderManager::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysColorModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiPSysColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysColorModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
@@ -9100,9 +9100,9 @@ std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiColorData>( objects, link_stack, version );
+void NiPSysColorModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	data = FixLink<NiColorData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysColorModifier::InternalGetRefs() const {
@@ -9113,16 +9113,16 @@ std::list<NiObjectRef> NiPSysColorModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysCylinderEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
-	NifStream( height, in, version );
+void NiPSysCylinderEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( radius, in, info );
+	NifStream( height, in, info );
 }
 
-void NiPSysCylinderEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
-	NifStream( height, out, version );
+void NiPSysCylinderEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( radius, out, info );
+	NifStream( height, out, info );
 }
 
 std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
@@ -9134,8 +9134,8 @@ std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysCylinderEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysCylinderEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysCylinderEmitter::InternalGetRefs() const {
@@ -9144,23 +9144,23 @@ std::list<NiObjectRef> NiPSysCylinderEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A020000 ) {
+void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::Read( in, link_stack, info );
+	if ( info.version <= 0x0A020000 ) {
 		unknownFloats4.resize(numVertices);
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], in, version );
+				NifStream( unknownFloats4[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownBool1, in, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownBool1, in, info );
 		if ( (unknownBool1 != 0) ) {
 			unknownBytes.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytes.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 32; i4++) {
-					NifStream( unknownBytes[i3][i4], in, version );
+					NifStream( unknownBytes[i3][i4], in, info );
 				};
 			};
 		};
@@ -9168,60 +9168,60 @@ void NiPSysData::InternalRead( istream& in, list<unsigned int> & link_stack, uns
 			unknownBytesAlt.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytesAlt.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 28; i4++) {
-					NifStream( unknownBytesAlt[i3][i4], in, version );
+					NifStream( unknownBytesAlt[i3][i4], in, info );
 				};
 			};
 		};
-		NifStream( unknownByte3, in, version );
-		NifStream( unknownBool2, in, version );
+		NifStream( unknownByte3, in, info );
+		NifStream( unknownBool2, in, info );
 		if ( (unknownBool2 != 0) ) {
 			unknownBytes2.resize(numVertices);
 			for (unsigned int i3 = 0; i3 < unknownBytes2.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 4; i4++) {
-					NifStream( unknownBytes2[i3][i4], in, version );
+					NifStream( unknownBytes2[i3][i4], in, info );
 				};
 			};
 		};
 	};
-	NifStream( unknownInt1, in, version );
+	NifStream( unknownInt1, in, info );
 }
 
-void NiPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysData::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A020000 ) {
+void NiPSysData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysData::Write( out, link_map, info );
+	if ( info.version <= 0x0A020000 ) {
 		for (unsigned int i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < 10; i3++) {
-				NifStream( unknownFloats4[i2][i3], out, version );
+				NifStream( unknownFloats4[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x14000004 ) {
-		NifStream( unknownBool1, out, version );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( unknownBool1, out, info );
 		if ( (unknownBool1 != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytes.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 32; i4++) {
-					NifStream( unknownBytes[i3][i4], out, version );
+					NifStream( unknownBytes[i3][i4], out, info );
 				};
 			};
 		};
 		if ( (unknownBool1 == 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytesAlt.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 28; i4++) {
-					NifStream( unknownBytesAlt[i3][i4], out, version );
+					NifStream( unknownBytesAlt[i3][i4], out, info );
 				};
 			};
 		};
-		NifStream( unknownByte3, out, version );
-		NifStream( unknownBool2, out, version );
+		NifStream( unknownByte3, out, info );
+		NifStream( unknownBool2, out, info );
 		if ( (unknownBool2 != 0) ) {
 			for (unsigned int i3 = 0; i3 < unknownBytes2.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < 4; i4++) {
-					NifStream( unknownBytes2[i3][i4], out, version );
+					NifStream( unknownBytes2[i3][i4], out, info );
 				};
 			};
 		};
 	};
-	NifStream( unknownInt1, out, version );
+	NifStream( unknownInt1, out, info );
 }
 
 std::string NiPSysData::InternalAsString( bool verbose ) const {
@@ -9297,8 +9297,8 @@ std::string NiPSysData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysData::FixLinks( objects, link_stack, version, user_version );
+void NiPSysData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysData::InternalGetRefs() const {
@@ -9307,27 +9307,27 @@ std::list<NiObjectRef> NiPSysData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysDragModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysDragModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( dragAxis, in, version );
-	NifStream( percentage, in, version );
-	NifStream( range, in, version );
-	NifStream( rangeFalloff, in, version );
+	NifStream( dragAxis, in, info );
+	NifStream( percentage, in, info );
+	NifStream( range, in, info );
+	NifStream( rangeFalloff, in, info );
 }
 
-void NiPSysDragModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysDragModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( dragAxis, out, version );
-	NifStream( percentage, out, version );
-	NifStream( range, out, version );
-	NifStream( rangeFalloff, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( dragAxis, out, info );
+	NifStream( percentage, out, info );
+	NifStream( range, out, info );
+	NifStream( rangeFalloff, out, info );
 }
 
 std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
@@ -9342,9 +9342,9 @@ std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysDragModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	parent = FixLink<NiObject>( objects, link_stack, version );
+void NiPSysDragModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	parent = FixLink<NiObject>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysDragModifier::InternalGetRefs() const {
@@ -9353,32 +9353,32 @@ std::list<NiObjectRef> NiPSysDragModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x0A020000 ) {
+	if ( info.version >= 0x0A020000 ) {
 		if ( visibilityInterpolator != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9391,13 +9391,13 @@ std::string NiPSysEmitterCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, version );
+void NiPSysEmitterCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiPSysEmitterCtlrData>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A020000 ) {
-		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, version );
+	if ( info.version >= 0x0A020000 ) {
+		visibilityInterpolator = FixLink<NiInterpolator>( objects, link_stack, info );
 	};
 }
 
@@ -9411,37 +9411,37 @@ std::list<NiObjectRef> NiPSysEmitterCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterCtlrData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( floatKeys_.numKeys, in, version );
+void NiPSysEmitterCtlrData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( floatKeys_.numKeys, in, info );
 	if ( (floatKeys_.numKeys != 0) ) {
-		NifStream( floatKeys_.interpolation, in, version );
+		NifStream( floatKeys_.interpolation, in, info );
 	};
 	floatKeys_.keys.resize(floatKeys_.numKeys);
 	for (unsigned int i1 = 0; i1 < floatKeys_.keys.size(); i1++) {
-		NifStream( floatKeys_.keys[i1], in, version, floatKeys_.interpolation );
+		NifStream( floatKeys_.keys[i1], in, info, floatKeys_.interpolation );
 	};
-	NifStream( numVisibilityKeys_, in, version );
+	NifStream( numVisibilityKeys_, in, info );
 	visibilityKeys_.resize(numVisibilityKeys_);
 	for (unsigned int i1 = 0; i1 < visibilityKeys_.size(); i1++) {
-		NifStream( visibilityKeys_[i1], in, version, 1 );
+		NifStream( visibilityKeys_[i1], in, info, 1 );
 	};
 }
 
-void NiPSysEmitterCtlrData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiPSysEmitterCtlrData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numVisibilityKeys_ = (unsigned int)(visibilityKeys_.size());
 	floatKeys_.numKeys = (unsigned int)(floatKeys_.keys.size());
-	NifStream( floatKeys_.numKeys, out, version );
+	NifStream( floatKeys_.numKeys, out, info );
 	if ( (floatKeys_.numKeys != 0) ) {
-		NifStream( floatKeys_.interpolation, out, version );
+		NifStream( floatKeys_.interpolation, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < floatKeys_.keys.size(); i1++) {
-		NifStream( floatKeys_.keys[i1], out, version, floatKeys_.interpolation );
+		NifStream( floatKeys_.keys[i1], out, info, floatKeys_.interpolation );
 	};
-	NifStream( numVisibilityKeys_, out, version );
+	NifStream( numVisibilityKeys_, out, info );
 	for (unsigned int i1 = 0; i1 < visibilityKeys_.size(); i1++) {
-		NifStream( visibilityKeys_[i1], out, version, 1 );
+		NifStream( visibilityKeys_[i1], out, info, 1 );
 	};
 }
 
@@ -9483,8 +9483,8 @@ std::string NiPSysEmitterCtlrData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterCtlrData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterCtlrData::InternalGetRefs() const {
@@ -9493,12 +9493,12 @@ std::list<NiObjectRef> NiPSysEmitterCtlrData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const {
@@ -9508,8 +9508,8 @@ std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterDeclinationCtlr::InternalGetRefs() const {
@@ -9518,12 +9518,12 @@ std::list<NiObjectRef> NiPSysEmitterDeclinationCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) const {
@@ -9533,8 +9533,8 @@ std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) co
 	return out.str();
 }
 
-void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::InternalGetRefs() const {
@@ -9543,12 +9543,12 @@ std::list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::InternalGetRefs() const
 	return refs;
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
 }
 
 std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) const {
@@ -9558,8 +9558,8 @@ std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) con
 	return out.str();
 }
 
-void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::InternalGetRefs() const {
@@ -9568,22 +9568,22 @@ std::list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterLifeSpanCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterLifeSpanCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9595,10 +9595,10 @@ std::string NiPSysEmitterLifeSpanCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9610,22 +9610,22 @@ std::list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysEmitterSpeedCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysEmitterSpeedCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9637,10 +9637,10 @@ std::string NiPSysEmitterSpeedCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysEmitterSpeedCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9652,31 +9652,31 @@ std::list<NiObjectRef> NiPSysEmitterSpeedCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGravityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( gravityAxis, in, version );
-	NifStream( decay, in, version );
-	NifStream( strength, in, version );
-	NifStream( forceType, in, version );
-	NifStream( turbulence, in, version );
-	NifStream( turbulenceScale, in, version );
+	NifStream( gravityAxis, in, info );
+	NifStream( decay, in, info );
+	NifStream( strength, in, info );
+	NifStream( forceType, in, info );
+	NifStream( turbulence, in, info );
+	NifStream( turbulenceScale, in, info );
 }
 
-void NiPSysGravityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysGravityModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	if ( gravityObject != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(gravityObject) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(gravityObject) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( gravityAxis, out, version );
-	NifStream( decay, out, version );
-	NifStream( strength, out, version );
-	NifStream( forceType, out, version );
-	NifStream( turbulence, out, version );
-	NifStream( turbulenceScale, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( gravityAxis, out, info );
+	NifStream( decay, out, info );
+	NifStream( strength, out, info );
+	NifStream( forceType, out, info );
+	NifStream( turbulence, out, info );
+	NifStream( turbulenceScale, out, info );
 }
 
 std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
@@ -9693,9 +9693,9 @@ std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
-	gravityObject = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysGravityModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
+	gravityObject = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const {
@@ -9704,22 +9704,22 @@ std::list<NiObjectRef> NiPSysGravityModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGravityStrengthCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysGravityStrengthCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( unknownLink != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9731,10 +9731,10 @@ std::string NiPSysGravityStrengthCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+void NiPSysGravityStrengthCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -9746,20 +9746,20 @@ std::list<NiObjectRef> NiPSysGravityStrengthCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysGrowFadeModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( growTime, in, version );
-	NifStream( growGeneration, in, version );
-	NifStream( fadeTime, in, version );
-	NifStream( fadeGeneration, in, version );
+void NiPSysGrowFadeModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( growTime, in, info );
+	NifStream( growGeneration, in, info );
+	NifStream( fadeTime, in, info );
+	NifStream( fadeGeneration, in, info );
 }
 
-void NiPSysGrowFadeModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( growTime, out, version );
-	NifStream( growGeneration, out, version );
-	NifStream( fadeTime, out, version );
-	NifStream( fadeGeneration, out, version );
+void NiPSysGrowFadeModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( growTime, out, info );
+	NifStream( growGeneration, out, info );
+	NifStream( fadeTime, out, info );
+	NifStream( fadeGeneration, out, info );
 }
 
 std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
@@ -9773,8 +9773,8 @@ std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysGrowFadeModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysGrowFadeModifier::InternalGetRefs() const {
@@ -9783,33 +9783,33 @@ std::list<NiObjectRef> NiPSysGrowFadeModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysMeshEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysEmitter::Read( in, link_stack, version, user_version );
-	NifStream( numEmitterMeshes, in, version );
+	NiPSysEmitter::Read( in, link_stack, info );
+	NifStream( numEmitterMeshes, in, info );
 	emitterMeshes.resize(numEmitterMeshes);
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( initialVelocityType, in, version );
-	NifStream( emissionType, in, version );
-	NifStream( emissionAxis, in, version );
+	NifStream( initialVelocityType, in, info );
+	NifStream( emissionType, in, info );
+	NifStream( emissionAxis, in, info );
 }
 
-void NiPSysMeshEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysEmitter::Write( out, link_map, version, user_version );
+void NiPSysMeshEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysEmitter::Write( out, link_map, info );
 	numEmitterMeshes = (unsigned int)(emitterMeshes.size());
-	NifStream( numEmitterMeshes, out, version );
+	NifStream( numEmitterMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
 		if ( emitterMeshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(emitterMeshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(emitterMeshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( initialVelocityType, out, version );
-	NifStream( emissionType, out, version );
-	NifStream( emissionAxis, out, version );
+	NifStream( initialVelocityType, out, info );
+	NifStream( emissionType, out, info );
+	NifStream( emissionAxis, out, info );
 }
 
 std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
@@ -9836,10 +9836,10 @@ std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysEmitter::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		emitterMeshes[i1] = FixLink<NiTriBasedGeom>( objects, link_stack, version );
+		emitterMeshes[i1] = FixLink<NiTriBasedGeom>( objects, link_stack, info );
 	};
 }
 
@@ -9853,26 +9853,26 @@ std::list<NiObjectRef> NiPSysMeshEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysMeshUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysMeshUpdateModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( numMeshes, in, version );
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( numMeshes, in, info );
 	meshes.resize(numMeshes);
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiPSysMeshUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysMeshUpdateModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 	numMeshes = (unsigned int)(meshes.size());
-	NifStream( numMeshes, out, version );
+	NifStream( numMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
 		if ( meshes[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(meshes[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(meshes[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -9897,10 +9897,10 @@ std::string NiPSysMeshUpdateModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysMeshUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
-		meshes[i1] = FixLink<NiNode>( objects, link_stack, version );
+		meshes[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -9914,17 +9914,17 @@ std::list<NiObjectRef> NiPSysMeshUpdateModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysModifierActiveCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt, in, version );
+void NiPSysModifierActiveCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt, in, info );
 	};
 }
 
-void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	APSysCtlr::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( unknownInt, out, version );
+void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	APSysCtlr::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( unknownInt, out, info );
 	};
 }
 
@@ -9936,8 +9936,8 @@ std::string NiPSysModifierActiveCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysModifierActiveCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	APSysCtlr::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysModifierActiveCtlr::InternalGetRefs() const {
@@ -9946,51 +9946,51 @@ std::list<NiObjectRef> NiPSysModifierActiveCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiPSysPlanarCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( bounce, in, version );
-	NifStream( spawnOnCollide, in, version );
-	NifStream( dieOnCollide, in, version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( bounce, in, info );
+	NifStream( spawnOnCollide, in, info );
+	NifStream( dieOnCollide, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( width, in, version );
-	NifStream( height, in, version );
-	NifStream( xAxis, in, version );
-	NifStream( yAxis, in, version );
+	NifStream( width, in, info );
+	NifStream( height, in, info );
+	NifStream( xAxis, in, info );
+	NifStream( yAxis, in, info );
 }
 
-void NiPSysPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( bounce, out, version );
-	NifStream( spawnOnCollide, out, version );
-	NifStream( dieOnCollide, out, version );
+void NiPSysPlanarCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( bounce, out, info );
+	NifStream( spawnOnCollide, out, info );
+	NifStream( dieOnCollide, out, info );
 	if ( spawnModifier != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( parent != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( unknownLink_ != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(unknownLink_) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 	if ( colliderObject != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(colliderObject) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(colliderObject) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( width, out, version );
-	NifStream( height, out, version );
-	NifStream( xAxis, out, version );
-	NifStream( yAxis, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( width, out, info );
+	NifStream( height, out, info );
+	NifStream( xAxis, out, info );
+	NifStream( yAxis, out, info );
 }
 
 std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
@@ -10011,12 +10011,12 @@ std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, version );
-	parent = FixLink<NiObject>( objects, link_stack, version );
-	unknownLink_ = FixLink<NiObject>( objects, link_stack, version );
-	colliderObject = FixLink<NiNode>( objects, link_stack, version );
+void NiPSysPlanarCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	spawnModifier = FixLink<NiPSysSpawnModifier>( objects, link_stack, info );
+	parent = FixLink<NiObject>( objects, link_stack, info );
+	unknownLink_ = FixLink<NiObject>( objects, link_stack, info );
+	colliderObject = FixLink<NiNode>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysPlanarCollider::InternalGetRefs() const {
@@ -10031,12 +10031,12 @@ std::list<NiObjectRef> NiPSysPlanarCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysPositionModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
+void NiPSysPositionModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
 }
 
-void NiPSysPositionModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
+void NiPSysPositionModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
 }
 
 std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
@@ -10046,8 +10046,8 @@ std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysPositionModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysPositionModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysPositionModifier::InternalGetRefs() const {
@@ -10056,12 +10056,12 @@ std::list<NiObjectRef> NiPSysPositionModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysResetOnLoopCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
 }
 
-void NiPSysResetOnLoopCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 }
 
 std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
@@ -10071,8 +10071,8 @@ std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysResetOnLoopCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysResetOnLoopCtlr::InternalGetRefs() const {
@@ -10081,30 +10081,30 @@ std::list<NiObjectRef> NiPSysResetOnLoopCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysRotationModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( initialRotationSpeed, in, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( initialRotationSpeedVariation, in, version );
-		NifStream( initialRotationAngle, in, version );
-		NifStream( initialRotationAngleVariation, in, version );
-		NifStream( randomRotSpeedSign, in, version );
+void NiPSysRotationModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( initialRotationSpeed, in, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( initialRotationSpeedVariation, in, info );
+		NifStream( initialRotationAngle, in, info );
+		NifStream( initialRotationAngleVariation, in, info );
+		NifStream( randomRotSpeedSign, in, info );
 	};
-	NifStream( randomInitialAxis, in, version );
-	NifStream( initialAxis, in, version );
+	NifStream( randomInitialAxis, in, info );
+	NifStream( initialAxis, in, info );
 }
 
-void NiPSysRotationModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( initialRotationSpeed, out, version );
-	if ( version >= 0x14000004 ) {
-		NifStream( initialRotationSpeedVariation, out, version );
-		NifStream( initialRotationAngle, out, version );
-		NifStream( initialRotationAngleVariation, out, version );
-		NifStream( randomRotSpeedSign, out, version );
+void NiPSysRotationModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( initialRotationSpeed, out, info );
+	if ( info.version >= 0x14000004 ) {
+		NifStream( initialRotationSpeedVariation, out, info );
+		NifStream( initialRotationAngle, out, info );
+		NifStream( initialRotationAngleVariation, out, info );
+		NifStream( randomRotSpeedSign, out, info );
 	};
-	NifStream( randomInitialAxis, out, version );
-	NifStream( initialAxis, out, version );
+	NifStream( randomInitialAxis, out, info );
+	NifStream( initialAxis, out, info );
 }
 
 std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
@@ -10121,8 +10121,8 @@ std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysRotationModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysRotationModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysRotationModifier::InternalGetRefs() const {
@@ -10131,28 +10131,28 @@ std::list<NiObjectRef> NiPSysRotationModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysSpawnModifier::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::Read( in, link_stack, version, user_version );
-	NifStream( numSpawnGenerations, in, version );
-	NifStream( percentageSpawned, in, version );
-	NifStream( minNumToSpawn, in, version );
-	NifStream( maxNumToSpawn, in, version );
-	NifStream( spawnSpeedChaos, in, version );
-	NifStream( spawnDirChaos, in, version );
-	NifStream( lifeSpan, in, version );
-	NifStream( lifeSpanVariation, in, version );
+void NiPSysSpawnModifier::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::Read( in, link_stack, info );
+	NifStream( numSpawnGenerations, in, info );
+	NifStream( percentageSpawned, in, info );
+	NifStream( minNumToSpawn, in, info );
+	NifStream( maxNumToSpawn, in, info );
+	NifStream( spawnSpeedChaos, in, info );
+	NifStream( spawnDirChaos, in, info );
+	NifStream( lifeSpan, in, info );
+	NifStream( lifeSpanVariation, in, info );
 }
 
-void NiPSysSpawnModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysModifier::Write( out, link_map, version, user_version );
-	NifStream( numSpawnGenerations, out, version );
-	NifStream( percentageSpawned, out, version );
-	NifStream( minNumToSpawn, out, version );
-	NifStream( maxNumToSpawn, out, version );
-	NifStream( spawnSpeedChaos, out, version );
-	NifStream( spawnDirChaos, out, version );
-	NifStream( lifeSpan, out, version );
-	NifStream( lifeSpanVariation, out, version );
+void NiPSysSpawnModifier::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysModifier::Write( out, link_map, info );
+	NifStream( numSpawnGenerations, out, info );
+	NifStream( percentageSpawned, out, info );
+	NifStream( minNumToSpawn, out, info );
+	NifStream( maxNumToSpawn, out, info );
+	NifStream( spawnSpeedChaos, out, info );
+	NifStream( spawnDirChaos, out, info );
+	NifStream( lifeSpan, out, info );
+	NifStream( lifeSpanVariation, out, info );
 }
 
 std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
@@ -10170,8 +10170,8 @@ std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSpawnModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysModifier::FixLinks( objects, link_stack, version, user_version );
+void NiPSysSpawnModifier::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysSpawnModifier::InternalGetRefs() const {
@@ -10180,14 +10180,14 @@ std::list<NiObjectRef> NiPSysSpawnModifier::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysSphereEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::Read( in, link_stack, version, user_version );
-	NifStream( radius, in, version );
+void NiPSysSphereEmitter::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::Read( in, link_stack, info );
+	NifStream( radius, in, info );
 }
 
-void NiPSysSphereEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPSysVolumeEmitter::Write( out, link_map, version, user_version );
-	NifStream( radius, out, version );
+void NiPSysSphereEmitter::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPSysVolumeEmitter::Write( out, link_map, info );
+	NifStream( radius, out, info );
 }
 
 std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
@@ -10198,8 +10198,8 @@ std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysSphereEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPSysVolumeEmitter::FixLinks( objects, link_stack, version, user_version );
+void NiPSysSphereEmitter::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPSysVolumeEmitter::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysSphereEmitter::InternalGetRefs() const {
@@ -10208,12 +10208,12 @@ std::list<NiObjectRef> NiPSysSphereEmitter::InternalGetRefs() const {
 	return refs;
 }
 
-void NiPSysUpdateCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::Read( in, link_stack, version, user_version );
+void NiPSysUpdateCtlr::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::Read( in, link_stack, info );
 }
 
-void NiPSysUpdateCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
+void NiPSysUpdateCtlr::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
 }
 
 std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
@@ -10223,8 +10223,8 @@ std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiPSysUpdateCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
+void NiPSysUpdateCtlr::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiPSysUpdateCtlr::InternalGetRefs() const {
@@ -10233,12 +10233,12 @@ std::list<NiObjectRef> NiPSysUpdateCtlr::InternalGetRefs() const {
 	return refs;
 }
 
-void NiLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 }
 
-void NiLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 }
 
 std::string NiLODData::InternalAsString( bool verbose ) const {
@@ -10248,8 +10248,8 @@ std::string NiLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiLODData::InternalGetRefs() const {
@@ -10258,25 +10258,25 @@ std::list<NiObjectRef> NiLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRangeLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::Read( in, link_stack, version, user_version );
-	NifStream( lodCenter, in, version );
-	NifStream( numLodLevels, in, version );
+void NiRangeLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::Read( in, link_stack, info );
+	NifStream( lodCenter, in, info );
+	NifStream( numLodLevels, in, info );
 	lodLevels.resize(numLodLevels);
 	for (unsigned int i1 = 0; i1 < lodLevels.size(); i1++) {
-		NifStream( lodLevels[i1].nearExtent, in, version );
-		NifStream( lodLevels[i1].farExtent, in, version );
+		NifStream( lodLevels[i1].nearExtent, in, info );
+		NifStream( lodLevels[i1].farExtent, in, info );
 	};
 }
 
-void NiRangeLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLODData::Write( out, link_map, version, user_version );
+void NiRangeLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLODData::Write( out, link_map, info );
 	numLodLevels = (unsigned int)(lodLevels.size());
-	NifStream( lodCenter, out, version );
-	NifStream( numLodLevels, out, version );
+	NifStream( lodCenter, out, info );
+	NifStream( numLodLevels, out, info );
 	for (unsigned int i1 = 0; i1 < lodLevels.size(); i1++) {
-		NifStream( lodLevels[i1].nearExtent, out, version );
-		NifStream( lodLevels[i1].farExtent, out, version );
+		NifStream( lodLevels[i1].nearExtent, out, info );
+		NifStream( lodLevels[i1].farExtent, out, info );
 	};
 }
 
@@ -10299,8 +10299,8 @@ std::string NiRangeLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRangeLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::FixLinks( objects, link_stack, version, user_version );
+void NiRangeLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRangeLODData::InternalGetRefs() const {
@@ -10309,29 +10309,29 @@ std::list<NiObjectRef> NiRangeLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiScreenLODData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::Read( in, link_stack, version, user_version );
-	NifStream( boundCenter, in, version );
-	NifStream( boundRadius, in, version );
-	NifStream( worldCenter, in, version );
-	NifStream( worldRadius, in, version );
-	NifStream( proportionCount, in, version );
+void NiScreenLODData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::Read( in, link_stack, info );
+	NifStream( boundCenter, in, info );
+	NifStream( boundRadius, in, info );
+	NifStream( worldCenter, in, info );
+	NifStream( worldRadius, in, info );
+	NifStream( proportionCount, in, info );
 	proportionLevels.resize(proportionCount);
 	for (unsigned int i1 = 0; i1 < proportionLevels.size(); i1++) {
-		NifStream( proportionLevels[i1], in, version );
+		NifStream( proportionLevels[i1], in, info );
 	};
 }
 
-void NiScreenLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiLODData::Write( out, link_map, version, user_version );
+void NiScreenLODData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiLODData::Write( out, link_map, info );
 	proportionCount = (unsigned int)(proportionLevels.size());
-	NifStream( boundCenter, out, version );
-	NifStream( boundRadius, out, version );
-	NifStream( worldCenter, out, version );
-	NifStream( worldRadius, out, version );
-	NifStream( proportionCount, out, version );
+	NifStream( boundCenter, out, info );
+	NifStream( boundRadius, out, info );
+	NifStream( worldCenter, out, info );
+	NifStream( worldRadius, out, info );
+	NifStream( proportionCount, out, info );
 	for (unsigned int i1 = 0; i1 < proportionLevels.size(); i1++) {
-		NifStream( proportionLevels[i1], out, version );
+		NifStream( proportionLevels[i1], out, info );
 	};
 }
 
@@ -10360,8 +10360,8 @@ std::string NiScreenLODData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiScreenLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiLODData::FixLinks( objects, link_stack, version, user_version );
+void NiScreenLODData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiLODData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiScreenLODData::InternalGetRefs() const {
@@ -10370,12 +10370,12 @@ std::list<NiObjectRef> NiScreenLODData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRotatingParticles::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::Read( in, link_stack, version, user_version );
+void NiRotatingParticles::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::Read( in, link_stack, info );
 }
 
-void NiRotatingParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticles::Write( out, link_map, version, user_version );
+void NiRotatingParticles::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticles::Write( out, link_map, info );
 }
 
 std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
@@ -10385,8 +10385,8 @@ std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticles::FixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticles::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticles::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRotatingParticles::InternalGetRefs() const {
@@ -10395,12 +10395,12 @@ std::list<NiObjectRef> NiRotatingParticles::InternalGetRefs() const {
 	return refs;
 }
 
-void NiRotatingParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::Read( in, link_stack, version, user_version );
+void NiRotatingParticlesData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::Read( in, link_stack, info );
 }
 
-void NiRotatingParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiParticlesData::Write( out, link_map, version, user_version );
+void NiRotatingParticlesData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiParticlesData::Write( out, link_map, info );
 }
 
 std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
@@ -10410,8 +10410,8 @@ std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiRotatingParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiParticlesData::FixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticlesData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiParticlesData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiRotatingParticlesData::InternalGetRefs() const {
@@ -10420,12 +10420,12 @@ std::list<NiObjectRef> NiRotatingParticlesData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSequenceStreamHelper::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::Read( in, link_stack, version, user_version );
+void NiSequenceStreamHelper::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::Read( in, link_stack, info );
 }
 
-void NiSequenceStreamHelper::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
+void NiSequenceStreamHelper::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
 }
 
 std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
@@ -10435,8 +10435,8 @@ std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSequenceStreamHelper::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
+void NiSequenceStreamHelper::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSequenceStreamHelper::InternalGetRefs() const {
@@ -10445,14 +10445,14 @@ std::list<NiObjectRef> NiSequenceStreamHelper::InternalGetRefs() const {
 	return refs;
 }
 
-void NiShadeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiShadeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiShadeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiShadeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiShadeProperty::InternalAsString( bool verbose ) const {
@@ -10463,8 +10463,8 @@ std::string NiShadeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiShadeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiShadeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiShadeProperty::InternalGetRefs() const {
@@ -10473,63 +10473,63 @@ std::list<NiObjectRef> NiShadeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( rotation, in, version );
-	NifStream( translation, in, version );
-	NifStream( scale, in, version );
-	NifStream( numBones, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( rotation, in, info );
+	NifStream( translation, in, info );
+	NifStream( scale, in, info );
+	NifStream( numBones, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownByte, in, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownByte, in, info );
 	};
 	boneList.resize(numBones);
 	for (unsigned int i1 = 0; i1 < boneList.size(); i1++) {
-		NifStream( boneList[i1].rotation, in, version );
-		NifStream( boneList[i1].translation, in, version );
-		NifStream( boneList[i1].scale, in, version );
-		NifStream( boneList[i1].boundingSphereOffset, in, version );
-		NifStream( boneList[i1].boundingSphereRadius, in, version );
-		NifStream( boneList[i1].numVertices, in, version );
+		NifStream( boneList[i1].rotation, in, info );
+		NifStream( boneList[i1].translation, in, info );
+		NifStream( boneList[i1].scale, in, info );
+		NifStream( boneList[i1].boundingSphereOffset, in, info );
+		NifStream( boneList[i1].boundingSphereRadius, in, info );
+		NifStream( boneList[i1].numVertices, in, info );
 		boneList[i1].vertexWeights.resize(boneList[i1].numVertices);
 		for (unsigned int i2 = 0; i2 < boneList[i1].vertexWeights.size(); i2++) {
-			NifStream( boneList[i1].vertexWeights[i2].index, in, version );
-			NifStream( boneList[i1].vertexWeights[i2].weight, in, version );
+			NifStream( boneList[i1].vertexWeights[i2].index, in, info );
+			NifStream( boneList[i1].vertexWeights[i2].weight, in, info );
 		};
 	};
 }
 
-void NiSkinData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numBones = (unsigned int)(boneList.size());
-	NifStream( rotation, out, version );
-	NifStream( translation, out, version );
-	NifStream( scale, out, version );
-	NifStream( numBones, out, version );
-	if ( version <= 0x0A010000 ) {
+	NifStream( rotation, out, info );
+	NifStream( translation, out, info );
+	NifStream( scale, out, info );
+	NifStream( numBones, out, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( skinPartition != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownByte, out, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownByte, out, info );
 	};
 	for (unsigned int i1 = 0; i1 < boneList.size(); i1++) {
 		boneList[i1].numVertices = (unsigned short)(boneList[i1].vertexWeights.size());
-		NifStream( boneList[i1].rotation, out, version );
-		NifStream( boneList[i1].translation, out, version );
-		NifStream( boneList[i1].scale, out, version );
-		NifStream( boneList[i1].boundingSphereOffset, out, version );
-		NifStream( boneList[i1].boundingSphereRadius, out, version );
-		NifStream( boneList[i1].numVertices, out, version );
+		NifStream( boneList[i1].rotation, out, info );
+		NifStream( boneList[i1].translation, out, info );
+		NifStream( boneList[i1].scale, out, info );
+		NifStream( boneList[i1].boundingSphereOffset, out, info );
+		NifStream( boneList[i1].boundingSphereRadius, out, info );
+		NifStream( boneList[i1].numVertices, out, info );
 		for (unsigned int i2 = 0; i2 < boneList[i1].vertexWeights.size(); i2++) {
-			NifStream( boneList[i1].vertexWeights[i2].index, out, version );
-			NifStream( boneList[i1].vertexWeights[i2].weight, out, version );
+			NifStream( boneList[i1].vertexWeights[i2].index, out, info );
+			NifStream( boneList[i1].vertexWeights[i2].weight, out, info );
 		};
 	};
 }
@@ -10571,10 +10571,10 @@ std::string NiSkinData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
+void NiSkinData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, info );
 	};
 }
 
@@ -10586,48 +10586,48 @@ std::list<NiObjectRef> NiSkinData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
+	NiObject::Read( in, link_stack, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	if ( version >= 0x0A020000 ) {
-		NifStream( block_num, in, version );
+	if ( info.version >= 0x0A020000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( numBones, in, version );
+	NifStream( numBones, in, info );
 	bones.resize(numBones);
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numBones = (unsigned int)(bones.size());
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	if ( version >= 0x0A020000 ) {
+		NifStream( 0xffffffff, out, info );
+	if ( info.version >= 0x0A020000 ) {
 		if ( skinPartition != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 	if ( skeletonRoot != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(skeletonRoot) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(skeletonRoot) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( numBones, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( numBones, out, info );
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
 		if ( bones[i1] != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -10655,15 +10655,15 @@ std::string NiSkinInstance::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiSkinData>( objects, link_stack, version );
-	if ( version >= 0x0A020000 ) {
-		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, version );
+void NiSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
+	data = FixLink<NiSkinData>( objects, link_stack, info );
+	if ( info.version >= 0x0A020000 ) {
+		skinPartition = FixLink<NiSkinPartition>( objects, link_stack, info );
 	};
-	skeletonRoot = FixLink<NiNode>( objects, link_stack, version );
+	skeletonRoot = FixLink<NiNode>( objects, link_stack, info );
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
-		bones[i1] = FixLink<NiNode>( objects, link_stack, version );
+		bones[i1] = FixLink<NiNode>( objects, link_stack, info );
 	};
 }
 
@@ -10679,12 +10679,12 @@ std::list<NiObjectRef> NiSkinInstance::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClodSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSkinInstance::Read( in, link_stack, version, user_version );
+void NiClodSkinInstance::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSkinInstance::Read( in, link_stack, info );
 }
 
-void NiClodSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSkinInstance::Write( out, link_map, version, user_version );
+void NiClodSkinInstance::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSkinInstance::Write( out, link_map, info );
 }
 
 std::string NiClodSkinInstance::InternalAsString( bool verbose ) const {
@@ -10694,8 +10694,8 @@ std::string NiClodSkinInstance::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClodSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSkinInstance::FixLinks( objects, link_stack, version, user_version );
+void NiClodSkinInstance::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSkinInstance::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClodSkinInstance::InternalGetRefs() const {
@@ -10704,81 +10704,81 @@ std::list<NiObjectRef> NiClodSkinInstance::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( numSkinPartitionBlocks, in, version );
+void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( numSkinPartitionBlocks, in, info );
 	skinPartitionBlocks.resize(numSkinPartitionBlocks);
 	for (unsigned int i1 = 0; i1 < skinPartitionBlocks.size(); i1++) {
-		NifStream( skinPartitionBlocks[i1].numVertices, in, version );
-		NifStream( skinPartitionBlocks[i1].numTriangles, in, version );
-		NifStream( skinPartitionBlocks[i1].numBones, in, version );
-		NifStream( skinPartitionBlocks[i1].numStrips, in, version );
-		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, in, version );
+		NifStream( skinPartitionBlocks[i1].numVertices, in, info );
+		NifStream( skinPartitionBlocks[i1].numTriangles, in, info );
+		NifStream( skinPartitionBlocks[i1].numBones, in, info );
+		NifStream( skinPartitionBlocks[i1].numStrips, in, info );
+		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, in, info );
 		skinPartitionBlocks[i1].bones.resize(skinPartitionBlocks[i1].numBones);
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].bones.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].bones[i2], in, version );
+			NifStream( skinPartitionBlocks[i1].bones[i2], in, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasVertexMap, in, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasVertexMap, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].vertexMap.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexMap.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].vertexMap[i3], in, version );
+				NifStream( skinPartitionBlocks[i1].vertexMap[i3], in, info );
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexMap != 0) ) {
 				skinPartitionBlocks[i1].vertexMap.resize(skinPartitionBlocks[i1].numVertices);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexMap.size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexMap[i4], in, version );
+					NifStream( skinPartitionBlocks[i1].vertexMap[i4], in, info );
 				};
 			};
-			NifStream( skinPartitionBlocks[i1].hasVertexWeights, in, version );
+			NifStream( skinPartitionBlocks[i1].hasVertexWeights, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].vertexWeights.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexWeights.size(); i3++) {
 				skinPartitionBlocks[i1].vertexWeights[i3].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], in, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexWeights != 0) ) {
 				skinPartitionBlocks[i1].vertexWeights.resize(skinPartitionBlocks[i1].numVertices);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights.size(); i4++) {
 					skinPartitionBlocks[i1].vertexWeights[i4].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].vertexWeights[i4].size(); i5++) {
-						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], in, version );
+						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], in, info );
 					};
 				};
 			};
 		};
 		skinPartitionBlocks[i1].stripLengths.resize(skinPartitionBlocks[i1].numStrips);
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].stripLengths.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].stripLengths[i2], in, version );
+			NifStream( skinPartitionBlocks[i1].stripLengths[i2], in, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasStrips, in, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasStrips, in, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			skinPartitionBlocks[i1].strips.resize(skinPartitionBlocks[i1].numStrips);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].strips.size(); i3++) {
 				skinPartitionBlocks[i1].strips[i3].resize(skinPartitionBlocks[i1].stripLengths[i3]);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].stripLengths[i3]; i4++) {
-					NifStream( skinPartitionBlocks[i1].strips[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].strips[i3][i4], in, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasStrips != 0) ) {
 				skinPartitionBlocks[i1].strips.resize(skinPartitionBlocks[i1].numStrips);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].strips.size(); i4++) {
 					skinPartitionBlocks[i1].strips[i4].resize(skinPartitionBlocks[i1].stripLengths[i4]);
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].stripLengths[i4]; i5++) {
-						NifStream( skinPartitionBlocks[i1].strips[i4][i5], in, version );
+						NifStream( skinPartitionBlocks[i1].strips[i4][i5], in, info );
 					};
 				};
 			};
@@ -10786,26 +10786,26 @@ void NiSkinPartition::InternalRead( istream& in, list<unsigned int> & link_stack
 		if ( (skinPartitionBlocks[i1].numStrips == 0) ) {
 			skinPartitionBlocks[i1].triangles.resize(skinPartitionBlocks[i1].numTriangles);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].triangles.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].triangles[i3], in, version );
+				NifStream( skinPartitionBlocks[i1].triangles[i3], in, info );
 			};
 		};
-		NifStream( skinPartitionBlocks[i1].hasBoneIndices, in, version );
+		NifStream( skinPartitionBlocks[i1].hasBoneIndices, in, info );
 		if ( (skinPartitionBlocks[i1].hasBoneIndices != 0) ) {
 			skinPartitionBlocks[i1].boneIndices.resize(skinPartitionBlocks[i1].numVertices);
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].boneIndices.size(); i3++) {
 				skinPartitionBlocks[i1].boneIndices[i3].resize(skinPartitionBlocks[i1].numWeightsPerVertex);
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].boneIndices[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], in, version );
+					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], in, info );
 				};
 			};
 		};
 	};
 }
 
-void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	numSkinPartitionBlocks = (unsigned int)(skinPartitionBlocks.size());
-	NifStream( numSkinPartitionBlocks, out, version );
+	NifStream( numSkinPartitionBlocks, out, info );
 	for (unsigned int i1 = 0; i1 < skinPartitionBlocks.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].strips.size(); i2++)
 			skinPartitionBlocks[i1].stripLengths[i2] = (unsigned short)(skinPartitionBlocks[i1].strips[i2].size());
@@ -10814,78 +10814,78 @@ void NiSkinPartition::InternalWrite( ostream& out, const map<NiObjectRef,unsigne
 		skinPartitionBlocks[i1].numBones = (unsigned short)(skinPartitionBlocks[i1].bones.size());
 		skinPartitionBlocks[i1].numTriangles = (unsigned short)(skinPartitionBlocks[i1].triangles.size());
 		skinPartitionBlocks[i1].numVertices = (unsigned short)(skinPartitionBlocks[i1].vertexMap.size());
-		NifStream( skinPartitionBlocks[i1].numVertices, out, version );
-		NifStream( skinPartitionBlocks[i1].numTriangles, out, version );
-		NifStream( skinPartitionBlocks[i1].numBones, out, version );
-		NifStream( skinPartitionBlocks[i1].numStrips, out, version );
-		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, out, version );
+		NifStream( skinPartitionBlocks[i1].numVertices, out, info );
+		NifStream( skinPartitionBlocks[i1].numTriangles, out, info );
+		NifStream( skinPartitionBlocks[i1].numBones, out, info );
+		NifStream( skinPartitionBlocks[i1].numStrips, out, info );
+		NifStream( skinPartitionBlocks[i1].numWeightsPerVertex, out, info );
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].bones.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].bones[i2], out, version );
+			NifStream( skinPartitionBlocks[i1].bones[i2], out, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasVertexMap, out, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasVertexMap, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexMap.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].vertexMap[i3], out, version );
+				NifStream( skinPartitionBlocks[i1].vertexMap[i3], out, info );
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexMap != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexMap.size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexMap[i4], out, version );
+					NifStream( skinPartitionBlocks[i1].vertexMap[i4], out, info );
 				};
 			};
-			NifStream( skinPartitionBlocks[i1].hasVertexWeights, out, version );
+			NifStream( skinPartitionBlocks[i1].hasVertexWeights, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].vertexWeights.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].vertexWeights[i3][i4], out, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasVertexWeights != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].vertexWeights.size(); i4++) {
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].vertexWeights[i4].size(); i5++) {
-						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], out, version );
+						NifStream( skinPartitionBlocks[i1].vertexWeights[i4][i5], out, info );
 					};
 				};
 			};
 		};
 		for (unsigned int i2 = 0; i2 < skinPartitionBlocks[i1].stripLengths.size(); i2++) {
-			NifStream( skinPartitionBlocks[i1].stripLengths[i2], out, version );
+			NifStream( skinPartitionBlocks[i1].stripLengths[i2], out, info );
 		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( skinPartitionBlocks[i1].hasStrips, out, version );
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( skinPartitionBlocks[i1].hasStrips, out, info );
 		};
-		if ( version <= 0x0A000102 ) {
+		if ( info.version <= 0x0A000102 ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].strips.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].stripLengths[i3]; i4++) {
-					NifStream( skinPartitionBlocks[i1].strips[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].strips[i3][i4], out, info );
 				};
 			};
 		};
-		if ( version >= 0x0A010000 ) {
+		if ( info.version >= 0x0A010000 ) {
 			if ( (skinPartitionBlocks[i1].hasStrips != 0) ) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].strips.size(); i4++) {
 					for (unsigned int i5 = 0; i5 < skinPartitionBlocks[i1].stripLengths[i4]; i5++) {
-						NifStream( skinPartitionBlocks[i1].strips[i4][i5], out, version );
+						NifStream( skinPartitionBlocks[i1].strips[i4][i5], out, info );
 					};
 				};
 			};
 		};
 		if ( (skinPartitionBlocks[i1].numStrips == 0) ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].triangles.size(); i3++) {
-				NifStream( skinPartitionBlocks[i1].triangles[i3], out, version );
+				NifStream( skinPartitionBlocks[i1].triangles[i3], out, info );
 			};
 		};
-		NifStream( skinPartitionBlocks[i1].hasBoneIndices, out, version );
+		NifStream( skinPartitionBlocks[i1].hasBoneIndices, out, info );
 		if ( (skinPartitionBlocks[i1].hasBoneIndices != 0) ) {
 			for (unsigned int i3 = 0; i3 < skinPartitionBlocks[i1].boneIndices.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < skinPartitionBlocks[i1].boneIndices[i3].size(); i4++) {
-					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], out, version );
+					NifStream( skinPartitionBlocks[i1].boneIndices[i3][i4], out, info );
 				};
 			};
 		};
@@ -11018,8 +11018,8 @@ std::string NiSkinPartition::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSkinPartition::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiSkinPartition::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSkinPartition::InternalGetRefs() const {
@@ -11028,78 +11028,78 @@ std::list<NiObjectRef> NiSkinPartition::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSourceTexture::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiSourceTexture::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiObjectNET::Read( in, link_stack, version, user_version );
-	NifStream( useExternal, in, version );
+	NiObjectNET::Read( in, link_stack, info );
+	NifStream( useExternal, in, info );
 	if ( (useExternal == 1) ) {
-		NifStream( fileName, in, version );
+		NifStream( fileName, in, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
-			NifStream( block_num, in, version );
+			NifStream( block_num, in, info );
 			link_stack.push_back( block_num );
 		};
 	};
-	if ( version <= 0x0A000100 ) {
+	if ( info.version <= 0x0A000100 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( unknownByte, in, version );
+			NifStream( unknownByte, in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( originalFileName_, in, version );
+			NifStream( originalFileName_, in, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
-	NifStream( pixelLayout, in, version );
-	NifStream( useMipmaps, in, version );
-	NifStream( alphaFormat, in, version );
-	NifStream( unknownByte, in, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownByte2, in, version );
+	NifStream( pixelLayout, in, info );
+	NifStream( useMipmaps, in, info );
+	NifStream( alphaFormat, in, info );
+	NifStream( unknownByte, in, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownByte2, in, info );
 	};
 }
 
-void NiSourceTexture::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObjectNET::Write( out, link_map, version, user_version );
-	NifStream( useExternal, out, version );
+void NiSourceTexture::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObjectNET::Write( out, link_map, info );
+	NifStream( useExternal, out, info );
 	if ( (useExternal == 1) ) {
-		NifStream( fileName, out, version );
+		NifStream( fileName, out, info );
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
 			if ( unknownLink != NULL )
-				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, version );
+				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
 			else
-				NifStream( 0xffffffff, out, version );
+				NifStream( 0xffffffff, out, info );
 		};
 	};
-	if ( version <= 0x0A000100 ) {
+	if ( info.version <= 0x0A000100 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( unknownByte, out, version );
+			NifStream( unknownByte, out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 0) ) {
-			NifStream( originalFileName_, out, version );
+			NifStream( originalFileName_, out, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
 		if ( pixelData != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(pixelData) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(pixelData) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
-	NifStream( pixelLayout, out, version );
-	NifStream( useMipmaps, out, version );
-	NifStream( alphaFormat, out, version );
-	NifStream( unknownByte, out, version );
-	if ( version >= 0x0A01006A ) {
-		NifStream( unknownByte2, out, version );
+	NifStream( pixelLayout, out, info );
+	NifStream( useMipmaps, out, info );
+	NifStream( alphaFormat, out, info );
+	NifStream( unknownByte, out, info );
+	if ( info.version >= 0x0A01006A ) {
+		NifStream( unknownByte2, out, info );
 	};
 }
 
@@ -11124,15 +11124,15 @@ std::string NiSourceTexture::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSourceTexture::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObjectNET::FixLinks( objects, link_stack, version, user_version );
-	if ( version >= 0x0A010000 ) {
+void NiSourceTexture::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObjectNET::FixLinks( objects, link_stack, info );
+	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
-			unknownLink = FixLink<NiObject>( objects, link_stack, version );
+			unknownLink = FixLink<NiObject>( objects, link_stack, info );
 		};
 	};
 	if ( (useExternal == 0) ) {
-		pixelData = FixLink<NiPixelData>( objects, link_stack, version );
+		pixelData = FixLink<NiPixelData>( objects, link_stack, info );
 	};
 }
 
@@ -11146,14 +11146,14 @@ std::list<NiObjectRef> NiSourceTexture::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSpecularProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiSpecularProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiSpecularProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiSpecularProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
@@ -11164,8 +11164,8 @@ std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpecularProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiSpecularProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSpecularProperty::InternalGetRefs() const {
@@ -11174,34 +11174,34 @@ std::list<NiObjectRef> NiSpecularProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSphericalCollider::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::Read( in, link_stack, version, user_version );
-	NifStream( unknownFloat1, in, version );
-	NifStream( unknownShort1, in, version );
-	NifStream( unknownFloat2, in, version );
-	if ( version <= 0x04020002 ) {
-		NifStream( unknownShort2, in, version );
+void NiSphericalCollider::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::Read( in, link_stack, info );
+	NifStream( unknownFloat1, in, info );
+	NifStream( unknownShort1, in, info );
+	NifStream( unknownFloat2, in, info );
+	if ( info.version <= 0x04020002 ) {
+		NifStream( unknownShort2, in, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownFloat3, in, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownFloat3, in, info );
 	};
-	NifStream( unknownFloat4, in, version );
-	NifStream( unknownFloat5, in, version );
+	NifStream( unknownFloat4, in, info );
+	NifStream( unknownFloat5, in, info );
 }
 
-void NiSphericalCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AParticleModifier::Write( out, link_map, version, user_version );
-	NifStream( unknownFloat1, out, version );
-	NifStream( unknownShort1, out, version );
-	NifStream( unknownFloat2, out, version );
-	if ( version <= 0x04020002 ) {
-		NifStream( unknownShort2, out, version );
+void NiSphericalCollider::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AParticleModifier::Write( out, link_map, info );
+	NifStream( unknownFloat1, out, info );
+	NifStream( unknownShort1, out, info );
+	NifStream( unknownFloat2, out, info );
+	if ( info.version <= 0x04020002 ) {
+		NifStream( unknownShort2, out, info );
 	};
-	if ( version >= 0x04020100 ) {
-		NifStream( unknownFloat3, out, version );
+	if ( info.version >= 0x04020100 ) {
+		NifStream( unknownFloat3, out, info );
 	};
-	NifStream( unknownFloat4, out, version );
-	NifStream( unknownFloat5, out, version );
+	NifStream( unknownFloat4, out, info );
+	NifStream( unknownFloat5, out, info );
 }
 
 std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
@@ -11218,8 +11218,8 @@ std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSphericalCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AParticleModifier::FixLinks( objects, link_stack, version, user_version );
+void NiSphericalCollider::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AParticleModifier::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSphericalCollider::InternalGetRefs() const {
@@ -11228,16 +11228,16 @@ std::list<NiObjectRef> NiSphericalCollider::InternalGetRefs() const {
 	return refs;
 }
 
-void NiSpotLight::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPointLight::Read( in, link_stack, version, user_version );
-	NifStream( cutoffAngle, in, version );
-	NifStream( exponent, in, version );
+void NiSpotLight::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPointLight::Read( in, link_stack, info );
+	NifStream( cutoffAngle, in, info );
+	NifStream( exponent, in, info );
 }
 
-void NiSpotLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiPointLight::Write( out, link_map, version, user_version );
-	NifStream( cutoffAngle, out, version );
-	NifStream( exponent, out, version );
+void NiSpotLight::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiPointLight::Write( out, link_map, info );
+	NifStream( cutoffAngle, out, info );
+	NifStream( exponent, out, info );
 }
 
 std::string NiSpotLight::InternalAsString( bool verbose ) const {
@@ -11249,8 +11249,8 @@ std::string NiSpotLight::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiSpotLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiPointLight::FixLinks( objects, link_stack, version, user_version );
+void NiSpotLight::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiPointLight::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiSpotLight::InternalGetRefs() const {
@@ -11259,34 +11259,34 @@ std::list<NiObjectRef> NiSpotLight::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStencilProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+void NiStencilProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( stencilEnabled, in, version );
-	NifStream( stencilFunction, in, version );
-	NifStream( stencilRef, in, version );
-	NifStream( stencilMask, in, version );
-	NifStream( failAction, in, version );
-	NifStream( zFailAction, in, version );
-	NifStream( passAction, in, version );
-	NifStream( drawMode, in, version );
+	NifStream( stencilEnabled, in, info );
+	NifStream( stencilFunction, in, info );
+	NifStream( stencilRef, in, info );
+	NifStream( stencilMask, in, info );
+	NifStream( failAction, in, info );
+	NifStream( zFailAction, in, info );
+	NifStream( passAction, in, info );
+	NifStream( drawMode, in, info );
 }
 
-void NiStencilProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+void NiStencilProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( stencilEnabled, out, version );
-	NifStream( stencilFunction, out, version );
-	NifStream( stencilRef, out, version );
-	NifStream( stencilMask, out, version );
-	NifStream( failAction, out, version );
-	NifStream( zFailAction, out, version );
-	NifStream( passAction, out, version );
-	NifStream( drawMode, out, version );
+	NifStream( stencilEnabled, out, info );
+	NifStream( stencilFunction, out, info );
+	NifStream( stencilRef, out, info );
+	NifStream( stencilMask, out, info );
+	NifStream( failAction, out, info );
+	NifStream( zFailAction, out, info );
+	NifStream( passAction, out, info );
+	NifStream( drawMode, out, info );
 }
 
 std::string NiStencilProperty::InternalAsString( bool verbose ) const {
@@ -11305,8 +11305,8 @@ std::string NiStencilProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStencilProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiStencilProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStencilProperty::InternalGetRefs() const {
@@ -11315,20 +11315,20 @@ std::list<NiObjectRef> NiStencilProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( bytesRemaining, in, version );
+void NiStringExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( bytesRemaining, in, info );
 	};
-	NifStream( stringData, in, version );
+	NifStream( stringData, in, info );
 }
 
-void NiStringExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( bytesRemaining, out, version );
+void NiStringExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( bytesRemaining, out, info );
 	};
-	NifStream( stringData, out, version );
+	NifStream( stringData, out, info );
 }
 
 std::string NiStringExtraData::InternalAsString( bool verbose ) const {
@@ -11340,8 +11340,8 @@ std::string NiStringExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiStringExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringExtraData::InternalGetRefs() const {
@@ -11350,16 +11350,16 @@ std::list<NiObjectRef> NiStringExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringPalette::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( palette.palette, in, version );
-	NifStream( palette.length, in, version );
+void NiStringPalette::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( palette.palette, in, info );
+	NifStream( palette.length, in, info );
 }
 
-void NiStringPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( palette.palette, out, version );
-	NifStream( palette.length, out, version );
+void NiStringPalette::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( palette.palette, out, info );
+	NifStream( palette.length, out, info );
 }
 
 std::string NiStringPalette::InternalAsString( bool verbose ) const {
@@ -11371,8 +11371,8 @@ std::string NiStringPalette::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiStringPalette::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringPalette::InternalGetRefs() const {
@@ -11381,21 +11381,21 @@ std::list<NiObjectRef> NiStringPalette::InternalGetRefs() const {
 	return refs;
 }
 
-void NiStringsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numStrings, in, version );
+void NiStringsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numStrings, in, info );
 	data.resize(numStrings);
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], in, version );
+		NifStream( data[i1], in, info );
 	};
 }
 
-void NiStringsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiStringsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numStrings = (unsigned int)(data.size());
-	NifStream( numStrings, out, version );
+	NifStream( numStrings, out, info );
 	for (unsigned int i1 = 0; i1 < data.size(); i1++) {
-		NifStream( data[i1], out, version );
+		NifStream( data[i1], out, info );
 	};
 }
 
@@ -11420,8 +11420,8 @@ std::string NiStringsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiStringsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiStringsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiStringsExtraData::InternalGetRefs() const {
@@ -11430,27 +11430,27 @@ std::list<NiObjectRef> NiStringsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextKeyExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	if ( version <= 0x04020200 ) {
-		NifStream( unknownInt1, in, version );
+void NiTextKeyExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( unknownInt1, in, info );
 	};
-	NifStream( numTextKeys, in, version );
+	NifStream( numTextKeys, in, info );
 	textKeys.resize(numTextKeys);
 	for (unsigned int i1 = 0; i1 < textKeys.size(); i1++) {
-		NifStream( textKeys[i1], in, version, 1 );
+		NifStream( textKeys[i1], in, info, 1 );
 	};
 }
 
-void NiTextKeyExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiTextKeyExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numTextKeys = (unsigned int)(textKeys.size());
-	if ( version <= 0x04020200 ) {
-		NifStream( unknownInt1, out, version );
+	if ( info.version <= 0x04020200 ) {
+		NifStream( unknownInt1, out, info );
 	};
-	NifStream( numTextKeys, out, version );
+	NifStream( numTextKeys, out, info );
 	for (unsigned int i1 = 0; i1 < textKeys.size(); i1++) {
-		NifStream( textKeys[i1], out, version, 1 );
+		NifStream( textKeys[i1], out, info, 1 );
 	};
 }
 
@@ -11476,8 +11476,8 @@ std::string NiTextKeyExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextKeyExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiTextKeyExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextKeyExtraData::InternalGetRefs() const {
@@ -11486,50 +11486,50 @@ std::list<NiObjectRef> NiTextKeyExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureEffect::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureEffect::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiDynamicEffect::Read( in, link_stack, version, user_version );
-	NifStream( modelProjectionMatrix, in, version );
-	NifStream( modelProjectionTransform, in, version );
-	NifStream( textureFiltering, in, version );
-	NifStream( textureClamping, in, version );
-	NifStream( textureType, in, version );
-	NifStream( coordinateGenerationType, in, version );
-	NifStream( block_num, in, version );
+	NiDynamicEffect::Read( in, link_stack, info );
+	NifStream( modelProjectionMatrix, in, info );
+	NifStream( modelProjectionTransform, in, info );
+	NifStream( textureFiltering, in, info );
+	NifStream( textureClamping, in, info );
+	NifStream( textureType, in, info );
+	NifStream( coordinateGenerationType, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
-	NifStream( clippingPlane, in, version );
-	NifStream( unknownVector, in, version );
-	NifStream( unknownFloat, in, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( ps2L, in, version );
-		NifStream( ps2K, in, version );
-	};
-	if ( version <= 0x0401000C ) {
-		NifStream( unknownShort, in, version );
-	};
-}
-
-void NiTextureEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiDynamicEffect::Write( out, link_map, version, user_version );
-	NifStream( modelProjectionMatrix, out, version );
-	NifStream( modelProjectionTransform, out, version );
-	NifStream( textureFiltering, out, version );
-	NifStream( textureClamping, out, version );
-	NifStream( textureType, out, version );
-	NifStream( coordinateGenerationType, out, version );
+	NifStream( clippingPlane, in, info );
+	NifStream( unknownVector, in, info );
+	NifStream( unknownFloat, in, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( ps2L, in, info );
+		NifStream( ps2K, in, info );
+	};
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownShort, in, info );
+	};
+}
+
+void NiTextureEffect::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiDynamicEffect::Write( out, link_map, info );
+	NifStream( modelProjectionMatrix, out, info );
+	NifStream( modelProjectionTransform, out, info );
+	NifStream( textureFiltering, out, info );
+	NifStream( textureClamping, out, info );
+	NifStream( textureType, out, info );
+	NifStream( coordinateGenerationType, out, info );
 	if ( sourceTexture != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(sourceTexture) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(sourceTexture) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
-	NifStream( clippingPlane, out, version );
-	NifStream( unknownVector, out, version );
-	NifStream( unknownFloat, out, version );
-	if ( version <= 0x0A020000 ) {
-		NifStream( ps2L, out, version );
-		NifStream( ps2K, out, version );
+		NifStream( 0xffffffff, out, info );
+	NifStream( clippingPlane, out, info );
+	NifStream( unknownVector, out, info );
+	NifStream( unknownFloat, out, info );
+	if ( info.version <= 0x0A020000 ) {
+		NifStream( ps2L, out, info );
+		NifStream( ps2K, out, info );
 	};
-	if ( version <= 0x0401000C ) {
-		NifStream( unknownShort, out, version );
+	if ( info.version <= 0x0401000C ) {
+		NifStream( unknownShort, out, info );
 	};
 }
 
@@ -11553,9 +11553,9 @@ std::string NiTextureEffect::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiDynamicEffect::FixLinks( objects, link_stack, version, user_version );
-	sourceTexture = FixLink<NiSourceTexture>( objects, link_stack, version );
+void NiTextureEffect::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiDynamicEffect::FixLinks( objects, link_stack, info );
+	sourceTexture = FixLink<NiSourceTexture>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureEffect::InternalGetRefs() const {
@@ -11566,28 +11566,28 @@ std::list<NiObjectRef> NiTextureEffect::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	NifStream( unknown2, in, version );
-	NifStream( textureSlot, in, version );
-	NifStream( operation, in, version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	NifStream( unknown2, in, info );
+	NifStream( textureSlot, in, info );
+	NifStream( operation, in, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiTextureTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	NifStream( unknown2, out, version );
-	NifStream( textureSlot, out, version );
-	NifStream( operation, out, version );
-	if ( version <= 0x0A010000 ) {
+void NiTextureTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	NifStream( unknown2, out, info );
+	NifStream( textureSlot, out, info );
+	NifStream( operation, out, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -11602,10 +11602,10 @@ std::string NiTextureTransformController::InternalAsString( bool verbose ) const
 	return out.str();
 }
 
-void NiTextureTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiFloatData>( objects, link_stack, version );
+void NiTextureTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiFloatData>( objects, link_stack, info );
 	};
 }
 
@@ -11617,17 +11617,17 @@ std::list<NiObjectRef> NiTextureTransformController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureModeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
+void NiTextureModeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknown3Shorts[i1], in, version );
+		NifStream( unknown3Shorts[i1], in, info );
 	};
 }
 
-void NiTextureModeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
+void NiTextureModeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 3; i1++) {
-		NifStream( unknown3Shorts[i1], out, version );
+		NifStream( unknown3Shorts[i1], out, info );
 	};
 }
 
@@ -11650,8 +11650,8 @@ std::string NiTextureModeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureModeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiTextureModeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureModeProperty::InternalGetRefs() const {
@@ -11660,21 +11660,21 @@ std::list<NiObjectRef> NiTextureModeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiImage::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
-	NifStream( external_, in, version );
-	NifStream( file, in, version );
+void NiImage::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
+	NifStream( external_, in, info );
+	NifStream( file, in, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], in, version );
+		NifStream( unknown4Shorts[i1], in, info );
 	};
 }
 
-void NiImage::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
-	NifStream( external_, out, version );
-	NifStream( file, out, version );
+void NiImage::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
+	NifStream( external_, out, info );
+	NifStream( file, out, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( unknown4Shorts[i1], out, version );
+		NifStream( unknown4Shorts[i1], out, info );
 	};
 }
 
@@ -11699,8 +11699,8 @@ std::string NiImage::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiImage::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiImage::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiImage::InternalGetRefs() const {
@@ -11709,21 +11709,21 @@ std::list<NiObjectRef> NiImage::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTextureProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTextureProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( block_num, in, version );
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTextureProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiTextureProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 	if ( image != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTextureProperty::InternalAsString( bool verbose ) const {
@@ -11735,9 +11735,9 @@ std::string NiTextureProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTextureProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
-	image = FixLink<NiImage>( objects, link_stack, version );
+void NiTextureProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
+	image = FixLink<NiImage>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTextureProperty::InternalGetRefs() const {
@@ -11748,624 +11748,624 @@ std::list<NiObjectRef> NiTextureProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTexturingProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTexturingProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiProperty::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, in, version );
+	NiProperty::Read( in, link_stack, info );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, in, info );
 	};
-	NifStream( applyMode, in, version );
-	NifStream( textureCount, in, version );
-	NifStream( hasBaseTexture, in, version );
+	NifStream( applyMode, in, info );
+	NifStream( textureCount, in, info );
+	NifStream( hasBaseTexture, in, info );
 	if ( (hasBaseTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( baseTexture.clampMode, in, version );
-		NifStream( baseTexture.filterMode, in, version );
-		NifStream( baseTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( baseTexture.ps2L, in, version );
-			NifStream( baseTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( baseTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( baseTexture.hasTextureTransform, in, version );
+		NifStream( baseTexture.clampMode, in, info );
+		NifStream( baseTexture.filterMode, in, info );
+		NifStream( baseTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( baseTexture.ps2L, in, info );
+			NifStream( baseTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( baseTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( baseTexture.hasTextureTransform, in, info );
 			if ( (baseTexture.hasTextureTransform != 0) ) {
-				NifStream( baseTexture.translation, in, version );
-				NifStream( baseTexture.tiling, in, version );
-				NifStream( baseTexture.wRotation, in, version );
-				NifStream( baseTexture.transformType_, in, version );
-				NifStream( baseTexture.centerOffset, in, version );
+				NifStream( baseTexture.translation, in, info );
+				NifStream( baseTexture.tiling, in, info );
+				NifStream( baseTexture.wRotation, in, info );
+				NifStream( baseTexture.transformType_, in, info );
+				NifStream( baseTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasDarkTexture, in, version );
+	NifStream( hasDarkTexture, in, info );
 	if ( (hasDarkTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( darkTexture.clampMode, in, version );
-		NifStream( darkTexture.filterMode, in, version );
-		NifStream( darkTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( darkTexture.ps2L, in, version );
-			NifStream( darkTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( darkTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( darkTexture.hasTextureTransform, in, version );
+		NifStream( darkTexture.clampMode, in, info );
+		NifStream( darkTexture.filterMode, in, info );
+		NifStream( darkTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( darkTexture.ps2L, in, info );
+			NifStream( darkTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( darkTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( darkTexture.hasTextureTransform, in, info );
 			if ( (darkTexture.hasTextureTransform != 0) ) {
-				NifStream( darkTexture.translation, in, version );
-				NifStream( darkTexture.tiling, in, version );
-				NifStream( darkTexture.wRotation, in, version );
-				NifStream( darkTexture.transformType_, in, version );
-				NifStream( darkTexture.centerOffset, in, version );
+				NifStream( darkTexture.translation, in, info );
+				NifStream( darkTexture.tiling, in, info );
+				NifStream( darkTexture.wRotation, in, info );
+				NifStream( darkTexture.transformType_, in, info );
+				NifStream( darkTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasDetailTexture, in, version );
+	NifStream( hasDetailTexture, in, info );
 	if ( (hasDetailTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( detailTexture.clampMode, in, version );
-		NifStream( detailTexture.filterMode, in, version );
-		NifStream( detailTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( detailTexture.ps2L, in, version );
-			NifStream( detailTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( detailTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( detailTexture.hasTextureTransform, in, version );
+		NifStream( detailTexture.clampMode, in, info );
+		NifStream( detailTexture.filterMode, in, info );
+		NifStream( detailTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( detailTexture.ps2L, in, info );
+			NifStream( detailTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( detailTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( detailTexture.hasTextureTransform, in, info );
 			if ( (detailTexture.hasTextureTransform != 0) ) {
-				NifStream( detailTexture.translation, in, version );
-				NifStream( detailTexture.tiling, in, version );
-				NifStream( detailTexture.wRotation, in, version );
-				NifStream( detailTexture.transformType_, in, version );
-				NifStream( detailTexture.centerOffset, in, version );
+				NifStream( detailTexture.translation, in, info );
+				NifStream( detailTexture.tiling, in, info );
+				NifStream( detailTexture.wRotation, in, info );
+				NifStream( detailTexture.transformType_, in, info );
+				NifStream( detailTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasGlossTexture, in, version );
+	NifStream( hasGlossTexture, in, info );
 	if ( (hasGlossTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( glossTexture.clampMode, in, version );
-		NifStream( glossTexture.filterMode, in, version );
-		NifStream( glossTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glossTexture.ps2L, in, version );
-			NifStream( glossTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glossTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glossTexture.hasTextureTransform, in, version );
+		NifStream( glossTexture.clampMode, in, info );
+		NifStream( glossTexture.filterMode, in, info );
+		NifStream( glossTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glossTexture.ps2L, in, info );
+			NifStream( glossTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glossTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glossTexture.hasTextureTransform, in, info );
 			if ( (glossTexture.hasTextureTransform != 0) ) {
-				NifStream( glossTexture.translation, in, version );
-				NifStream( glossTexture.tiling, in, version );
-				NifStream( glossTexture.wRotation, in, version );
-				NifStream( glossTexture.transformType_, in, version );
-				NifStream( glossTexture.centerOffset, in, version );
+				NifStream( glossTexture.translation, in, info );
+				NifStream( glossTexture.tiling, in, info );
+				NifStream( glossTexture.wRotation, in, info );
+				NifStream( glossTexture.transformType_, in, info );
+				NifStream( glossTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasGlowTexture, in, version );
+	NifStream( hasGlowTexture, in, info );
 	if ( (hasGlowTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( glowTexture.clampMode, in, version );
-		NifStream( glowTexture.filterMode, in, version );
-		NifStream( glowTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glowTexture.ps2L, in, version );
-			NifStream( glowTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glowTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glowTexture.hasTextureTransform, in, version );
+		NifStream( glowTexture.clampMode, in, info );
+		NifStream( glowTexture.filterMode, in, info );
+		NifStream( glowTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glowTexture.ps2L, in, info );
+			NifStream( glowTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glowTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glowTexture.hasTextureTransform, in, info );
 			if ( (glowTexture.hasTextureTransform != 0) ) {
-				NifStream( glowTexture.translation, in, version );
-				NifStream( glowTexture.tiling, in, version );
-				NifStream( glowTexture.wRotation, in, version );
-				NifStream( glowTexture.transformType_, in, version );
-				NifStream( glowTexture.centerOffset, in, version );
+				NifStream( glowTexture.translation, in, info );
+				NifStream( glowTexture.tiling, in, info );
+				NifStream( glowTexture.wRotation, in, info );
+				NifStream( glowTexture.transformType_, in, info );
+				NifStream( glowTexture.centerOffset, in, info );
 			};
 		};
 	};
-	NifStream( hasBumpMapTexture, in, version );
+	NifStream( hasBumpMapTexture, in, info );
 	if ( (hasBumpMapTexture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( bumpMapTexture.clampMode, in, version );
-		NifStream( bumpMapTexture.filterMode, in, version );
-		NifStream( bumpMapTexture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( bumpMapTexture.ps2L, in, version );
-			NifStream( bumpMapTexture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( bumpMapTexture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( bumpMapTexture.hasTextureTransform, in, version );
+		NifStream( bumpMapTexture.clampMode, in, info );
+		NifStream( bumpMapTexture.filterMode, in, info );
+		NifStream( bumpMapTexture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( bumpMapTexture.ps2L, in, info );
+			NifStream( bumpMapTexture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( bumpMapTexture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( bumpMapTexture.hasTextureTransform, in, info );
 			if ( (bumpMapTexture.hasTextureTransform != 0) ) {
-				NifStream( bumpMapTexture.translation, in, version );
-				NifStream( bumpMapTexture.tiling, in, version );
-				NifStream( bumpMapTexture.wRotation, in, version );
-				NifStream( bumpMapTexture.transformType_, in, version );
-				NifStream( bumpMapTexture.centerOffset, in, version );
+				NifStream( bumpMapTexture.translation, in, info );
+				NifStream( bumpMapTexture.tiling, in, info );
+				NifStream( bumpMapTexture.wRotation, in, info );
+				NifStream( bumpMapTexture.transformType_, in, info );
+				NifStream( bumpMapTexture.centerOffset, in, info );
 			};
 		};
-		NifStream( bumpMapLumaScale, in, version );
-		NifStream( bumpMapLumaOffset, in, version );
-		NifStream( bumpMapMatrix, in, version );
+		NifStream( bumpMapLumaScale, in, info );
+		NifStream( bumpMapLumaOffset, in, info );
+		NifStream( bumpMapMatrix, in, info );
 	};
-	NifStream( hasDecal0Texture, in, version );
+	NifStream( hasDecal0Texture, in, info );
 	if ( (hasDecal0Texture != 0) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal0Texture.clampMode, in, version );
-		NifStream( decal0Texture.filterMode, in, version );
-		NifStream( decal0Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal0Texture.ps2L, in, version );
-			NifStream( decal0Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal0Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal0Texture.hasTextureTransform, in, version );
+		NifStream( decal0Texture.clampMode, in, info );
+		NifStream( decal0Texture.filterMode, in, info );
+		NifStream( decal0Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal0Texture.ps2L, in, info );
+			NifStream( decal0Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal0Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal0Texture.hasTextureTransform, in, info );
 			if ( (decal0Texture.hasTextureTransform != 0) ) {
-				NifStream( decal0Texture.translation, in, version );
-				NifStream( decal0Texture.tiling, in, version );
-				NifStream( decal0Texture.wRotation, in, version );
-				NifStream( decal0Texture.transformType_, in, version );
-				NifStream( decal0Texture.centerOffset, in, version );
+				NifStream( decal0Texture.translation, in, info );
+				NifStream( decal0Texture.tiling, in, info );
+				NifStream( decal0Texture.wRotation, in, info );
+				NifStream( decal0Texture.transformType_, in, info );
+				NifStream( decal0Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 8) ) {
-		NifStream( hasDecal1Texture, in, version );
+		NifStream( hasDecal1Texture, in, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal1Texture.clampMode, in, version );
-		NifStream( decal1Texture.filterMode, in, version );
-		NifStream( decal1Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal1Texture.ps2L, in, version );
-			NifStream( decal1Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal1Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal1Texture.hasTextureTransform, in, version );
+		NifStream( decal1Texture.clampMode, in, info );
+		NifStream( decal1Texture.filterMode, in, info );
+		NifStream( decal1Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal1Texture.ps2L, in, info );
+			NifStream( decal1Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal1Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal1Texture.hasTextureTransform, in, info );
 			if ( (decal1Texture.hasTextureTransform != 0) ) {
-				NifStream( decal1Texture.translation, in, version );
-				NifStream( decal1Texture.tiling, in, version );
-				NifStream( decal1Texture.wRotation, in, version );
-				NifStream( decal1Texture.transformType_, in, version );
-				NifStream( decal1Texture.centerOffset, in, version );
+				NifStream( decal1Texture.translation, in, info );
+				NifStream( decal1Texture.tiling, in, info );
+				NifStream( decal1Texture.wRotation, in, info );
+				NifStream( decal1Texture.transformType_, in, info );
+				NifStream( decal1Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 9) ) {
-		NifStream( hasDecal2Texture, in, version );
+		NifStream( hasDecal2Texture, in, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal2Texture.clampMode, in, version );
-		NifStream( decal2Texture.filterMode, in, version );
-		NifStream( decal2Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal2Texture.ps2L, in, version );
-			NifStream( decal2Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal2Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal2Texture.hasTextureTransform, in, version );
+		NifStream( decal2Texture.clampMode, in, info );
+		NifStream( decal2Texture.filterMode, in, info );
+		NifStream( decal2Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal2Texture.ps2L, in, info );
+			NifStream( decal2Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal2Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal2Texture.hasTextureTransform, in, info );
 			if ( (decal2Texture.hasTextureTransform != 0) ) {
-				NifStream( decal2Texture.translation, in, version );
-				NifStream( decal2Texture.tiling, in, version );
-				NifStream( decal2Texture.wRotation, in, version );
-				NifStream( decal2Texture.transformType_, in, version );
-				NifStream( decal2Texture.centerOffset, in, version );
+				NifStream( decal2Texture.translation, in, info );
+				NifStream( decal2Texture.tiling, in, info );
+				NifStream( decal2Texture.wRotation, in, info );
+				NifStream( decal2Texture.transformType_, in, info );
+				NifStream( decal2Texture.centerOffset, in, info );
 			};
 		};
 	};
 	if ( (textureCount >= 10) ) {
-		NifStream( hasDecal3Texture, in, version );
+		NifStream( hasDecal3Texture, in, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
-		NifStream( block_num, in, version );
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
-		NifStream( decal3Texture.clampMode, in, version );
-		NifStream( decal3Texture.filterMode, in, version );
-		NifStream( decal3Texture.uvSet, in, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal3Texture.ps2L, in, version );
-			NifStream( decal3Texture.ps2K, in, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal3Texture.unknown1, in, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal3Texture.hasTextureTransform, in, version );
+		NifStream( decal3Texture.clampMode, in, info );
+		NifStream( decal3Texture.filterMode, in, info );
+		NifStream( decal3Texture.uvSet, in, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal3Texture.ps2L, in, info );
+			NifStream( decal3Texture.ps2K, in, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal3Texture.unknown1, in, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal3Texture.hasTextureTransform, in, info );
 			if ( (decal3Texture.hasTextureTransform != 0) ) {
-				NifStream( decal3Texture.translation, in, version );
-				NifStream( decal3Texture.tiling, in, version );
-				NifStream( decal3Texture.wRotation, in, version );
-				NifStream( decal3Texture.transformType_, in, version );
-				NifStream( decal3Texture.centerOffset, in, version );
+				NifStream( decal3Texture.translation, in, info );
+				NifStream( decal3Texture.tiling, in, info );
+				NifStream( decal3Texture.wRotation, in, info );
+				NifStream( decal3Texture.transformType_, in, info );
+				NifStream( decal3Texture.centerOffset, in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numShaderTextures, in, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numShaderTextures, in, info );
 		shaderTextures.resize(numShaderTextures);
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
-			NifStream( shaderTextures[i2].isUsed, in, version );
+			NifStream( shaderTextures[i2].isUsed, in, info );
 			if ( (shaderTextures[i2].isUsed != 0) ) {
-				NifStream( block_num, in, version );
+				NifStream( block_num, in, info );
 				link_stack.push_back( block_num );
-				NifStream( shaderTextures[i2].textureData.clampMode, in, version );
-				NifStream( shaderTextures[i2].textureData.filterMode, in, version );
-				NifStream( shaderTextures[i2].textureData.uvSet, in, version );
-				if ( version <= 0x0A020000 ) {
-					NifStream( shaderTextures[i2].textureData.ps2L, in, version );
-					NifStream( shaderTextures[i2].textureData.ps2K, in, version );
+				NifStream( shaderTextures[i2].textureData.clampMode, in, info );
+				NifStream( shaderTextures[i2].textureData.filterMode, in, info );
+				NifStream( shaderTextures[i2].textureData.uvSet, in, info );
+				if ( info.version <= 0x0A020000 ) {
+					NifStream( shaderTextures[i2].textureData.ps2L, in, info );
+					NifStream( shaderTextures[i2].textureData.ps2K, in, info );
 				};
-				if ( version <= 0x0401000C ) {
-					NifStream( shaderTextures[i2].textureData.unknown1, in, version );
+				if ( info.version <= 0x0401000C ) {
+					NifStream( shaderTextures[i2].textureData.unknown1, in, info );
 				};
-				if ( version >= 0x0A010000 ) {
-					NifStream( shaderTextures[i2].textureData.hasTextureTransform, in, version );
+				if ( info.version >= 0x0A010000 ) {
+					NifStream( shaderTextures[i2].textureData.hasTextureTransform, in, info );
 					if ( (shaderTextures[i2].textureData.hasTextureTransform != 0) ) {
-						NifStream( shaderTextures[i2].textureData.translation, in, version );
-						NifStream( shaderTextures[i2].textureData.tiling, in, version );
-						NifStream( shaderTextures[i2].textureData.wRotation, in, version );
-						NifStream( shaderTextures[i2].textureData.transformType_, in, version );
-						NifStream( shaderTextures[i2].textureData.centerOffset, in, version );
+						NifStream( shaderTextures[i2].textureData.translation, in, info );
+						NifStream( shaderTextures[i2].textureData.tiling, in, info );
+						NifStream( shaderTextures[i2].textureData.wRotation, in, info );
+						NifStream( shaderTextures[i2].textureData.transformType_, in, info );
+						NifStream( shaderTextures[i2].textureData.centerOffset, in, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, in, version );
+				NifStream( shaderTextures[i2].unknownInt, in, info );
 			};
 		};
 	};
 }
 
-void NiTexturingProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
+void NiTexturingProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
 	numShaderTextures = (unsigned int)(shaderTextures.size());
-	if ( version <= 0x0A000102 ) {
-		NifStream( flags, out, version );
+	if ( info.version <= 0x0A000102 ) {
+		NifStream( flags, out, info );
 	};
-	NifStream( applyMode, out, version );
-	NifStream( textureCount, out, version );
-	NifStream( hasBaseTexture, out, version );
+	NifStream( applyMode, out, info );
+	NifStream( textureCount, out, info );
+	NifStream( hasBaseTexture, out, info );
 	if ( (hasBaseTexture != 0) ) {
 		if ( baseTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(baseTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(baseTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( baseTexture.clampMode, out, version );
-		NifStream( baseTexture.filterMode, out, version );
-		NifStream( baseTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( baseTexture.ps2L, out, version );
-			NifStream( baseTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( baseTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( baseTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( baseTexture.clampMode, out, info );
+		NifStream( baseTexture.filterMode, out, info );
+		NifStream( baseTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( baseTexture.ps2L, out, info );
+			NifStream( baseTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( baseTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( baseTexture.hasTextureTransform, out, info );
 			if ( (baseTexture.hasTextureTransform != 0) ) {
-				NifStream( baseTexture.translation, out, version );
-				NifStream( baseTexture.tiling, out, version );
-				NifStream( baseTexture.wRotation, out, version );
-				NifStream( baseTexture.transformType_, out, version );
-				NifStream( baseTexture.centerOffset, out, version );
+				NifStream( baseTexture.translation, out, info );
+				NifStream( baseTexture.tiling, out, info );
+				NifStream( baseTexture.wRotation, out, info );
+				NifStream( baseTexture.transformType_, out, info );
+				NifStream( baseTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasDarkTexture, out, version );
+	NifStream( hasDarkTexture, out, info );
 	if ( (hasDarkTexture != 0) ) {
 		if ( darkTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(darkTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(darkTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( darkTexture.clampMode, out, version );
-		NifStream( darkTexture.filterMode, out, version );
-		NifStream( darkTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( darkTexture.ps2L, out, version );
-			NifStream( darkTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( darkTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( darkTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( darkTexture.clampMode, out, info );
+		NifStream( darkTexture.filterMode, out, info );
+		NifStream( darkTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( darkTexture.ps2L, out, info );
+			NifStream( darkTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( darkTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( darkTexture.hasTextureTransform, out, info );
 			if ( (darkTexture.hasTextureTransform != 0) ) {
-				NifStream( darkTexture.translation, out, version );
-				NifStream( darkTexture.tiling, out, version );
-				NifStream( darkTexture.wRotation, out, version );
-				NifStream( darkTexture.transformType_, out, version );
-				NifStream( darkTexture.centerOffset, out, version );
+				NifStream( darkTexture.translation, out, info );
+				NifStream( darkTexture.tiling, out, info );
+				NifStream( darkTexture.wRotation, out, info );
+				NifStream( darkTexture.transformType_, out, info );
+				NifStream( darkTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasDetailTexture, out, version );
+	NifStream( hasDetailTexture, out, info );
 	if ( (hasDetailTexture != 0) ) {
 		if ( detailTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(detailTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(detailTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( detailTexture.clampMode, out, version );
-		NifStream( detailTexture.filterMode, out, version );
-		NifStream( detailTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( detailTexture.ps2L, out, version );
-			NifStream( detailTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( detailTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( detailTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( detailTexture.clampMode, out, info );
+		NifStream( detailTexture.filterMode, out, info );
+		NifStream( detailTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( detailTexture.ps2L, out, info );
+			NifStream( detailTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( detailTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( detailTexture.hasTextureTransform, out, info );
 			if ( (detailTexture.hasTextureTransform != 0) ) {
-				NifStream( detailTexture.translation, out, version );
-				NifStream( detailTexture.tiling, out, version );
-				NifStream( detailTexture.wRotation, out, version );
-				NifStream( detailTexture.transformType_, out, version );
-				NifStream( detailTexture.centerOffset, out, version );
+				NifStream( detailTexture.translation, out, info );
+				NifStream( detailTexture.tiling, out, info );
+				NifStream( detailTexture.wRotation, out, info );
+				NifStream( detailTexture.transformType_, out, info );
+				NifStream( detailTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasGlossTexture, out, version );
+	NifStream( hasGlossTexture, out, info );
 	if ( (hasGlossTexture != 0) ) {
 		if ( glossTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(glossTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(glossTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( glossTexture.clampMode, out, version );
-		NifStream( glossTexture.filterMode, out, version );
-		NifStream( glossTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glossTexture.ps2L, out, version );
-			NifStream( glossTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glossTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glossTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( glossTexture.clampMode, out, info );
+		NifStream( glossTexture.filterMode, out, info );
+		NifStream( glossTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glossTexture.ps2L, out, info );
+			NifStream( glossTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glossTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glossTexture.hasTextureTransform, out, info );
 			if ( (glossTexture.hasTextureTransform != 0) ) {
-				NifStream( glossTexture.translation, out, version );
-				NifStream( glossTexture.tiling, out, version );
-				NifStream( glossTexture.wRotation, out, version );
-				NifStream( glossTexture.transformType_, out, version );
-				NifStream( glossTexture.centerOffset, out, version );
+				NifStream( glossTexture.translation, out, info );
+				NifStream( glossTexture.tiling, out, info );
+				NifStream( glossTexture.wRotation, out, info );
+				NifStream( glossTexture.transformType_, out, info );
+				NifStream( glossTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasGlowTexture, out, version );
+	NifStream( hasGlowTexture, out, info );
 	if ( (hasGlowTexture != 0) ) {
 		if ( glowTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(glowTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(glowTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( glowTexture.clampMode, out, version );
-		NifStream( glowTexture.filterMode, out, version );
-		NifStream( glowTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( glowTexture.ps2L, out, version );
-			NifStream( glowTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( glowTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( glowTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( glowTexture.clampMode, out, info );
+		NifStream( glowTexture.filterMode, out, info );
+		NifStream( glowTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( glowTexture.ps2L, out, info );
+			NifStream( glowTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( glowTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( glowTexture.hasTextureTransform, out, info );
 			if ( (glowTexture.hasTextureTransform != 0) ) {
-				NifStream( glowTexture.translation, out, version );
-				NifStream( glowTexture.tiling, out, version );
-				NifStream( glowTexture.wRotation, out, version );
-				NifStream( glowTexture.transformType_, out, version );
-				NifStream( glowTexture.centerOffset, out, version );
+				NifStream( glowTexture.translation, out, info );
+				NifStream( glowTexture.tiling, out, info );
+				NifStream( glowTexture.wRotation, out, info );
+				NifStream( glowTexture.transformType_, out, info );
+				NifStream( glowTexture.centerOffset, out, info );
 			};
 		};
 	};
-	NifStream( hasBumpMapTexture, out, version );
+	NifStream( hasBumpMapTexture, out, info );
 	if ( (hasBumpMapTexture != 0) ) {
 		if ( bumpMapTexture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(bumpMapTexture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(bumpMapTexture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( bumpMapTexture.clampMode, out, version );
-		NifStream( bumpMapTexture.filterMode, out, version );
-		NifStream( bumpMapTexture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( bumpMapTexture.ps2L, out, version );
-			NifStream( bumpMapTexture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( bumpMapTexture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( bumpMapTexture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( bumpMapTexture.clampMode, out, info );
+		NifStream( bumpMapTexture.filterMode, out, info );
+		NifStream( bumpMapTexture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( bumpMapTexture.ps2L, out, info );
+			NifStream( bumpMapTexture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( bumpMapTexture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( bumpMapTexture.hasTextureTransform, out, info );
 			if ( (bumpMapTexture.hasTextureTransform != 0) ) {
-				NifStream( bumpMapTexture.translation, out, version );
-				NifStream( bumpMapTexture.tiling, out, version );
-				NifStream( bumpMapTexture.wRotation, out, version );
-				NifStream( bumpMapTexture.transformType_, out, version );
-				NifStream( bumpMapTexture.centerOffset, out, version );
+				NifStream( bumpMapTexture.translation, out, info );
+				NifStream( bumpMapTexture.tiling, out, info );
+				NifStream( bumpMapTexture.wRotation, out, info );
+				NifStream( bumpMapTexture.transformType_, out, info );
+				NifStream( bumpMapTexture.centerOffset, out, info );
 			};
 		};
-		NifStream( bumpMapLumaScale, out, version );
-		NifStream( bumpMapLumaOffset, out, version );
-		NifStream( bumpMapMatrix, out, version );
+		NifStream( bumpMapLumaScale, out, info );
+		NifStream( bumpMapLumaOffset, out, info );
+		NifStream( bumpMapMatrix, out, info );
 	};
-	NifStream( hasDecal0Texture, out, version );
+	NifStream( hasDecal0Texture, out, info );
 	if ( (hasDecal0Texture != 0) ) {
 		if ( decal0Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal0Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal0Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal0Texture.clampMode, out, version );
-		NifStream( decal0Texture.filterMode, out, version );
-		NifStream( decal0Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal0Texture.ps2L, out, version );
-			NifStream( decal0Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal0Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal0Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal0Texture.clampMode, out, info );
+		NifStream( decal0Texture.filterMode, out, info );
+		NifStream( decal0Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal0Texture.ps2L, out, info );
+			NifStream( decal0Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal0Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal0Texture.hasTextureTransform, out, info );
 			if ( (decal0Texture.hasTextureTransform != 0) ) {
-				NifStream( decal0Texture.translation, out, version );
-				NifStream( decal0Texture.tiling, out, version );
-				NifStream( decal0Texture.wRotation, out, version );
-				NifStream( decal0Texture.transformType_, out, version );
-				NifStream( decal0Texture.centerOffset, out, version );
+				NifStream( decal0Texture.translation, out, info );
+				NifStream( decal0Texture.tiling, out, info );
+				NifStream( decal0Texture.wRotation, out, info );
+				NifStream( decal0Texture.transformType_, out, info );
+				NifStream( decal0Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 8) ) {
-		NifStream( hasDecal1Texture, out, version );
+		NifStream( hasDecal1Texture, out, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
 		if ( decal1Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal1Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal1Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal1Texture.clampMode, out, version );
-		NifStream( decal1Texture.filterMode, out, version );
-		NifStream( decal1Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal1Texture.ps2L, out, version );
-			NifStream( decal1Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal1Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal1Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal1Texture.clampMode, out, info );
+		NifStream( decal1Texture.filterMode, out, info );
+		NifStream( decal1Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal1Texture.ps2L, out, info );
+			NifStream( decal1Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal1Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal1Texture.hasTextureTransform, out, info );
 			if ( (decal1Texture.hasTextureTransform != 0) ) {
-				NifStream( decal1Texture.translation, out, version );
-				NifStream( decal1Texture.tiling, out, version );
-				NifStream( decal1Texture.wRotation, out, version );
-				NifStream( decal1Texture.transformType_, out, version );
-				NifStream( decal1Texture.centerOffset, out, version );
+				NifStream( decal1Texture.translation, out, info );
+				NifStream( decal1Texture.tiling, out, info );
+				NifStream( decal1Texture.wRotation, out, info );
+				NifStream( decal1Texture.transformType_, out, info );
+				NifStream( decal1Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 9) ) {
-		NifStream( hasDecal2Texture, out, version );
+		NifStream( hasDecal2Texture, out, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
 		if ( decal2Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal2Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal2Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal2Texture.clampMode, out, version );
-		NifStream( decal2Texture.filterMode, out, version );
-		NifStream( decal2Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal2Texture.ps2L, out, version );
-			NifStream( decal2Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal2Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal2Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal2Texture.clampMode, out, info );
+		NifStream( decal2Texture.filterMode, out, info );
+		NifStream( decal2Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal2Texture.ps2L, out, info );
+			NifStream( decal2Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal2Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal2Texture.hasTextureTransform, out, info );
 			if ( (decal2Texture.hasTextureTransform != 0) ) {
-				NifStream( decal2Texture.translation, out, version );
-				NifStream( decal2Texture.tiling, out, version );
-				NifStream( decal2Texture.wRotation, out, version );
-				NifStream( decal2Texture.transformType_, out, version );
-				NifStream( decal2Texture.centerOffset, out, version );
+				NifStream( decal2Texture.translation, out, info );
+				NifStream( decal2Texture.tiling, out, info );
+				NifStream( decal2Texture.wRotation, out, info );
+				NifStream( decal2Texture.transformType_, out, info );
+				NifStream( decal2Texture.centerOffset, out, info );
 			};
 		};
 	};
 	if ( (textureCount >= 10) ) {
-		NifStream( hasDecal3Texture, out, version );
+		NifStream( hasDecal3Texture, out, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
 		if ( decal3Texture.source != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(decal3Texture.source) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(decal3Texture.source) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
-		NifStream( decal3Texture.clampMode, out, version );
-		NifStream( decal3Texture.filterMode, out, version );
-		NifStream( decal3Texture.uvSet, out, version );
-		if ( version <= 0x0A020000 ) {
-			NifStream( decal3Texture.ps2L, out, version );
-			NifStream( decal3Texture.ps2K, out, version );
-		};
-		if ( version <= 0x0401000C ) {
-			NifStream( decal3Texture.unknown1, out, version );
-		};
-		if ( version >= 0x0A010000 ) {
-			NifStream( decal3Texture.hasTextureTransform, out, version );
+			NifStream( 0xffffffff, out, info );
+		NifStream( decal3Texture.clampMode, out, info );
+		NifStream( decal3Texture.filterMode, out, info );
+		NifStream( decal3Texture.uvSet, out, info );
+		if ( info.version <= 0x0A020000 ) {
+			NifStream( decal3Texture.ps2L, out, info );
+			NifStream( decal3Texture.ps2K, out, info );
+		};
+		if ( info.version <= 0x0401000C ) {
+			NifStream( decal3Texture.unknown1, out, info );
+		};
+		if ( info.version >= 0x0A010000 ) {
+			NifStream( decal3Texture.hasTextureTransform, out, info );
 			if ( (decal3Texture.hasTextureTransform != 0) ) {
-				NifStream( decal3Texture.translation, out, version );
-				NifStream( decal3Texture.tiling, out, version );
-				NifStream( decal3Texture.wRotation, out, version );
-				NifStream( decal3Texture.transformType_, out, version );
-				NifStream( decal3Texture.centerOffset, out, version );
+				NifStream( decal3Texture.translation, out, info );
+				NifStream( decal3Texture.tiling, out, info );
+				NifStream( decal3Texture.wRotation, out, info );
+				NifStream( decal3Texture.transformType_, out, info );
+				NifStream( decal3Texture.centerOffset, out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A000100 ) {
-		NifStream( numShaderTextures, out, version );
+	if ( info.version >= 0x0A000100 ) {
+		NifStream( numShaderTextures, out, info );
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
-			NifStream( shaderTextures[i2].isUsed, out, version );
+			NifStream( shaderTextures[i2].isUsed, out, info );
 			if ( (shaderTextures[i2].isUsed != 0) ) {
 				if ( shaderTextures[i2].textureData.source != NULL )
-					NifStream( link_map.find( StaticCast<NiObject>(shaderTextures[i2].textureData.source) )->second, out, version );
+					NifStream( link_map.find( StaticCast<NiObject>(shaderTextures[i2].textureData.source) )->second, out, info );
 				else
-					NifStream( 0xffffffff, out, version );
-				NifStream( shaderTextures[i2].textureData.clampMode, out, version );
-				NifStream( shaderTextures[i2].textureData.filterMode, out, version );
-				NifStream( shaderTextures[i2].textureData.uvSet, out, version );
-				if ( version <= 0x0A020000 ) {
-					NifStream( shaderTextures[i2].textureData.ps2L, out, version );
-					NifStream( shaderTextures[i2].textureData.ps2K, out, version );
+					NifStream( 0xffffffff, out, info );
+				NifStream( shaderTextures[i2].textureData.clampMode, out, info );
+				NifStream( shaderTextures[i2].textureData.filterMode, out, info );
+				NifStream( shaderTextures[i2].textureData.uvSet, out, info );
+				if ( info.version <= 0x0A020000 ) {
+					NifStream( shaderTextures[i2].textureData.ps2L, out, info );
+					NifStream( shaderTextures[i2].textureData.ps2K, out, info );
 				};
-				if ( version <= 0x0401000C ) {
-					NifStream( shaderTextures[i2].textureData.unknown1, out, version );
+				if ( info.version <= 0x0401000C ) {
+					NifStream( shaderTextures[i2].textureData.unknown1, out, info );
 				};
-				if ( version >= 0x0A010000 ) {
-					NifStream( shaderTextures[i2].textureData.hasTextureTransform, out, version );
+				if ( info.version >= 0x0A010000 ) {
+					NifStream( shaderTextures[i2].textureData.hasTextureTransform, out, info );
 					if ( (shaderTextures[i2].textureData.hasTextureTransform != 0) ) {
-						NifStream( shaderTextures[i2].textureData.translation, out, version );
-						NifStream( shaderTextures[i2].textureData.tiling, out, version );
-						NifStream( shaderTextures[i2].textureData.wRotation, out, version );
-						NifStream( shaderTextures[i2].textureData.transformType_, out, version );
-						NifStream( shaderTextures[i2].textureData.centerOffset, out, version );
+						NifStream( shaderTextures[i2].textureData.translation, out, info );
+						NifStream( shaderTextures[i2].textureData.tiling, out, info );
+						NifStream( shaderTextures[i2].textureData.wRotation, out, info );
+						NifStream( shaderTextures[i2].textureData.transformType_, out, info );
+						NifStream( shaderTextures[i2].textureData.centerOffset, out, info );
 					};
 				};
-				NifStream( shaderTextures[i2].unknownInt, out, version );
+				NifStream( shaderTextures[i2].unknownInt, out, info );
 			};
 		};
 	};
@@ -12598,42 +12598,42 @@ std::string NiTexturingProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTexturingProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiTexturingProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 	if ( (hasBaseTexture != 0) ) {
-		baseTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		baseTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDarkTexture != 0) ) {
-		darkTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		darkTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDetailTexture != 0) ) {
-		detailTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		detailTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasGlossTexture != 0) ) {
-		glossTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		glossTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasGlowTexture != 0) ) {
-		glowTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		glowTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasBumpMapTexture != 0) ) {
-		bumpMapTexture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		bumpMapTexture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (hasDecal0Texture != 0) ) {
-		decal0Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal0Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 8)) && ((hasDecal1Texture != 0))) ) {
-		decal1Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal1Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 9)) && ((hasDecal2Texture != 0))) ) {
-		decal2Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal2Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
 	if ( (((textureCount >= 10)) && ((hasDecal3Texture != 0))) ) {
-		decal3Texture.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+		decal3Texture.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 	};
-	if ( version >= 0x0A000100 ) {
+	if ( info.version >= 0x0A000100 ) {
 		for (unsigned int i2 = 0; i2 < shaderTextures.size(); i2++) {
 			if ( (shaderTextures[i2].isUsed != 0) ) {
-				shaderTextures[i2].textureData.source = FixLink<NiSourceTexture>( objects, link_stack, version );
+				shaderTextures[i2].textureData.source = FixLink<NiSourceTexture>( objects, link_stack, info );
 			};
 		};
 	};
@@ -12669,12 +12669,12 @@ std::list<NiObjectRef> NiTexturingProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
+void NiTransformController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::Read( in, link_stack, info );
 }
 
-void NiTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
+void NiTransformController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
 }
 
 std::string NiTransformController::InternalAsString( bool verbose ) const {
@@ -12684,8 +12684,8 @@ std::string NiTransformController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
+void NiTransformController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformController::InternalGetRefs() const {
@@ -12694,12 +12694,12 @@ std::list<NiObjectRef> NiTransformController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeData::Read( in, link_stack, version, user_version );
+void NiTransformData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeData::Read( in, link_stack, info );
 }
 
-void NiTransformData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiKeyframeData::Write( out, link_map, version, user_version );
+void NiTransformData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiKeyframeData::Write( out, link_map, info );
 }
 
 std::string NiTransformData::InternalAsString( bool verbose ) const {
@@ -12709,8 +12709,8 @@ std::string NiTransformData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiKeyframeData::FixLinks( objects, link_stack, version, user_version );
+void NiTransformData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiKeyframeData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformData::InternalGetRefs() const {
@@ -12719,35 +12719,35 @@ std::list<NiObjectRef> NiTransformData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiTransformInterpolator::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( translation, in, version );
-	NifStream( rotation, in, version );
-	NifStream( scale, in, version );
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+	NiInterpolator::Read( in, link_stack, info );
+	NifStream( translation, in, info );
+	NifStream( rotation, in, info );
+	NifStream( scale, in, info );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( unknownBytes[i2], in, version );
+			NifStream( unknownBytes[i2], in, info );
 		};
 	};
-	NifStream( block_num, in, version );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiInterpolator::Write( out, link_map, version, user_version );
-	NifStream( translation, out, version );
-	NifStream( rotation, out, version );
-	NifStream( scale, out, version );
-	if ( ( version >= 0x0A01006A ) && ( version <= 0x0A01006A ) ) {
+void NiTransformInterpolator::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiInterpolator::Write( out, link_map, info );
+	NifStream( translation, out, info );
+	NifStream( rotation, out, info );
+	NifStream( scale, out, info );
+	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 		for (unsigned int i2 = 0; i2 < 3; i2++) {
-			NifStream( unknownBytes[i2], out, version );
+			NifStream( unknownBytes[i2], out, info );
 		};
 	};
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
@@ -12773,9 +12773,9 @@ std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiTransformData>( objects, link_stack, version );
+void NiTransformInterpolator::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiInterpolator::FixLinks( objects, link_stack, info );
+	data = FixLink<NiTransformData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTransformInterpolator::InternalGetRefs() const {
@@ -12786,12 +12786,12 @@ std::list<NiObjectRef> NiTransformInterpolator::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriShape::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiTriShape::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiTriShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiTriShape::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiTriShape::InternalAsString( bool verbose ) const {
@@ -12801,8 +12801,8 @@ std::string NiTriShape::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiTriShape::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriShape::InternalGetRefs() const {
@@ -12811,62 +12811,62 @@ std::list<NiObjectRef> NiTriShape::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriShapeData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( numTrianglePoints, in, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasTriangles, in, version );
+void NiTriShapeData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( numTrianglePoints, in, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasTriangles, in, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		triangles.resize(numTriangles);
 		for (unsigned int i2 = 0; i2 < triangles.size(); i2++) {
-			NifStream( triangles[i2], in, version );
+			NifStream( triangles[i2], in, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasTriangles != 0) ) {
 			triangles.resize(numTriangles);
 			for (unsigned int i3 = 0; i3 < triangles.size(); i3++) {
-				NifStream( triangles[i3], in, version );
+				NifStream( triangles[i3], in, info );
 			};
 		};
 	};
-	NifStream( numMatchGroups, in, version );
+	NifStream( numMatchGroups, in, info );
 	matchGroups.resize(numMatchGroups);
 	for (unsigned int i1 = 0; i1 < matchGroups.size(); i1++) {
-		NifStream( matchGroups[i1].numVertices, in, version );
+		NifStream( matchGroups[i1].numVertices, in, info );
 		matchGroups[i1].vertexIndices.resize(matchGroups[i1].numVertices);
 		for (unsigned int i2 = 0; i2 < matchGroups[i1].vertexIndices.size(); i2++) {
-			NifStream( matchGroups[i1].vertexIndices[i2], in, version );
+			NifStream( matchGroups[i1].vertexIndices[i2], in, info );
 		};
 	};
 }
 
-void NiTriShapeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiTriShapeData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	numMatchGroups = (unsigned short)(matchGroups.size());
-	NifStream( numTrianglePoints, out, version );
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasTriangles, out, version );
+	NifStream( numTrianglePoints, out, info );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasTriangles, out, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		for (unsigned int i2 = 0; i2 < triangles.size(); i2++) {
-			NifStream( triangles[i2], out, version );
+			NifStream( triangles[i2], out, info );
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasTriangles != 0) ) {
 			for (unsigned int i3 = 0; i3 < triangles.size(); i3++) {
-				NifStream( triangles[i3], out, version );
+				NifStream( triangles[i3], out, info );
 			};
 		};
 	};
-	NifStream( numMatchGroups, out, version );
+	NifStream( numMatchGroups, out, info );
 	for (unsigned int i1 = 0; i1 < matchGroups.size(); i1++) {
 		matchGroups[i1].numVertices = (unsigned short)(matchGroups[i1].vertexIndices.size());
-		NifStream( matchGroups[i1].numVertices, out, version );
+		NifStream( matchGroups[i1].numVertices, out, info );
 		for (unsigned int i2 = 0; i2 < matchGroups[i1].vertexIndices.size(); i2++) {
-			NifStream( matchGroups[i1].vertexIndices[i2], out, version );
+			NifStream( matchGroups[i1].vertexIndices[i2], out, info );
 		};
 	};
 }
@@ -12915,8 +12915,8 @@ std::string NiTriShapeData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriShapeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiTriShapeData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriShapeData::InternalGetRefs() const {
@@ -12925,12 +12925,12 @@ std::list<NiObjectRef> NiTriShapeData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriStrips::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiTriStrips::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiTriStrips::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiTriStrips::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiTriStrips::InternalAsString( bool verbose ) const {
@@ -12940,8 +12940,8 @@ std::string NiTriStrips::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStrips::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiTriStrips::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriStrips::InternalGetRefs() const {
@@ -12950,62 +12950,62 @@ std::list<NiObjectRef> NiTriStrips::InternalGetRefs() const {
 	return refs;
 }
 
-void NiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( numStrips, in, version );
+void NiTriStripsData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( numStrips, in, info );
 	stripLengths.resize(numStrips);
 	for (unsigned int i1 = 0; i1 < stripLengths.size(); i1++) {
-		NifStream( stripLengths[i1], in, version );
+		NifStream( stripLengths[i1], in, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasPoints, in, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasPoints, in, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		points.resize(numStrips);
 		for (unsigned int i2 = 0; i2 < points.size(); i2++) {
 			points[i2].resize(stripLengths[i2]);
 			for (unsigned int i3 = 0; i3 < stripLengths[i2]; i3++) {
-				NifStream( points[i2][i3], in, version );
+				NifStream( points[i2][i3], in, info );
 			};
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasPoints != 0) ) {
 			points.resize(numStrips);
 			for (unsigned int i3 = 0; i3 < points.size(); i3++) {
 				points[i3].resize(stripLengths[i3]);
 				for (unsigned int i4 = 0; i4 < stripLengths[i3]; i4++) {
-					NifStream( points[i3][i4], in, version );
+					NifStream( points[i3][i4], in, info );
 				};
 			};
 		};
 	};
 }
 
-void NiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiTriStripsData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < points.size(); i1++)
 		stripLengths[i1] = (unsigned short)(points[i1].size());
 	numStrips = (unsigned short)(stripLengths.size());
-	NifStream( numStrips, out, version );
+	NifStream( numStrips, out, info );
 	for (unsigned int i1 = 0; i1 < stripLengths.size(); i1++) {
-		NifStream( stripLengths[i1], out, version );
+		NifStream( stripLengths[i1], out, info );
 	};
-	if ( version >= 0x0A010000 ) {
-		NifStream( hasPoints, out, version );
+	if ( info.version >= 0x0A010000 ) {
+		NifStream( hasPoints, out, info );
 	};
-	if ( version <= 0x0A000102 ) {
+	if ( info.version <= 0x0A000102 ) {
 		for (unsigned int i2 = 0; i2 < points.size(); i2++) {
 			for (unsigned int i3 = 0; i3 < stripLengths[i2]; i3++) {
-				NifStream( points[i2][i3], out, version );
+				NifStream( points[i2][i3], out, info );
 			};
 		};
 	};
-	if ( version >= 0x0A010000 ) {
+	if ( info.version >= 0x0A010000 ) {
 		if ( (hasPoints != 0) ) {
 			for (unsigned int i3 = 0; i3 < points.size(); i3++) {
 				for (unsigned int i4 = 0; i4 < stripLengths[i3]; i4++) {
-					NifStream( points[i3][i4], out, version );
+					NifStream( points[i3][i4], out, info );
 				};
 			};
 		};
@@ -13050,8 +13050,8 @@ std::string NiTriStripsData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiTriStripsData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiTriStripsData::InternalGetRefs() const {
@@ -13060,12 +13060,12 @@ std::list<NiObjectRef> NiTriStripsData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClod::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::Read( in, link_stack, version, user_version );
+void NiClod::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::Read( in, link_stack, info );
 }
 
-void NiClod::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeom::Write( out, link_map, version, user_version );
+void NiClod::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeom::Write( out, link_map, info );
 }
 
 std::string NiClod::InternalAsString( bool verbose ) const {
@@ -13075,8 +13075,8 @@ std::string NiClod::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClod::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeom::FixLinks( objects, link_stack, version, user_version );
+void NiClod::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeom::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClod::InternalGetRefs() const {
@@ -13085,54 +13085,54 @@ std::list<NiObjectRef> NiClod::InternalGetRefs() const {
 	return refs;
 }
 
-void NiClodData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::Read( in, link_stack, version, user_version );
-	NifStream( unknownShorts, in, version );
-	NifStream( unknownCount1, in, version );
-	NifStream( unknownCount2, in, version );
-	NifStream( unknownCount3, in, version );
-	NifStream( unknownFloat, in, version );
-	NifStream( unknownShort, in, version );
+void NiClodData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::Read( in, link_stack, info );
+	NifStream( unknownShorts, in, info );
+	NifStream( unknownCount1, in, info );
+	NifStream( unknownCount2, in, info );
+	NifStream( unknownCount3, in, info );
+	NifStream( unknownFloat, in, info );
+	NifStream( unknownShort, in, info );
 	unknownClodShorts1.resize(unknownCount1);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts1[i1][i2], in, version );
+			NifStream( unknownClodShorts1[i1][i2], in, info );
 		};
 	};
 	unknownClodShorts2.resize(unknownCount2);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts2.size(); i1++) {
-		NifStream( unknownClodShorts2[i1], in, version );
+		NifStream( unknownClodShorts2[i1], in, info );
 	};
 	unknownClodShorts3.resize(unknownCount3);
 	for (unsigned int i1 = 0; i1 < unknownClodShorts3.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts3[i1][i2], in, version );
+			NifStream( unknownClodShorts3[i1][i2], in, info );
 		};
 	};
 }
 
-void NiClodData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTriBasedGeomData::Write( out, link_map, version, user_version );
+void NiClodData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTriBasedGeomData::Write( out, link_map, info );
 	unknownCount3 = (unsigned short)(unknownClodShorts3.size());
 	unknownCount2 = (unsigned short)(unknownClodShorts2.size());
 	unknownCount1 = (unsigned short)(unknownClodShorts1.size());
-	NifStream( unknownShorts, out, version );
-	NifStream( unknownCount1, out, version );
-	NifStream( unknownCount2, out, version );
-	NifStream( unknownCount3, out, version );
-	NifStream( unknownFloat, out, version );
-	NifStream( unknownShort, out, version );
+	NifStream( unknownShorts, out, info );
+	NifStream( unknownCount1, out, info );
+	NifStream( unknownCount2, out, info );
+	NifStream( unknownCount3, out, info );
+	NifStream( unknownFloat, out, info );
+	NifStream( unknownShort, out, info );
 	for (unsigned int i1 = 0; i1 < unknownClodShorts1.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts1[i1][i2], out, version );
+			NifStream( unknownClodShorts1[i1][i2], out, info );
 		};
 	};
 	for (unsigned int i1 = 0; i1 < unknownClodShorts2.size(); i1++) {
-		NifStream( unknownClodShorts2[i1], out, version );
+		NifStream( unknownClodShorts2[i1], out, info );
 	};
 	for (unsigned int i1 = 0; i1 < unknownClodShorts3.size(); i1++) {
 		for (unsigned int i2 = 0; i2 < 6; i2++) {
-			NifStream( unknownClodShorts3[i1][i2], out, version );
+			NifStream( unknownClodShorts3[i1][i2], out, info );
 		};
 	};
 }
@@ -13193,8 +13193,8 @@ std::string NiClodData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiClodData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTriBasedGeomData::FixLinks( objects, link_stack, version, user_version );
+void NiClodData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTriBasedGeomData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiClodData::InternalGetRefs() const {
@@ -13203,21 +13203,21 @@ std::list<NiObjectRef> NiClodData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiUVController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiUVController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiTimeController::Read( in, link_stack, version, user_version );
-	NifStream( unknownShort, in, version );
-	NifStream( block_num, in, version );
+	NiTimeController::Read( in, link_stack, info );
+	NifStream( unknownShort, in, info );
+	NifStream( block_num, in, info );
 	link_stack.push_back( block_num );
 }
 
-void NiUVController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiTimeController::Write( out, link_map, version, user_version );
-	NifStream( unknownShort, out, version );
+void NiUVController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiTimeController::Write( out, link_map, info );
+	NifStream( unknownShort, out, info );
 	if ( data != NULL )
-		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+		NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 	else
-		NifStream( 0xffffffff, out, version );
+		NifStream( 0xffffffff, out, info );
 }
 
 std::string NiUVController::InternalAsString( bool verbose ) const {
@@ -13229,9 +13229,9 @@ std::string NiUVController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiTimeController::FixLinks( objects, link_stack, version, user_version );
-	data = FixLink<NiUVData>( objects, link_stack, version );
+void NiUVController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiTimeController::FixLinks( objects, link_stack, info );
+	data = FixLink<NiUVData>( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiUVController::InternalGetRefs() const {
@@ -13242,30 +13242,30 @@ std::list<NiObjectRef> NiUVController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiUVData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::Read( in, link_stack, version, user_version );
+void NiUVData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::Read( in, link_stack, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
-		NifStream( uvGroups[i1].numKeys, in, version );
+		NifStream( uvGroups[i1].numKeys, in, info );
 		if ( (uvGroups[i1].numKeys != 0) ) {
-			NifStream( uvGroups[i1].interpolation, in, version );
+			NifStream( uvGroups[i1].interpolation, in, info );
 		};
 		uvGroups[i1].keys.resize(uvGroups[i1].numKeys);
 		for (unsigned int i2 = 0; i2 < uvGroups[i1].keys.size(); i2++) {
-			NifStream( uvGroups[i1].keys[i2], in, version, uvGroups[i1].interpolation );
+			NifStream( uvGroups[i1].keys[i2], in, info, uvGroups[i1].interpolation );
 		};
 	};
 }
 
-void NiUVData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiObject::Write( out, link_map, version, user_version );
+void NiUVData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiObject::Write( out, link_map, info );
 	for (unsigned int i1 = 0; i1 < 4; i1++) {
 		uvGroups[i1].numKeys = (unsigned int)(uvGroups[i1].keys.size());
-		NifStream( uvGroups[i1].numKeys, out, version );
+		NifStream( uvGroups[i1].numKeys, out, info );
 		if ( (uvGroups[i1].numKeys != 0) ) {
-			NifStream( uvGroups[i1].interpolation, out, version );
+			NifStream( uvGroups[i1].interpolation, out, info );
 		};
 		for (unsigned int i2 = 0; i2 < uvGroups[i1].keys.size(); i2++) {
-			NifStream( uvGroups[i1].keys[i2], out, version, uvGroups[i1].interpolation );
+			NifStream( uvGroups[i1].keys[i2], out, info, uvGroups[i1].interpolation );
 		};
 	};
 }
@@ -13301,8 +13301,8 @@ std::string NiUVData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiUVData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiObject::FixLinks( objects, link_stack, version, user_version );
+void NiUVData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiObject::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiUVData::InternalGetRefs() const {
@@ -13311,16 +13311,16 @@ std::list<NiObjectRef> NiUVData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVectorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( vectorData, in, version );
-	NifStream( unknownFloat, in, version );
+void NiVectorExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( vectorData, in, info );
+	NifStream( unknownFloat, in, info );
 }
 
-void NiVectorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
-	NifStream( vectorData, out, version );
-	NifStream( unknownFloat, out, version );
+void NiVectorExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
+	NifStream( vectorData, out, info );
+	NifStream( unknownFloat, out, info );
 }
 
 std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
@@ -13332,8 +13332,8 @@ std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVectorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiVectorExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVectorExtraData::InternalGetRefs() const {
@@ -13342,18 +13342,18 @@ std::list<NiObjectRef> NiVectorExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVertexColorProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	NifStream( vertexMode, in, version );
-	NifStream( lightingMode, in, version );
+void NiVertexColorProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	NifStream( vertexMode, in, info );
+	NifStream( lightingMode, in, info );
 }
 
-void NiVertexColorProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	NifStream( vertexMode, out, version );
-	NifStream( lightingMode, out, version );
+void NiVertexColorProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	NifStream( vertexMode, out, info );
+	NifStream( lightingMode, out, info );
 }
 
 std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
@@ -13366,8 +13366,8 @@ std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertexColorProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiVertexColorProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVertexColorProperty::InternalGetRefs() const {
@@ -13376,23 +13376,23 @@ std::list<NiObjectRef> NiVertexColorProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVertWeightsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::Read( in, link_stack, version, user_version );
-	NifStream( numBytes, in, version );
-	NifStream( numVertices, in, version );
+void NiVertWeightsExtraData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::Read( in, link_stack, info );
+	NifStream( numBytes, in, info );
+	NifStream( numVertices, in, info );
 	weight.resize(numVertices);
 	for (unsigned int i1 = 0; i1 < weight.size(); i1++) {
-		NifStream( weight[i1], in, version );
+		NifStream( weight[i1], in, info );
 	};
 }
 
-void NiVertWeightsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiExtraData::Write( out, link_map, version, user_version );
+void NiVertWeightsExtraData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiExtraData::Write( out, link_map, info );
 	numVertices = (unsigned short)(weight.size());
-	NifStream( numBytes, out, version );
-	NifStream( numVertices, out, version );
+	NifStream( numBytes, out, info );
+	NifStream( numVertices, out, info );
 	for (unsigned int i1 = 0; i1 < weight.size(); i1++) {
-		NifStream( weight[i1], out, version );
+		NifStream( weight[i1], out, info );
 	};
 }
 
@@ -13418,8 +13418,8 @@ std::string NiVertWeightsExtraData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVertWeightsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiExtraData::FixLinks( objects, link_stack, version, user_version );
+void NiVertWeightsExtraData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiExtraData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVertWeightsExtraData::InternalGetRefs() const {
@@ -13428,22 +13428,22 @@ std::list<NiObjectRef> NiVertWeightsExtraData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVisController::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
+void NiVisController::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
 	unsigned int block_num;
-	NiSingleInterpolatorController::Read( in, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		NifStream( block_num, in, version );
+	NiSingleInterpolatorController::Read( in, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		NifStream( block_num, in, info );
 		link_stack.push_back( block_num );
 	};
 }
 
-void NiVisController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiSingleInterpolatorController::Write( out, link_map, version, user_version );
-	if ( version <= 0x0A010000 ) {
+void NiVisController::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiSingleInterpolatorController::Write( out, link_map, info );
+	if ( info.version <= 0x0A010000 ) {
 		if ( data != NULL )
-			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, version );
+			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
 		else
-			NifStream( 0xffffffff, out, version );
+			NifStream( 0xffffffff, out, info );
 	};
 }
 
@@ -13455,10 +13455,10 @@ std::string NiVisController::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiSingleInterpolatorController::FixLinks( objects, link_stack, version, user_version );
-	if ( version <= 0x0A010000 ) {
-		data = FixLink<NiVisData>( objects, link_stack, version );
+void NiVisController::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiSingleInterpolatorController::FixLinks( objects, link_stack, info );
+	if ( info.version <= 0x0A010000 ) {
+		data = FixLink<NiVisData>( objects, link_stack, info );
 	};
 }
 
@@ -13470,21 +13470,21 @@ std::list<NiObjectRef> NiVisController::InternalGetRefs() const {
 	return refs;
 }
 
-void NiVisData::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::Read( in, link_stack, version, user_version );
-	NifStream( numVisKeys, in, version );
+void NiVisData::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::Read( in, link_stack, info );
+	NifStream( numVisKeys, in, info );
 	visKeys.resize(numVisKeys);
 	for (unsigned int i1 = 0; i1 < visKeys.size(); i1++) {
-		NifStream( visKeys[i1], in, version, 1 );
+		NifStream( visKeys[i1], in, info, 1 );
 	};
 }
 
-void NiVisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	AKeyedData::Write( out, link_map, version, user_version );
+void NiVisData::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	AKeyedData::Write( out, link_map, info );
 	numVisKeys = (unsigned int)(visKeys.size());
-	NifStream( numVisKeys, out, version );
+	NifStream( numVisKeys, out, info );
 	for (unsigned int i1 = 0; i1 < visKeys.size(); i1++) {
-		NifStream( visKeys[i1], out, version, 1 );
+		NifStream( visKeys[i1], out, info, 1 );
 	};
 }
 
@@ -13509,8 +13509,8 @@ std::string NiVisData::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiVisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	AKeyedData::FixLinks( objects, link_stack, version, user_version );
+void NiVisData::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	AKeyedData::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiVisData::InternalGetRefs() const {
@@ -13519,14 +13519,14 @@ std::list<NiObjectRef> NiVisData::InternalGetRefs() const {
 	return refs;
 }
 
-void NiWireframeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
+void NiWireframeProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
 }
 
-void NiWireframeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
+void NiWireframeProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
 }
 
 std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
@@ -13537,8 +13537,8 @@ std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiWireframeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiWireframeProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiWireframeProperty::InternalGetRefs() const {
@@ -13547,19 +13547,19 @@ std::list<NiObjectRef> NiWireframeProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void NiZBufferProperty::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::Read( in, link_stack, version, user_version );
-	NifStream( flags, in, version );
-	if ( version >= 0x0401000C ) {
-		NifStream( function, in, version );
+void NiZBufferProperty::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::Read( in, link_stack, info );
+	NifStream( flags, in, info );
+	if ( info.version >= 0x0401000C ) {
+		NifStream( function, in, info );
 	};
 }
 
-void NiZBufferProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiProperty::Write( out, link_map, version, user_version );
-	NifStream( flags, out, version );
-	if ( version >= 0x0401000C ) {
-		NifStream( function, out, version );
+void NiZBufferProperty::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiProperty::Write( out, link_map, info );
+	NifStream( flags, out, info );
+	if ( info.version >= 0x0401000C ) {
+		NifStream( function, out, info );
 	};
 }
 
@@ -13572,8 +13572,8 @@ std::string NiZBufferProperty::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void NiZBufferProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiProperty::FixLinks( objects, link_stack, version, user_version );
+void NiZBufferProperty::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiProperty::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> NiZBufferProperty::InternalGetRefs() const {
@@ -13582,12 +13582,12 @@ std::list<NiObjectRef> NiZBufferProperty::InternalGetRefs() const {
 	return refs;
 }
 
-void RootCollisionNode::InternalRead( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::Read( in, link_stack, version, user_version );
+void RootCollisionNode::InternalRead( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::Read( in, link_stack, info );
 }
 
-void RootCollisionNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	NiNode::Write( out, link_map, version, user_version );
+void RootCollisionNode::InternalWrite( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	NiNode::Write( out, link_map, info );
 }
 
 std::string RootCollisionNode::InternalAsString( bool verbose ) const {
@@ -13597,8 +13597,8 @@ std::string RootCollisionNode::InternalAsString( bool verbose ) const {
 	return out.str();
 }
 
-void RootCollisionNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	NiNode::FixLinks( objects, link_stack, version, user_version );
+void RootCollisionNode::InternalFixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	NiNode::FixLinks( objects, link_stack, info );
 }
 
 std::list<NiObjectRef> RootCollisionNode::InternalGetRefs() const {
diff --git a/src/niflib.cpp b/src/niflib.cpp
index 273f9a57..a8592a77 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -128,10 +128,10 @@ unsigned int GetNifVersion( string const & file_name ) {
 	//--Read Header String--//
 
 	HeaderString header;
-	unsigned version;
-	NifStream( header, in, version );
+	NifInfo info;
+	NifStream( header, in, info );
 
-	return version;
+	return info.version;
 }
 
 vector<NiObjectRef> ReadNifList( string const & file_name, NifInfo * info ) {
@@ -148,23 +148,28 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 	//--Read Header--//
 	Header header;
 
+	//Create a new NifInfo if one isn't given.
+	bool delete_info = false;
+	if ( info == NULL ) {
+		info = new NifInfo();
+		delete_info = true;
+	}
+
 	//Read header.
-	header.Read( in );
+	*info = header.Read( in );
 
 	//If NifInfo structure is provided, fill it with info from header
-	if ( info != NULL ) {
-		info->version = header.version;
-		info->userVersion = header.userVersion;
-		info->userVersion2 = header.userVersion2;
-		if ( header.endianType == 0) {
-			info->endian = NifInfo::INFO_BIG_ENDIAN;
-		} else {
-			info->endian = NifInfo::INFO_LITTLE_ENDIAN;
-		}
-		info->creator = header.creator.str;
-		info->exportInfo1 = header.exportInfo1.str;
-		info->exportInfo2 = header.exportInfo2.str;
+	info->version = header.version;
+	info->userVersion = header.userVersion;
+	info->userVersion2 = header.userVersion2;
+	if ( header.endianType == 0) {
+		info->endian = BIG_ENDIAN;
+	} else {
+		info->endian = LITTLE_ENDIAN;
 	}
+	info->creator = header.creator.str;
+	info->exportInfo1 = header.exportInfo1.str;
+	info->exportInfo2 = header.exportInfo2.str;
 
 #ifdef DEBUG_HEADER_FOOTER
 	//Print debug output for header
@@ -305,7 +310,7 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 		}
 
 		//Read new object
-		new_obj->Read( in, link_stack, header.version, header.userVersion );
+		new_obj->Read( in, link_stack, *info );
 		objects[index] = new_obj;
 			
 #ifdef PRINT_OBJECT_CONTENTS
@@ -324,7 +329,7 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 
 	//--Read Footer--//
 	Footer footer;
-	footer.Read( in, link_stack, header.version, header.userVersion );
+	footer.Read( in, link_stack, *info );
 
 #ifdef DEBUG_HEADER_FOOTER
 	//Print footer debug output
@@ -356,12 +361,17 @@ vector<NiObjectRef> ReadNifList( istream & in, NifInfo * info ) {
 		cout << it->first << ":  " << it->second << endl;
 #endif
 		//Fix links & other pre-processing
-		it->second->FixLinks( objects, link_stack, header.version, header.userVersion );
+		it->second->FixLinks( objects, link_stack, *info );
 
 		//Add object to list
 		obj_list.push_back(it->second);
 	}
 
+	//delete info if it was dynamically allocated
+	if ( delete_info ) {
+		delete info;
+	}
+
 	//Return completed block list
 	return obj_list;
 }
@@ -437,7 +447,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
 			WriteUInt( 0, out );
 		}
 
-		objects[i]->Write( out, link_map, version, user_version );
+		objects[i]->Write( out, link_map, info );
 	}
 
 	//--Write Footer--//
@@ -461,7 +471,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
       footer.numRoots = roots.size();
       footer.roots.insert(footer.roots.end(), roots.begin(), roots.end());
    }
-	footer.Write( out, link_map, version, user_version );
+	footer.Write( out, link_map, info );
 }
 
 // Writes a valid Nif File given a file name, a pointer to the root block of a file tree
diff --git a/src/obj/ABoneLODController.cpp b/src/obj/ABoneLODController.cpp
index 3086e37f..609d6e91 100644
--- a/src/obj/ABoneLODController.cpp
+++ b/src/obj/ABoneLODController.cpp
@@ -14,20 +14,20 @@ ABoneLODController::ABoneLODController() A_BONE_L_O_D_CONTROLLER_CONSTRUCT {}
 
 ABoneLODController::~ABoneLODController() {}
 
-void ABoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void ABoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void ABoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void ABoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string ABoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void ABoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void ABoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> ABoneLODController::GetRefs() const {
diff --git a/src/obj/AKeyedData.cpp b/src/obj/AKeyedData.cpp
index b946d4e0..d40631c0 100644
--- a/src/obj/AKeyedData.cpp
+++ b/src/obj/AKeyedData.cpp
@@ -11,20 +11,20 @@ AKeyedData::AKeyedData() A_KEYED_DATA_CONSTRUCT {}
 
 AKeyedData::~AKeyedData() {}
 
-void AKeyedData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AKeyedData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AKeyedData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AKeyedData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AKeyedData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AKeyedData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AKeyedData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AKeyedData::GetRefs() const {
diff --git a/src/obj/APSysCtlr.cpp b/src/obj/APSysCtlr.cpp
index 545e2357..492da492 100644
--- a/src/obj/APSysCtlr.cpp
+++ b/src/obj/APSysCtlr.cpp
@@ -11,20 +11,20 @@ APSysCtlr::APSysCtlr() A_P_SYS_CTLR_CONSTRUCT {}
 
 APSysCtlr::~APSysCtlr() {}
 
-void APSysCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void APSysCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void APSysCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void APSysCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string APSysCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void APSysCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void APSysCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> APSysCtlr::GetRefs() const {
diff --git a/src/obj/APSysData.cpp b/src/obj/APSysData.cpp
index 14fc2a24..759f3eba 100644
--- a/src/obj/APSysData.cpp
+++ b/src/obj/APSysData.cpp
@@ -11,20 +11,20 @@ APSysData::APSysData() A_P_SYS_DATA_CONSTRUCT {}
 
 APSysData::~APSysData() {}
 
-void APSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void APSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void APSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void APSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string APSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void APSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void APSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> APSysData::GetRefs() const {
diff --git a/src/obj/AParticleModifier.cpp b/src/obj/AParticleModifier.cpp
index 126b0beb..fc90e3ea 100644
--- a/src/obj/AParticleModifier.cpp
+++ b/src/obj/AParticleModifier.cpp
@@ -12,20 +12,20 @@ AParticleModifier::AParticleModifier() A_PARTICLE_MODIFIER_CONSTRUCT {}
 
 AParticleModifier::~AParticleModifier() {}
 
-void AParticleModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AParticleModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AParticleModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AParticleModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AParticleModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AParticleModifier::GetRefs() const {
diff --git a/src/obj/AbhkConstraint.cpp b/src/obj/AbhkConstraint.cpp
index 75d2c006..ea67dcc5 100644
--- a/src/obj/AbhkConstraint.cpp
+++ b/src/obj/AbhkConstraint.cpp
@@ -12,20 +12,20 @@ AbhkConstraint::AbhkConstraint() ABHK_CONSTRAINT_CONSTRUCT {}
 
 AbhkConstraint::~AbhkConstraint() {}
 
-void AbhkConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkConstraint::GetRefs() const {
diff --git a/src/obj/AbhkRagdollConstraint.cpp b/src/obj/AbhkRagdollConstraint.cpp
index 8ce47f1f..b881c7f7 100644
--- a/src/obj/AbhkRagdollConstraint.cpp
+++ b/src/obj/AbhkRagdollConstraint.cpp
@@ -11,20 +11,20 @@ AbhkRagdollConstraint::AbhkRagdollConstraint() ABHK_RAGDOLL_CONSTRAINT_CONSTRUCT
 
 AbhkRagdollConstraint::~AbhkRagdollConstraint() {}
 
-void AbhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkRagdollConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkRagdollConstraint::GetRefs() const {
diff --git a/src/obj/AbhkShapeCollection.cpp b/src/obj/AbhkShapeCollection.cpp
index 4f0427b3..1c022da7 100644
--- a/src/obj/AbhkShapeCollection.cpp
+++ b/src/obj/AbhkShapeCollection.cpp
@@ -11,20 +11,20 @@ AbhkShapeCollection::AbhkShapeCollection() ABHK_SHAPE_COLLECTION_CONSTRUCT {}
 
 AbhkShapeCollection::~AbhkShapeCollection() {}
 
-void AbhkShapeCollection::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AbhkShapeCollection::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AbhkShapeCollection::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AbhkShapeCollection::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AbhkShapeCollection::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AbhkShapeCollection::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AbhkShapeCollection::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AbhkShapeCollection::GetRefs() const {
diff --git a/src/obj/AvoidNode.cpp b/src/obj/AvoidNode.cpp
index 8ec6093e..fafb4882 100644
--- a/src/obj/AvoidNode.cpp
+++ b/src/obj/AvoidNode.cpp
@@ -11,20 +11,20 @@ AvoidNode::AvoidNode() AVOID_NODE_CONSTRUCT {}
 
 AvoidNode::~AvoidNode() {}
 
-void AvoidNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void AvoidNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void AvoidNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void AvoidNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string AvoidNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void AvoidNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void AvoidNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> AvoidNode::GetRefs() const {
diff --git a/src/obj/BSBound.cpp b/src/obj/BSBound.cpp
index b1ef7599..585b8bef 100644
--- a/src/obj/BSBound.cpp
+++ b/src/obj/BSBound.cpp
@@ -11,20 +11,20 @@ BSBound::BSBound() B_S_BOUND_CONSTRUCT {}
 
 BSBound::~BSBound() {}
 
-void BSBound::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSBound::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSBound::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSBound::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSBound::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSBound::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSBound::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSBound::GetRefs() const {
diff --git a/src/obj/BSFurnitureMarker.cpp b/src/obj/BSFurnitureMarker.cpp
index 4b9f1102..dc1061f6 100644
--- a/src/obj/BSFurnitureMarker.cpp
+++ b/src/obj/BSFurnitureMarker.cpp
@@ -12,20 +12,20 @@ BSFurnitureMarker::BSFurnitureMarker() B_S_FURNITURE_MARKER_CONSTRUCT {}
 
 BSFurnitureMarker::~BSFurnitureMarker() {}
 
-void BSFurnitureMarker::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSFurnitureMarker::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSFurnitureMarker::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSFurnitureMarker::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSFurnitureMarker::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSFurnitureMarker::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSFurnitureMarker::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSFurnitureMarker::GetRefs() const {
diff --git a/src/obj/BSKeyframeController.cpp b/src/obj/BSKeyframeController.cpp
index 73b73db9..3fab29c7 100644
--- a/src/obj/BSKeyframeController.cpp
+++ b/src/obj/BSKeyframeController.cpp
@@ -12,20 +12,20 @@ BSKeyframeController::BSKeyframeController() B_S_KEYFRAME_CONTROLLER_CONSTRUCT {
 
 BSKeyframeController::~BSKeyframeController() {}
 
-void BSKeyframeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSKeyframeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSKeyframeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSKeyframeController::GetRefs() const {
diff --git a/src/obj/BSPSysArrayEmitter.cpp b/src/obj/BSPSysArrayEmitter.cpp
index 2a3ec5bb..a50cc500 100644
--- a/src/obj/BSPSysArrayEmitter.cpp
+++ b/src/obj/BSPSysArrayEmitter.cpp
@@ -11,20 +11,20 @@ BSPSysArrayEmitter::BSPSysArrayEmitter() B_S_P_SYS_ARRAY_EMITTER_CONSTRUCT {}
 
 BSPSysArrayEmitter::~BSPSysArrayEmitter() {}
 
-void BSPSysArrayEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSPSysArrayEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSPSysArrayEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSPSysArrayEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSPSysArrayEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSPSysArrayEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSPSysArrayEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSPSysArrayEmitter::GetRefs() const {
diff --git a/src/obj/BSParentVelocityModifier.cpp b/src/obj/BSParentVelocityModifier.cpp
index 455bc531..159d07d7 100644
--- a/src/obj/BSParentVelocityModifier.cpp
+++ b/src/obj/BSParentVelocityModifier.cpp
@@ -11,20 +11,20 @@ BSParentVelocityModifier::BSParentVelocityModifier() B_S_PARENT_VELOCITY_MODIFIE
 
 BSParentVelocityModifier::~BSParentVelocityModifier() {}
 
-void BSParentVelocityModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSParentVelocityModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSParentVelocityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSParentVelocityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSParentVelocityModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSParentVelocityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSParentVelocityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSParentVelocityModifier::GetRefs() const {
diff --git a/src/obj/BSXFlags.cpp b/src/obj/BSXFlags.cpp
index 7efe42b6..6cb205b4 100644
--- a/src/obj/BSXFlags.cpp
+++ b/src/obj/BSXFlags.cpp
@@ -11,20 +11,20 @@ BSXFlags::BSXFlags() B_S_X_FLAGS_CONSTRUCT {}
 
 BSXFlags::~BSXFlags() {}
 
-void BSXFlags::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void BSXFlags::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void BSXFlags::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void BSXFlags::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string BSXFlags::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void BSXFlags::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void BSXFlags::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> BSXFlags::GetRefs() const {
diff --git a/src/obj/FxButton.cpp b/src/obj/FxButton.cpp
index 5ee656e2..45956020 100644
--- a/src/obj/FxButton.cpp
+++ b/src/obj/FxButton.cpp
@@ -11,20 +11,20 @@ FxButton::FxButton() FX_BUTTON_CONSTRUCT {}
 
 FxButton::~FxButton() {}
 
-void FxButton::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxButton::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxButton::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxButton::GetRefs() const {
diff --git a/src/obj/FxRadioButton.cpp b/src/obj/FxRadioButton.cpp
index 1d26f797..c9cd295f 100644
--- a/src/obj/FxRadioButton.cpp
+++ b/src/obj/FxRadioButton.cpp
@@ -12,20 +12,20 @@ FxRadioButton::FxRadioButton() FX_RADIO_BUTTON_CONSTRUCT {}
 
 FxRadioButton::~FxRadioButton() {}
 
-void FxRadioButton::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxRadioButton::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxRadioButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxRadioButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxRadioButton::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxRadioButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxRadioButton::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxRadioButton::GetRefs() const {
diff --git a/src/obj/FxWidget.cpp b/src/obj/FxWidget.cpp
index 6788a707..9f92fd4e 100644
--- a/src/obj/FxWidget.cpp
+++ b/src/obj/FxWidget.cpp
@@ -11,20 +11,20 @@ FxWidget::FxWidget() FX_WIDGET_CONSTRUCT {}
 
 FxWidget::~FxWidget() {}
 
-void FxWidget::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void FxWidget::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void FxWidget::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void FxWidget::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string FxWidget::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void FxWidget::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void FxWidget::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> FxWidget::GetRefs() const {
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index bf4ef185..3619ff4f 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -25,20 +25,20 @@ NiAVObject::~NiAVObject() {
 	ClearProperties();
 }
 
-void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAVObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAVObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAVObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAVObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAVObject::GetRefs() const {
diff --git a/src/obj/NiAlphaController.cpp b/src/obj/NiAlphaController.cpp
index f52b8440..41d8783c 100644
--- a/src/obj/NiAlphaController.cpp
+++ b/src/obj/NiAlphaController.cpp
@@ -12,20 +12,20 @@ NiAlphaController::NiAlphaController() NI_ALPHA_CONTROLLER_CONSTRUCT {}
 
 NiAlphaController::~NiAlphaController() {}
 
-void NiAlphaController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAlphaController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAlphaController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAlphaController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAlphaController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAlphaController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAlphaController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAlphaController::GetRefs() const {
diff --git a/src/obj/NiAlphaProperty.cpp b/src/obj/NiAlphaProperty.cpp
index 732b7878..d7c35ec0 100644
--- a/src/obj/NiAlphaProperty.cpp
+++ b/src/obj/NiAlphaProperty.cpp
@@ -11,20 +11,20 @@ NiAlphaProperty::NiAlphaProperty() NI_ALPHA_PROPERTY_CONSTRUCT {}
 
 NiAlphaProperty::~NiAlphaProperty() {}
 
-void NiAlphaProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAlphaProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAlphaProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAlphaProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAlphaProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAlphaProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAlphaProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAlphaProperty::GetRefs() const {
diff --git a/src/obj/NiAmbientLight.cpp b/src/obj/NiAmbientLight.cpp
index d41a5efe..c78414ca 100644
--- a/src/obj/NiAmbientLight.cpp
+++ b/src/obj/NiAmbientLight.cpp
@@ -11,20 +11,20 @@ NiAmbientLight::NiAmbientLight() NI_AMBIENT_LIGHT_CONSTRUCT {}
 
 NiAmbientLight::~NiAmbientLight() {}
 
-void NiAmbientLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAmbientLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAmbientLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAmbientLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAmbientLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAmbientLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAmbientLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAmbientLight::GetRefs() const {
diff --git a/src/obj/NiAutoNormalParticles.cpp b/src/obj/NiAutoNormalParticles.cpp
index c14421dc..a855b16e 100644
--- a/src/obj/NiAutoNormalParticles.cpp
+++ b/src/obj/NiAutoNormalParticles.cpp
@@ -11,20 +11,20 @@ NiAutoNormalParticles::NiAutoNormalParticles() NI_AUTO_NORMAL_PARTICLES_CONSTRUC
 
 NiAutoNormalParticles::~NiAutoNormalParticles() {}
 
-void NiAutoNormalParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAutoNormalParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAutoNormalParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAutoNormalParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAutoNormalParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAutoNormalParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAutoNormalParticles::GetRefs() const {
diff --git a/src/obj/NiAutoNormalParticlesData.cpp b/src/obj/NiAutoNormalParticlesData.cpp
index 0e62336f..494d5d2e 100644
--- a/src/obj/NiAutoNormalParticlesData.cpp
+++ b/src/obj/NiAutoNormalParticlesData.cpp
@@ -11,20 +11,20 @@ NiAutoNormalParticlesData::NiAutoNormalParticlesData() NI_AUTO_NORMAL_PARTICLES_
 
 NiAutoNormalParticlesData::~NiAutoNormalParticlesData() {}
 
-void NiAutoNormalParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiAutoNormalParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiAutoNormalParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiAutoNormalParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiAutoNormalParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiAutoNormalParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiAutoNormalParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiAutoNormalParticlesData::GetRefs() const {
diff --git a/src/obj/NiBSAnimationNode.cpp b/src/obj/NiBSAnimationNode.cpp
index 9966bd08..6e841316 100644
--- a/src/obj/NiBSAnimationNode.cpp
+++ b/src/obj/NiBSAnimationNode.cpp
@@ -11,20 +11,20 @@ NiBSAnimationNode::NiBSAnimationNode() NI_B_S_ANIMATION_NODE_CONSTRUCT {}
 
 NiBSAnimationNode::~NiBSAnimationNode() {}
 
-void NiBSAnimationNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSAnimationNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSAnimationNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSAnimationNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSAnimationNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSAnimationNode::GetRefs() const {
diff --git a/src/obj/NiBSBoneLODController.cpp b/src/obj/NiBSBoneLODController.cpp
index 762fd4c1..7a455928 100644
--- a/src/obj/NiBSBoneLODController.cpp
+++ b/src/obj/NiBSBoneLODController.cpp
@@ -11,20 +11,20 @@ NiBSBoneLODController::NiBSBoneLODController() NI_B_S_BONE_L_O_D_CONTROLLER_CONS
 
 NiBSBoneLODController::~NiBSBoneLODController() {}
 
-void NiBSBoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSBoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSBoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSBoneLODController::GetRefs() const {
diff --git a/src/obj/NiBSPArrayController.cpp b/src/obj/NiBSPArrayController.cpp
index 0a0c3ce8..b07e561a 100644
--- a/src/obj/NiBSPArrayController.cpp
+++ b/src/obj/NiBSPArrayController.cpp
@@ -11,20 +11,20 @@ NiBSPArrayController::NiBSPArrayController() NI_B_S_P_ARRAY_CONTROLLER_CONSTRUCT
 
 NiBSPArrayController::~NiBSPArrayController() {}
 
-void NiBSPArrayController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSPArrayController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSPArrayController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSPArrayController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSPArrayController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSPArrayController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSPArrayController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSPArrayController::GetRefs() const {
diff --git a/src/obj/NiBSParticleNode.cpp b/src/obj/NiBSParticleNode.cpp
index 0ddcc6fc..84c93f9e 100644
--- a/src/obj/NiBSParticleNode.cpp
+++ b/src/obj/NiBSParticleNode.cpp
@@ -11,20 +11,20 @@ NiBSParticleNode::NiBSParticleNode() NI_B_S_PARTICLE_NODE_CONSTRUCT {}
 
 NiBSParticleNode::~NiBSParticleNode() {}
 
-void NiBSParticleNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSParticleNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSParticleNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSParticleNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSParticleNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSParticleNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSParticleNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSParticleNode::GetRefs() const {
diff --git a/src/obj/NiBSplineBasisData.cpp b/src/obj/NiBSplineBasisData.cpp
index 67a08595..24f010f1 100644
--- a/src/obj/NiBSplineBasisData.cpp
+++ b/src/obj/NiBSplineBasisData.cpp
@@ -11,20 +11,20 @@ NiBSplineBasisData::NiBSplineBasisData() NI_B_SPLINE_BASIS_DATA_CONSTRUCT {}
 
 NiBSplineBasisData::~NiBSplineBasisData() {}
 
-void NiBSplineBasisData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineBasisData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineBasisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineBasisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineBasisData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineBasisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineBasisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineBasisData::GetRefs() const {
diff --git a/src/obj/NiBSplineCompFloatInterpolator.cpp b/src/obj/NiBSplineCompFloatInterpolator.cpp
index f86694a6..b05bb04c 100644
--- a/src/obj/NiBSplineCompFloatInterpolator.cpp
+++ b/src/obj/NiBSplineCompFloatInterpolator.cpp
@@ -11,20 +11,20 @@ NiBSplineCompFloatInterpolator::NiBSplineCompFloatInterpolator() NI_B_SPLINE_COM
 
 NiBSplineCompFloatInterpolator::~NiBSplineCompFloatInterpolator() {}
 
-void NiBSplineCompFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineCompPoint3Interpolator.cpp b/src/obj/NiBSplineCompPoint3Interpolator.cpp
index a21155ff..73f988ce 100644
--- a/src/obj/NiBSplineCompPoint3Interpolator.cpp
+++ b/src/obj/NiBSplineCompPoint3Interpolator.cpp
@@ -11,20 +11,20 @@ NiBSplineCompPoint3Interpolator::NiBSplineCompPoint3Interpolator() NI_B_SPLINE_C
 
 NiBSplineCompPoint3Interpolator::~NiBSplineCompPoint3Interpolator() {}
 
-void NiBSplineCompPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineCompTransformInterpolator.cpp b/src/obj/NiBSplineCompTransformInterpolator.cpp
index a05f47e6..9fa3e064 100644
--- a/src/obj/NiBSplineCompTransformInterpolator.cpp
+++ b/src/obj/NiBSplineCompTransformInterpolator.cpp
@@ -17,20 +17,20 @@ NiBSplineCompTransformInterpolator::NiBSplineCompTransformInterpolator() NI_B_SP
 
 NiBSplineCompTransformInterpolator::~NiBSplineCompTransformInterpolator() {}
 
-void NiBSplineCompTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineCompTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineCompTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineCompTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineCompTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineCompTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineCompTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiBSplineData.cpp b/src/obj/NiBSplineData.cpp
index c8705851..65b133fb 100644
--- a/src/obj/NiBSplineData.cpp
+++ b/src/obj/NiBSplineData.cpp
@@ -11,20 +11,20 @@ NiBSplineData::NiBSplineData() NI_B_SPLINE_DATA_CONSTRUCT {}
 
 NiBSplineData::~NiBSplineData() {}
 
-void NiBSplineData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineData::GetRefs() const {
diff --git a/src/obj/NiBSplineInterpolator.cpp b/src/obj/NiBSplineInterpolator.cpp
index c5add90a..1cab9aa3 100644
--- a/src/obj/NiBSplineInterpolator.cpp
+++ b/src/obj/NiBSplineInterpolator.cpp
@@ -13,20 +13,20 @@ NiBSplineInterpolator::NiBSplineInterpolator() NI_B_SPLINE_INTERPOLATOR_CONSTRUC
 
 NiBSplineInterpolator::~NiBSplineInterpolator() {}
 
-void NiBSplineInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBSplineInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBSplineInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBSplineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBSplineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBSplineInterpolator::GetRefs() const {
diff --git a/src/obj/NiBillboardNode.cpp b/src/obj/NiBillboardNode.cpp
index 91d14827..10a784f5 100644
--- a/src/obj/NiBillboardNode.cpp
+++ b/src/obj/NiBillboardNode.cpp
@@ -11,20 +11,20 @@ NiBillboardNode::NiBillboardNode() NI_BILLBOARD_NODE_CONSTRUCT {}
 
 NiBillboardNode::~NiBillboardNode() {}
 
-void NiBillboardNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBillboardNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBillboardNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBillboardNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBillboardNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBillboardNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBillboardNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBillboardNode::GetRefs() const {
diff --git a/src/obj/NiBinaryExtraData.cpp b/src/obj/NiBinaryExtraData.cpp
index 1af6f3e0..7a129593 100644
--- a/src/obj/NiBinaryExtraData.cpp
+++ b/src/obj/NiBinaryExtraData.cpp
@@ -12,20 +12,20 @@ NiBinaryExtraData::NiBinaryExtraData() NI_BINARY_EXTRA_DATA_CONSTRUCT {}
 
 NiBinaryExtraData::~NiBinaryExtraData() {}
 
-void NiBinaryExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBinaryExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBinaryExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBinaryExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBinaryExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBinaryExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBinaryExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBinaryExtraData::GetRefs() const {
diff --git a/src/obj/NiBlendBoolInterpolator.cpp b/src/obj/NiBlendBoolInterpolator.cpp
index 2a3d63cd..51b4975d 100644
--- a/src/obj/NiBlendBoolInterpolator.cpp
+++ b/src/obj/NiBlendBoolInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendBoolInterpolator::NiBlendBoolInterpolator() NI_BLEND_BOOL_INTERPOLATOR_CO
 
 NiBlendBoolInterpolator::~NiBlendBoolInterpolator() {}
 
-void NiBlendBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendBoolInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendBoolInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendFloatInterpolator.cpp b/src/obj/NiBlendFloatInterpolator.cpp
index 6a2fc8ed..2b608a28 100644
--- a/src/obj/NiBlendFloatInterpolator.cpp
+++ b/src/obj/NiBlendFloatInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendFloatInterpolator::NiBlendFloatInterpolator() NI_BLEND_FLOAT_INTERPOLATOR
 
 NiBlendFloatInterpolator::~NiBlendFloatInterpolator() {}
 
-void NiBlendFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendInterpolator.cpp b/src/obj/NiBlendInterpolator.cpp
index c36e5fd2..7db942c4 100644
--- a/src/obj/NiBlendInterpolator.cpp
+++ b/src/obj/NiBlendInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendInterpolator::NiBlendInterpolator() NI_BLEND_INTERPOLATOR_CONSTRUCT {}
 
 NiBlendInterpolator::~NiBlendInterpolator() {}
 
-void NiBlendInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendInterpolator::GetRefs() const {
diff --git a/src/obj/NiBlendPoint3Interpolator.cpp b/src/obj/NiBlendPoint3Interpolator.cpp
index 656f97fb..39002a95 100644
--- a/src/obj/NiBlendPoint3Interpolator.cpp
+++ b/src/obj/NiBlendPoint3Interpolator.cpp
@@ -11,20 +11,20 @@ NiBlendPoint3Interpolator::NiBlendPoint3Interpolator() NI_BLEND_POINT3_INTERPOLA
 
 NiBlendPoint3Interpolator::~NiBlendPoint3Interpolator() {}
 
-void NiBlendPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiBlendTransformInterpolator.cpp b/src/obj/NiBlendTransformInterpolator.cpp
index 69834626..9593c6e6 100644
--- a/src/obj/NiBlendTransformInterpolator.cpp
+++ b/src/obj/NiBlendTransformInterpolator.cpp
@@ -11,20 +11,20 @@ NiBlendTransformInterpolator::NiBlendTransformInterpolator() NI_BLEND_TRANSFORM_
 
 NiBlendTransformInterpolator::~NiBlendTransformInterpolator() {}
 
-void NiBlendTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBlendTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBlendTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBlendTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBlendTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBlendTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBlendTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBlendTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiBoneLODController.cpp b/src/obj/NiBoneLODController.cpp
index 00a31a0a..7b07d746 100644
--- a/src/obj/NiBoneLODController.cpp
+++ b/src/obj/NiBoneLODController.cpp
@@ -15,20 +15,20 @@ NiBoneLODController::NiBoneLODController() NI_BONE_L_O_D_CONTROLLER_CONSTRUCT {}
 
 NiBoneLODController::~NiBoneLODController() {}
 
-void NiBoneLODController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoneLODController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoneLODController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoneLODController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoneLODController::GetRefs() const {
diff --git a/src/obj/NiBoolData.cpp b/src/obj/NiBoolData.cpp
index 83ae9ca6..35b6c7ce 100644
--- a/src/obj/NiBoolData.cpp
+++ b/src/obj/NiBoolData.cpp
@@ -12,20 +12,20 @@ NiBoolData::NiBoolData() NI_BOOL_DATA_CONSTRUCT {}
 
 NiBoolData::~NiBoolData() {}
 
-void NiBoolData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolData::GetRefs() const {
diff --git a/src/obj/NiBoolInterpolator.cpp b/src/obj/NiBoolInterpolator.cpp
index 39e045f5..abdaa442 100644
--- a/src/obj/NiBoolInterpolator.cpp
+++ b/src/obj/NiBoolInterpolator.cpp
@@ -12,20 +12,20 @@ NiBoolInterpolator::NiBoolInterpolator() NI_BOOL_INTERPOLATOR_CONSTRUCT {}
 
 NiBoolInterpolator::~NiBoolInterpolator() {}
 
-void NiBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolInterpolator::GetRefs() const {
diff --git a/src/obj/NiBoolTimelineInterpolator.cpp b/src/obj/NiBoolTimelineInterpolator.cpp
index 12d7655d..1e931204 100644
--- a/src/obj/NiBoolTimelineInterpolator.cpp
+++ b/src/obj/NiBoolTimelineInterpolator.cpp
@@ -12,20 +12,20 @@ NiBoolTimelineInterpolator::NiBoolTimelineInterpolator() NI_BOOL_TIMELINE_INTERP
 
 NiBoolTimelineInterpolator::~NiBoolTimelineInterpolator() {}
 
-void NiBoolTimelineInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBoolTimelineInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBoolTimelineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBoolTimelineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBoolTimelineInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBoolTimelineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBoolTimelineInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBoolTimelineInterpolator::GetRefs() const {
diff --git a/src/obj/NiBooleanExtraData.cpp b/src/obj/NiBooleanExtraData.cpp
index e7e735ee..66115c92 100644
--- a/src/obj/NiBooleanExtraData.cpp
+++ b/src/obj/NiBooleanExtraData.cpp
@@ -11,20 +11,20 @@ NiBooleanExtraData::NiBooleanExtraData() NI_BOOLEAN_EXTRA_DATA_CONSTRUCT {}
 
 NiBooleanExtraData::~NiBooleanExtraData() {}
 
-void NiBooleanExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiBooleanExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiBooleanExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiBooleanExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiBooleanExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiBooleanExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiBooleanExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiBooleanExtraData::GetRefs() const {
diff --git a/src/obj/NiCamera.cpp b/src/obj/NiCamera.cpp
index 9436876e..fabc19ed 100644
--- a/src/obj/NiCamera.cpp
+++ b/src/obj/NiCamera.cpp
@@ -12,20 +12,20 @@ NiCamera::NiCamera() NI_CAMERA_CONSTRUCT {}
 
 NiCamera::~NiCamera() {}
 
-void NiCamera::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCamera::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCamera::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCamera::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCamera::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCamera::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCamera::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCamera::GetRefs() const {
diff --git a/src/obj/NiClod.cpp b/src/obj/NiClod.cpp
index 4d6f7ab7..b298d99a 100644
--- a/src/obj/NiClod.cpp
+++ b/src/obj/NiClod.cpp
@@ -11,20 +11,20 @@ NiClod::NiClod() NI_CLOD_CONSTRUCT {}
 
 NiClod::~NiClod() {}
 
-void NiClod::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClod::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClod::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClod::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClod::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClod::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClod::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClod::GetRefs() const {
diff --git a/src/obj/NiClodData.cpp b/src/obj/NiClodData.cpp
index 0744ebfe..dac52627 100644
--- a/src/obj/NiClodData.cpp
+++ b/src/obj/NiClodData.cpp
@@ -11,20 +11,20 @@ NiClodData::NiClodData() NI_CLOD_DATA_CONSTRUCT {}
 
 NiClodData::~NiClodData() {}
 
-void NiClodData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClodData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClodData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClodData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClodData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClodData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClodData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClodData::GetRefs() const {
diff --git a/src/obj/NiClodSkinInstance.cpp b/src/obj/NiClodSkinInstance.cpp
index 6ca8fa7d..2664fbc4 100644
--- a/src/obj/NiClodSkinInstance.cpp
+++ b/src/obj/NiClodSkinInstance.cpp
@@ -11,20 +11,20 @@ NiClodSkinInstance::NiClodSkinInstance() NI_CLOD_SKIN_INSTANCE_CONSTRUCT {}
 
 NiClodSkinInstance::~NiClodSkinInstance() {}
 
-void NiClodSkinInstance::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiClodSkinInstance::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiClodSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiClodSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiClodSkinInstance::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiClodSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiClodSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiClodSkinInstance::GetRefs() const {
diff --git a/src/obj/NiCollisionData.cpp b/src/obj/NiCollisionData.cpp
index 677b6c2e..c688d306 100644
--- a/src/obj/NiCollisionData.cpp
+++ b/src/obj/NiCollisionData.cpp
@@ -12,20 +12,20 @@ NiCollisionData::NiCollisionData() NI_COLLISION_DATA_CONSTRUCT {}
 
 NiCollisionData::~NiCollisionData() {}
 
-void NiCollisionData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCollisionData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCollisionData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCollisionData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCollisionData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCollisionData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCollisionData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCollisionData::GetRefs() const {
diff --git a/src/obj/NiCollisionObject.cpp b/src/obj/NiCollisionObject.cpp
index 38918ab1..bf0608a6 100644
--- a/src/obj/NiCollisionObject.cpp
+++ b/src/obj/NiCollisionObject.cpp
@@ -13,20 +13,20 @@ NiCollisionObject::NiCollisionObject() NI_COLLISION_OBJECT_CONSTRUCT {}
 
 NiCollisionObject::~NiCollisionObject() {}
 
-void NiCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiCollisionObject::GetRefs() const {
diff --git a/src/obj/NiColorData.cpp b/src/obj/NiColorData.cpp
index 93860023..33d62372 100644
--- a/src/obj/NiColorData.cpp
+++ b/src/obj/NiColorData.cpp
@@ -12,20 +12,20 @@ NiColorData::NiColorData() NI_COLOR_DATA_CONSTRUCT {}
 
 NiColorData::~NiColorData() {}
 
-void NiColorData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiColorData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiColorData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiColorData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiColorData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiColorData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiColorData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiColorData::GetRefs() const {
diff --git a/src/obj/NiColorExtraData.cpp b/src/obj/NiColorExtraData.cpp
index 83f96306..71d808c7 100644
--- a/src/obj/NiColorExtraData.cpp
+++ b/src/obj/NiColorExtraData.cpp
@@ -11,20 +11,20 @@ NiColorExtraData::NiColorExtraData() NI_COLOR_EXTRA_DATA_CONSTRUCT {}
 
 NiColorExtraData::~NiColorExtraData() {}
 
-void NiColorExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiColorExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiColorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiColorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiColorExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiColorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiColorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiColorExtraData::GetRefs() const {
diff --git a/src/obj/NiControllerManager.cpp b/src/obj/NiControllerManager.cpp
index 9dab28b0..57dbf33f 100644
--- a/src/obj/NiControllerManager.cpp
+++ b/src/obj/NiControllerManager.cpp
@@ -14,20 +14,20 @@ NiControllerManager::NiControllerManager() NI_CONTROLLER_MANAGER_CONSTRUCT {}
 
 NiControllerManager::~NiControllerManager() {}
 
-void NiControllerManager::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiControllerManager::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiControllerManager::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiControllerManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiControllerManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiControllerManager::GetRefs() const {
diff --git a/src/obj/NiControllerSequence.cpp b/src/obj/NiControllerSequence.cpp
index 9f28f159..9cfda479 100644
--- a/src/obj/NiControllerSequence.cpp
+++ b/src/obj/NiControllerSequence.cpp
@@ -23,20 +23,20 @@ NiControllerSequence::NiControllerSequence() NI_CONTROLLER_SEQUENCE_CONSTRUCT {}
 
 NiControllerSequence::~NiControllerSequence() {}
 
-void NiControllerSequence::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiControllerSequence::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiControllerSequence::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiControllerSequence::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiControllerSequence::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiControllerSequence::GetRefs() const {
diff --git a/src/obj/NiDefaultAVObjectPalette.cpp b/src/obj/NiDefaultAVObjectPalette.cpp
index 37d3b5d4..1b8ede42 100644
--- a/src/obj/NiDefaultAVObjectPalette.cpp
+++ b/src/obj/NiDefaultAVObjectPalette.cpp
@@ -13,20 +13,20 @@ NiDefaultAVObjectPalette::NiDefaultAVObjectPalette() NI_DEFAULT_A_V_OBJECT_PALET
 
 NiDefaultAVObjectPalette::~NiDefaultAVObjectPalette() {}
 
-void NiDefaultAVObjectPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDefaultAVObjectPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDefaultAVObjectPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDefaultAVObjectPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDefaultAVObjectPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDefaultAVObjectPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDefaultAVObjectPalette::GetRefs() const {
diff --git a/src/obj/NiDirectionalLight.cpp b/src/obj/NiDirectionalLight.cpp
index 33dca533..fb60079d 100644
--- a/src/obj/NiDirectionalLight.cpp
+++ b/src/obj/NiDirectionalLight.cpp
@@ -11,20 +11,20 @@ NiDirectionalLight::NiDirectionalLight() NI_DIRECTIONAL_LIGHT_CONSTRUCT {}
 
 NiDirectionalLight::~NiDirectionalLight() {}
 
-void NiDirectionalLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDirectionalLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDirectionalLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDirectionalLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDirectionalLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDirectionalLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDirectionalLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDirectionalLight::GetRefs() const {
diff --git a/src/obj/NiDitherProperty.cpp b/src/obj/NiDitherProperty.cpp
index f4c346e7..02011a99 100644
--- a/src/obj/NiDitherProperty.cpp
+++ b/src/obj/NiDitherProperty.cpp
@@ -11,20 +11,20 @@ NiDitherProperty::NiDitherProperty() NI_DITHER_PROPERTY_CONSTRUCT {}
 
 NiDitherProperty::~NiDitherProperty() {}
 
-void NiDitherProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDitherProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDitherProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDitherProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDitherProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDitherProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDitherProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDitherProperty::GetRefs() const {
diff --git a/src/obj/NiDynamicEffect.cpp b/src/obj/NiDynamicEffect.cpp
index 20ec5726..d8ba154f 100644
--- a/src/obj/NiDynamicEffect.cpp
+++ b/src/obj/NiDynamicEffect.cpp
@@ -12,20 +12,20 @@ NiDynamicEffect::NiDynamicEffect() NI_DYNAMIC_EFFECT_CONSTRUCT {}
 
 NiDynamicEffect::~NiDynamicEffect() {}
 
-void NiDynamicEffect::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiDynamicEffect::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiDynamicEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiDynamicEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiDynamicEffect::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiDynamicEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiDynamicEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiDynamicEffect::GetRefs() const {
diff --git a/src/obj/NiExtraData.cpp b/src/obj/NiExtraData.cpp
index c8fabd53..838be7f6 100644
--- a/src/obj/NiExtraData.cpp
+++ b/src/obj/NiExtraData.cpp
@@ -11,20 +11,20 @@ NiExtraData::NiExtraData() NI_EXTRA_DATA_CONSTRUCT {}
 
 NiExtraData::~NiExtraData() {}
 
-void NiExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiExtraData::GetRefs() const {
diff --git a/src/obj/NiFlipController.cpp b/src/obj/NiFlipController.cpp
index e725de7d..c679abe9 100644
--- a/src/obj/NiFlipController.cpp
+++ b/src/obj/NiFlipController.cpp
@@ -12,20 +12,20 @@ NiFlipController::NiFlipController() NI_FLIP_CONTROLLER_CONSTRUCT {}
 
 NiFlipController::~NiFlipController() {}
 
-void NiFlipController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFlipController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFlipController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFlipController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFlipController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFlipController::GetRefs() const {
diff --git a/src/obj/NiFloatData.cpp b/src/obj/NiFloatData.cpp
index 5be2aac6..4caf8a97 100644
--- a/src/obj/NiFloatData.cpp
+++ b/src/obj/NiFloatData.cpp
@@ -12,20 +12,20 @@ NiFloatData::NiFloatData() NI_FLOAT_DATA_CONSTRUCT {}
 
 NiFloatData::~NiFloatData() {}
 
-void NiFloatData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatData::GetRefs() const {
diff --git a/src/obj/NiFloatExtraData.cpp b/src/obj/NiFloatExtraData.cpp
index e6131588..4500b9f1 100644
--- a/src/obj/NiFloatExtraData.cpp
+++ b/src/obj/NiFloatExtraData.cpp
@@ -11,20 +11,20 @@ NiFloatExtraData::NiFloatExtraData() NI_FLOAT_EXTRA_DATA_CONSTRUCT {}
 
 NiFloatExtraData::~NiFloatExtraData() {}
 
-void NiFloatExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatExtraData::GetRefs() const {
diff --git a/src/obj/NiFloatExtraDataController.cpp b/src/obj/NiFloatExtraDataController.cpp
index c189f179..d0fd9c0f 100644
--- a/src/obj/NiFloatExtraDataController.cpp
+++ b/src/obj/NiFloatExtraDataController.cpp
@@ -12,20 +12,20 @@ NiFloatExtraDataController::NiFloatExtraDataController() NI_FLOAT_EXTRA_DATA_CON
 
 NiFloatExtraDataController::~NiFloatExtraDataController() {}
 
-void NiFloatExtraDataController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatExtraDataController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatExtraDataController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatExtraDataController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatExtraDataController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatExtraDataController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatExtraDataController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatExtraDataController::GetRefs() const {
diff --git a/src/obj/NiFloatInterpolator.cpp b/src/obj/NiFloatInterpolator.cpp
index 1df915f4..45f7ab85 100644
--- a/src/obj/NiFloatInterpolator.cpp
+++ b/src/obj/NiFloatInterpolator.cpp
@@ -12,20 +12,20 @@ NiFloatInterpolator::NiFloatInterpolator() NI_FLOAT_INTERPOLATOR_CONSTRUCT {}
 
 NiFloatInterpolator::~NiFloatInterpolator() {}
 
-void NiFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatInterpolator::GetRefs() const {
diff --git a/src/obj/NiFloatsExtraData.cpp b/src/obj/NiFloatsExtraData.cpp
index a3709643..9dfae420 100644
--- a/src/obj/NiFloatsExtraData.cpp
+++ b/src/obj/NiFloatsExtraData.cpp
@@ -11,20 +11,20 @@ NiFloatsExtraData::NiFloatsExtraData() NI_FLOATS_EXTRA_DATA_CONSTRUCT {}
 
 NiFloatsExtraData::~NiFloatsExtraData() {}
 
-void NiFloatsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFloatsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFloatsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFloatsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFloatsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFloatsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFloatsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFloatsExtraData::GetRefs() const {
diff --git a/src/obj/NiFogProperty.cpp b/src/obj/NiFogProperty.cpp
index 30d539f9..4692fe31 100644
--- a/src/obj/NiFogProperty.cpp
+++ b/src/obj/NiFogProperty.cpp
@@ -11,20 +11,20 @@ NiFogProperty::NiFogProperty() NI_FOG_PROPERTY_CONSTRUCT {}
 
 NiFogProperty::~NiFogProperty() {}
 
-void NiFogProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiFogProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiFogProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiFogProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiFogProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiFogProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiFogProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiFogProperty::GetRefs() const {
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index 61ad9ee0..0c3ae6d7 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -13,20 +13,20 @@ NiGeomMorpherController::NiGeomMorpherController() NI_GEOM_MORPHER_CONTROLLER_CO
 
 NiGeomMorpherController::~NiGeomMorpherController() {}
 
-void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeomMorpherController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeomMorpherController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeomMorpherController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeomMorpherController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeomMorpherController::GetRefs() const {
diff --git a/src/obj/NiGeometry.cpp b/src/obj/NiGeometry.cpp
index 9a73c44b..b01cc8d8 100644
--- a/src/obj/NiGeometry.cpp
+++ b/src/obj/NiGeometry.cpp
@@ -16,20 +16,20 @@ NiGeometry::NiGeometry() NI_GEOMETRY_CONSTRUCT {}
 
 NiGeometry::~NiGeometry() {}
 
-void NiGeometry::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeometry::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeometry::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeometry::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeometry::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeometry::GetRefs() const {
diff --git a/src/obj/NiGeometryData.cpp b/src/obj/NiGeometryData.cpp
index 793e4906..db00a582 100644
--- a/src/obj/NiGeometryData.cpp
+++ b/src/obj/NiGeometryData.cpp
@@ -12,20 +12,20 @@ NiGeometryData::NiGeometryData() NI_GEOMETRY_DATA_CONSTRUCT {}
 
 NiGeometryData::~NiGeometryData() {}
 
-void NiGeometryData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGeometryData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGeometryData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGeometryData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGeometryData::GetRefs() const {
diff --git a/src/obj/NiGravity.cpp b/src/obj/NiGravity.cpp
index 4667eaa8..6bb76d42 100644
--- a/src/obj/NiGravity.cpp
+++ b/src/obj/NiGravity.cpp
@@ -11,20 +11,20 @@ NiGravity::NiGravity() NI_GRAVITY_CONSTRUCT {}
 
 NiGravity::~NiGravity() {}
 
-void NiGravity::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiGravity::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiGravity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiGravity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiGravity::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiGravity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiGravity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiGravity::GetRefs() const {
diff --git a/src/obj/NiImage.cpp b/src/obj/NiImage.cpp
index 8bfcf95a..ee9f0ce7 100644
--- a/src/obj/NiImage.cpp
+++ b/src/obj/NiImage.cpp
@@ -11,20 +11,20 @@ NiImage::NiImage() NI_IMAGE_CONSTRUCT {}
 
 NiImage::~NiImage() {}
 
-void NiImage::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiImage::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiImage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiImage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiImage::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiImage::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiImage::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiImage::GetRefs() const {
diff --git a/src/obj/NiIntegerExtraData.cpp b/src/obj/NiIntegerExtraData.cpp
index 4b6a1059..d94fbe8a 100644
--- a/src/obj/NiIntegerExtraData.cpp
+++ b/src/obj/NiIntegerExtraData.cpp
@@ -11,20 +11,20 @@ NiIntegerExtraData::NiIntegerExtraData() NI_INTEGER_EXTRA_DATA_CONSTRUCT {}
 
 NiIntegerExtraData::~NiIntegerExtraData() {}
 
-void NiIntegerExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiIntegerExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiIntegerExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiIntegerExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiIntegerExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiIntegerExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiIntegerExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiIntegerExtraData::GetRefs() const {
diff --git a/src/obj/NiIntegersExtraData.cpp b/src/obj/NiIntegersExtraData.cpp
index 49d97871..79804cc4 100644
--- a/src/obj/NiIntegersExtraData.cpp
+++ b/src/obj/NiIntegersExtraData.cpp
@@ -11,20 +11,20 @@ NiIntegersExtraData::NiIntegersExtraData() NI_INTEGERS_EXTRA_DATA_CONSTRUCT {}
 
 NiIntegersExtraData::~NiIntegersExtraData() {}
 
-void NiIntegersExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiIntegersExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiIntegersExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiIntegersExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiIntegersExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiIntegersExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiIntegersExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiIntegersExtraData::GetRefs() const {
diff --git a/src/obj/NiInterpolator.cpp b/src/obj/NiInterpolator.cpp
index 152e00c5..94fd4029 100644
--- a/src/obj/NiInterpolator.cpp
+++ b/src/obj/NiInterpolator.cpp
@@ -11,20 +11,20 @@ NiInterpolator::NiInterpolator() NI_INTERPOLATOR_CONSTRUCT {}
 
 NiInterpolator::~NiInterpolator() {}
 
-void NiInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiInterpolator::GetRefs() const {
diff --git a/src/obj/NiKeyframeController.cpp b/src/obj/NiKeyframeController.cpp
index df491135..c2327e2b 100644
--- a/src/obj/NiKeyframeController.cpp
+++ b/src/obj/NiKeyframeController.cpp
@@ -12,20 +12,20 @@ NiKeyframeController::NiKeyframeController() NI_KEYFRAME_CONTROLLER_CONSTRUCT {}
 
 NiKeyframeController::~NiKeyframeController() {}
 
-void NiKeyframeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiKeyframeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiKeyframeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiKeyframeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiKeyframeController::GetRefs() const {
diff --git a/src/obj/NiKeyframeData.cpp b/src/obj/NiKeyframeData.cpp
index 5b9b62a9..d6348b3a 100644
--- a/src/obj/NiKeyframeData.cpp
+++ b/src/obj/NiKeyframeData.cpp
@@ -12,20 +12,20 @@ NiKeyframeData::NiKeyframeData() NI_KEYFRAME_DATA_CONSTRUCT {}
 
 NiKeyframeData::~NiKeyframeData() {}
 
-void NiKeyframeData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiKeyframeData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiKeyframeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiKeyframeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiKeyframeData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiKeyframeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiKeyframeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiKeyframeData::GetRefs() const {
diff --git a/src/obj/NiLODData.cpp b/src/obj/NiLODData.cpp
index 6ec65c56..6e0b6a76 100644
--- a/src/obj/NiLODData.cpp
+++ b/src/obj/NiLODData.cpp
@@ -11,20 +11,20 @@ NiLODData::NiLODData() NI_L_O_D_DATA_CONSTRUCT {}
 
 NiLODData::~NiLODData() {}
 
-void NiLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLODData::GetRefs() const {
diff --git a/src/obj/NiLODNode.cpp b/src/obj/NiLODNode.cpp
index 95d1ef23..a8a0f0c6 100644
--- a/src/obj/NiLODNode.cpp
+++ b/src/obj/NiLODNode.cpp
@@ -13,20 +13,20 @@ NiLODNode::NiLODNode() NI_L_O_D_NODE_CONSTRUCT {}
 
 NiLODNode::~NiLODNode() {}
 
-void NiLODNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLODNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLODNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLODNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLODNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLODNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLODNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLODNode::GetRefs() const {
diff --git a/src/obj/NiLight.cpp b/src/obj/NiLight.cpp
index 7f140138..1321e2ae 100644
--- a/src/obj/NiLight.cpp
+++ b/src/obj/NiLight.cpp
@@ -11,20 +11,20 @@ NiLight::NiLight() NI_LIGHT_CONSTRUCT {}
 
 NiLight::~NiLight() {}
 
-void NiLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLight::GetRefs() const {
diff --git a/src/obj/NiLightColorController.cpp b/src/obj/NiLightColorController.cpp
index b8b00780..d208509c 100644
--- a/src/obj/NiLightColorController.cpp
+++ b/src/obj/NiLightColorController.cpp
@@ -13,20 +13,20 @@ NiLightColorController::NiLightColorController() NI_LIGHT_COLOR_CONTROLLER_CONST
 
 NiLightColorController::~NiLightColorController() {}
 
-void NiLightColorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLightColorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLightColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLightColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLightColorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLightColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLightColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLightColorController::GetRefs() const {
diff --git a/src/obj/NiLightDimmerController.cpp b/src/obj/NiLightDimmerController.cpp
index bd8a6680..2e021680 100644
--- a/src/obj/NiLightDimmerController.cpp
+++ b/src/obj/NiLightDimmerController.cpp
@@ -12,20 +12,20 @@ NiLightDimmerController::NiLightDimmerController() NI_LIGHT_DIMMER_CONTROLLER_CO
 
 NiLightDimmerController::~NiLightDimmerController() {}
 
-void NiLightDimmerController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLightDimmerController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLightDimmerController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLightDimmerController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLightDimmerController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLightDimmerController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLightDimmerController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLightDimmerController::GetRefs() const {
diff --git a/src/obj/NiLookAtController.cpp b/src/obj/NiLookAtController.cpp
index 41008103..807c8ba8 100644
--- a/src/obj/NiLookAtController.cpp
+++ b/src/obj/NiLookAtController.cpp
@@ -12,20 +12,20 @@ NiLookAtController::NiLookAtController() NI_LOOK_AT_CONTROLLER_CONSTRUCT {}
 
 NiLookAtController::~NiLookAtController() {}
 
-void NiLookAtController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLookAtController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLookAtController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLookAtController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLookAtController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLookAtController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLookAtController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLookAtController::GetRefs() const {
diff --git a/src/obj/NiLookAtInterpolator.cpp b/src/obj/NiLookAtInterpolator.cpp
index 2058651e..38000646 100644
--- a/src/obj/NiLookAtInterpolator.cpp
+++ b/src/obj/NiLookAtInterpolator.cpp
@@ -14,20 +14,20 @@ NiLookAtInterpolator::NiLookAtInterpolator() NI_LOOK_AT_INTERPOLATOR_CONSTRUCT {
 
 NiLookAtInterpolator::~NiLookAtInterpolator() {}
 
-void NiLookAtInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiLookAtInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiLookAtInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiLookAtInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiLookAtInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiLookAtInterpolator::GetRefs() const {
diff --git a/src/obj/NiMaterialColorController.cpp b/src/obj/NiMaterialColorController.cpp
index 0f8cd03c..9261c5c5 100644
--- a/src/obj/NiMaterialColorController.cpp
+++ b/src/obj/NiMaterialColorController.cpp
@@ -12,20 +12,20 @@ NiMaterialColorController::NiMaterialColorController() NI_MATERIAL_COLOR_CONTROL
 
 NiMaterialColorController::~NiMaterialColorController() {}
 
-void NiMaterialColorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMaterialColorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMaterialColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMaterialColorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMaterialColorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMaterialColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMaterialColorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMaterialColorController::GetRefs() const {
diff --git a/src/obj/NiMaterialProperty.cpp b/src/obj/NiMaterialProperty.cpp
index ebf7686a..2157e8fa 100644
--- a/src/obj/NiMaterialProperty.cpp
+++ b/src/obj/NiMaterialProperty.cpp
@@ -11,20 +11,20 @@ NiMaterialProperty::NiMaterialProperty() NI_MATERIAL_PROPERTY_CONSTRUCT {}
 
 NiMaterialProperty::~NiMaterialProperty() {}
 
-void NiMaterialProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMaterialProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMaterialProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMaterialProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMaterialProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMaterialProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMaterialProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMaterialProperty::GetRefs() const {
diff --git a/src/obj/NiMeshPSysData.cpp b/src/obj/NiMeshPSysData.cpp
index c7fb67cb..613a9fe2 100644
--- a/src/obj/NiMeshPSysData.cpp
+++ b/src/obj/NiMeshPSysData.cpp
@@ -13,20 +13,20 @@ NiMeshPSysData::NiMeshPSysData() NI_MESH_P_SYS_DATA_CONSTRUCT {}
 
 NiMeshPSysData::~NiMeshPSysData() {}
 
-void NiMeshPSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMeshPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMeshPSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMeshPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMeshPSysData::GetRefs() const {
diff --git a/src/obj/NiMeshParticleSystem.cpp b/src/obj/NiMeshParticleSystem.cpp
index ae82f855..940cad9e 100644
--- a/src/obj/NiMeshParticleSystem.cpp
+++ b/src/obj/NiMeshParticleSystem.cpp
@@ -11,20 +11,20 @@ NiMeshParticleSystem::NiMeshParticleSystem() NI_MESH_PARTICLE_SYSTEM_CONSTRUCT {
 
 NiMeshParticleSystem::~NiMeshParticleSystem() {}
 
-void NiMeshParticleSystem::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMeshParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMeshParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMeshParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMeshParticleSystem::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMeshParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMeshParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMeshParticleSystem::GetRefs() const {
diff --git a/src/obj/NiMorphData.cpp b/src/obj/NiMorphData.cpp
index 74503f02..55b79b42 100644
--- a/src/obj/NiMorphData.cpp
+++ b/src/obj/NiMorphData.cpp
@@ -12,20 +12,20 @@ NiMorphData::NiMorphData() NI_MORPH_DATA_CONSTRUCT {}
 
 NiMorphData::~NiMorphData() {}
 
-void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMorphData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMorphData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMorphData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMorphData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMorphData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMorphData::GetRefs() const {
diff --git a/src/obj/NiMultiTargetTransformController.cpp b/src/obj/NiMultiTargetTransformController.cpp
index 8b623f7f..bf4c08a8 100644
--- a/src/obj/NiMultiTargetTransformController.cpp
+++ b/src/obj/NiMultiTargetTransformController.cpp
@@ -13,20 +13,20 @@ NiMultiTargetTransformController::NiMultiTargetTransformController() NI_MULTI_TA
 
 NiMultiTargetTransformController::~NiMultiTargetTransformController() {}
 
-void NiMultiTargetTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiMultiTargetTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiMultiTargetTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiMultiTargetTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiMultiTargetTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiMultiTargetTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiMultiTargetTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiMultiTargetTransformController::GetRefs() const {
diff --git a/src/obj/NiNode.cpp b/src/obj/NiNode.cpp
index 603cf621..2641716e 100644
--- a/src/obj/NiNode.cpp
+++ b/src/obj/NiNode.cpp
@@ -27,20 +27,20 @@ NiNode::~NiNode() {
 	ClearChildren();
 }
 
-void NiNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 	//Connect children to their parents and remove any NULL ones
 	for ( vector< NiAVObjectRef >::iterator it = children.begin(); it != children.end(); ) {
 		if ( *it == NULL) {
diff --git a/src/obj/NiObject.cpp b/src/obj/NiObject.cpp
index 09141bc5..e313757f 100644
--- a/src/obj/NiObject.cpp
+++ b/src/obj/NiObject.cpp
@@ -81,13 +81,14 @@ NiObjectRef NiObject::Clone( unsigned int version, unsigned int user_version ) {
 	map<NiObjectRef,unsigned int> link_map;
 
 	//Write this object's data to the stream
-	this->Write( tmp, link_map, version, user_version );
+	NifInfo info( version, user_version );
+	this->Write( tmp, link_map, info );
 
 	//Dummy stack
 	list<unsigned int> link_stack;
 
 	//Read the data back from the stream into the clone
-	clone->Read( tmp, link_stack, version, user_version );
+	clone->Read( tmp, link_stack, info );
 
 	//We don't fix the links, causing the clone to be a copy of all
 	//data but have none of the linkage of the original.
diff --git a/src/obj/NiObjectNET.cpp b/src/obj/NiObjectNET.cpp
index 70d6d797..236a6b90 100644
--- a/src/obj/NiObjectNET.cpp
+++ b/src/obj/NiObjectNET.cpp
@@ -17,20 +17,20 @@ NiObjectNET::~NiObjectNET() {
 	ClearControllers();
 }
 
-void NiObjectNET::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiObjectNET::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiObjectNET::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiObjectNET::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiObjectNET::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiObjectNET::GetRefs() const {
diff --git a/src/obj/NiPSysAgeDeathModifier.cpp b/src/obj/NiPSysAgeDeathModifier.cpp
index 847b1906..79986b39 100644
--- a/src/obj/NiPSysAgeDeathModifier.cpp
+++ b/src/obj/NiPSysAgeDeathModifier.cpp
@@ -12,20 +12,20 @@ NiPSysAgeDeathModifier::NiPSysAgeDeathModifier() NI_P_SYS_AGE_DEATH_MODIFIER_CON
 
 NiPSysAgeDeathModifier::~NiPSysAgeDeathModifier() {}
 
-void NiPSysAgeDeathModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysAgeDeathModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysAgeDeathModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysAgeDeathModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysAgeDeathModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysAgeDeathModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysAgeDeathModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysAgeDeathModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBombModifier.cpp b/src/obj/NiPSysBombModifier.cpp
index e2340ceb..24ed9667 100644
--- a/src/obj/NiPSysBombModifier.cpp
+++ b/src/obj/NiPSysBombModifier.cpp
@@ -12,20 +12,20 @@ NiPSysBombModifier::NiPSysBombModifier() NI_P_SYS_BOMB_MODIFIER_CONSTRUCT {}
 
 NiPSysBombModifier::~NiPSysBombModifier() {}
 
-void NiPSysBombModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBombModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBombModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBombModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBombModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBombModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBombModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBombModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBoundUpdateModifier.cpp b/src/obj/NiPSysBoundUpdateModifier.cpp
index b1db32c1..047009d1 100644
--- a/src/obj/NiPSysBoundUpdateModifier.cpp
+++ b/src/obj/NiPSysBoundUpdateModifier.cpp
@@ -11,20 +11,20 @@ NiPSysBoundUpdateModifier::NiPSysBoundUpdateModifier() NI_P_SYS_BOUND_UPDATE_MOD
 
 NiPSysBoundUpdateModifier::~NiPSysBoundUpdateModifier() {}
 
-void NiPSysBoundUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBoundUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBoundUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBoundUpdateModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBoundUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBoundUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBoundUpdateModifier::GetRefs() const {
diff --git a/src/obj/NiPSysBoxEmitter.cpp b/src/obj/NiPSysBoxEmitter.cpp
index b923237d..54818a3f 100644
--- a/src/obj/NiPSysBoxEmitter.cpp
+++ b/src/obj/NiPSysBoxEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysBoxEmitter::NiPSysBoxEmitter() NI_P_SYS_BOX_EMITTER_CONSTRUCT {}
 
 NiPSysBoxEmitter::~NiPSysBoxEmitter() {}
 
-void NiPSysBoxEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysBoxEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysBoxEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysBoxEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysBoxEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysBoxEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysBoxEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysBoxEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysColliderManager.cpp b/src/obj/NiPSysColliderManager.cpp
index de77a44d..fc6d3503 100644
--- a/src/obj/NiPSysColliderManager.cpp
+++ b/src/obj/NiPSysColliderManager.cpp
@@ -12,20 +12,20 @@ NiPSysColliderManager::NiPSysColliderManager() NI_P_SYS_COLLIDER_MANAGER_CONSTRU
 
 NiPSysColliderManager::~NiPSysColliderManager() {}
 
-void NiPSysColliderManager::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysColliderManager::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysColliderManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysColliderManager::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysColliderManager::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysColliderManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysColliderManager::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysColliderManager::GetRefs() const {
diff --git a/src/obj/NiPSysColorModifier.cpp b/src/obj/NiPSysColorModifier.cpp
index c9121889..4d9e2739 100644
--- a/src/obj/NiPSysColorModifier.cpp
+++ b/src/obj/NiPSysColorModifier.cpp
@@ -12,20 +12,20 @@ NiPSysColorModifier::NiPSysColorModifier() NI_P_SYS_COLOR_MODIFIER_CONSTRUCT {}
 
 NiPSysColorModifier::~NiPSysColorModifier() {}
 
-void NiPSysColorModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysColorModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysColorModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysColorModifier::GetRefs() const {
diff --git a/src/obj/NiPSysCylinderEmitter.cpp b/src/obj/NiPSysCylinderEmitter.cpp
index 53218e95..59629687 100644
--- a/src/obj/NiPSysCylinderEmitter.cpp
+++ b/src/obj/NiPSysCylinderEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysCylinderEmitter::NiPSysCylinderEmitter() NI_P_SYS_CYLINDER_EMITTER_CONSTRU
 
 NiPSysCylinderEmitter::~NiPSysCylinderEmitter() {}
 
-void NiPSysCylinderEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysCylinderEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysCylinderEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysCylinderEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysCylinderEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysCylinderEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysCylinderEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysCylinderEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysData.cpp b/src/obj/NiPSysData.cpp
index e1fc37f9..c2726694 100644
--- a/src/obj/NiPSysData.cpp
+++ b/src/obj/NiPSysData.cpp
@@ -11,20 +11,20 @@ NiPSysData::NiPSysData() NI_P_SYS_DATA_CONSTRUCT {}
 
 NiPSysData::~NiPSysData() {}
 
-void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysData::GetRefs() const {
diff --git a/src/obj/NiPSysDragModifier.cpp b/src/obj/NiPSysDragModifier.cpp
index df8eb8df..93c16029 100644
--- a/src/obj/NiPSysDragModifier.cpp
+++ b/src/obj/NiPSysDragModifier.cpp
@@ -12,20 +12,20 @@ NiPSysDragModifier::NiPSysDragModifier() NI_P_SYS_DRAG_MODIFIER_CONSTRUCT {}
 
 NiPSysDragModifier::~NiPSysDragModifier() {}
 
-void NiPSysDragModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysDragModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysDragModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysDragModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysDragModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysDragModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysDragModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysDragModifier::GetRefs() const {
diff --git a/src/obj/NiPSysEmitter.cpp b/src/obj/NiPSysEmitter.cpp
index 8114fc58..96382879 100644
--- a/src/obj/NiPSysEmitter.cpp
+++ b/src/obj/NiPSysEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysEmitter::NiPSysEmitter() NI_P_SYS_EMITTER_CONSTRUCT {}
 
 NiPSysEmitter::~NiPSysEmitter() {}
 
-void NiPSysEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterCtlr.cpp b/src/obj/NiPSysEmitterCtlr.cpp
index 0555ab2a..69af8a4c 100644
--- a/src/obj/NiPSysEmitterCtlr.cpp
+++ b/src/obj/NiPSysEmitterCtlr.cpp
@@ -13,20 +13,20 @@ NiPSysEmitterCtlr::NiPSysEmitterCtlr() NI_P_SYS_EMITTER_CTLR_CONSTRUCT {}
 
 NiPSysEmitterCtlr::~NiPSysEmitterCtlr() {}
 
-void NiPSysEmitterCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterCtlrData.cpp b/src/obj/NiPSysEmitterCtlrData.cpp
index 78c2920b..80a70ec7 100644
--- a/src/obj/NiPSysEmitterCtlrData.cpp
+++ b/src/obj/NiPSysEmitterCtlrData.cpp
@@ -12,20 +12,20 @@ NiPSysEmitterCtlrData::NiPSysEmitterCtlrData() NI_P_SYS_EMITTER_CTLR_DATA_CONSTR
 
 NiPSysEmitterCtlrData::~NiPSysEmitterCtlrData() {}
 
-void NiPSysEmitterCtlrData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterCtlrData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterCtlrData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterCtlrData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterCtlrData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterCtlrData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterCtlrData::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterDeclinationCtlr.cpp b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
index e1924371..d29d1577 100644
--- a/src/obj/NiPSysEmitterDeclinationCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterDeclinationCtlr::NiPSysEmitterDeclinationCtlr() NI_P_SYS_EMITTER_DE
 
 NiPSysEmitterDeclinationCtlr::~NiPSysEmitterDeclinationCtlr() {}
 
-void NiPSysEmitterDeclinationCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterDeclinationCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterDeclinationCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterDeclinationCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
index 10c32e6d..7ce7972a 100644
--- a/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
+++ b/src/obj/NiPSysEmitterDeclinationVarCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterDeclinationVarCtlr::NiPSysEmitterDeclinationVarCtlr() NI_P_SYS_EMIT
 
 NiPSysEmitterDeclinationVarCtlr::~NiPSysEmitterDeclinationVarCtlr() {}
 
-void NiPSysEmitterDeclinationVarCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterDeclinationVarCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterDeclinationVarCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterDeclinationVarCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterDeclinationVarCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
index 43568c87..9a1017df 100644
--- a/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
+++ b/src/obj/NiPSysEmitterInitialRadiusCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysEmitterInitialRadiusCtlr::NiPSysEmitterInitialRadiusCtlr() NI_P_SYS_EMITTE
 
 NiPSysEmitterInitialRadiusCtlr::~NiPSysEmitterInitialRadiusCtlr() {}
 
-void NiPSysEmitterInitialRadiusCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterInitialRadiusCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterInitialRadiusCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterInitialRadiusCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
index 6ea30cbf..c6687deb 100644
--- a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
+++ b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
@@ -12,20 +12,20 @@ NiPSysEmitterLifeSpanCtlr::NiPSysEmitterLifeSpanCtlr() NI_P_SYS_EMITTER_LIFE_SPA
 
 NiPSysEmitterLifeSpanCtlr::~NiPSysEmitterLifeSpanCtlr() {}
 
-void NiPSysEmitterLifeSpanCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterLifeSpanCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterLifeSpanCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterLifeSpanCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterLifeSpanCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysEmitterSpeedCtlr.cpp b/src/obj/NiPSysEmitterSpeedCtlr.cpp
index 31853e7c..bdf13987 100644
--- a/src/obj/NiPSysEmitterSpeedCtlr.cpp
+++ b/src/obj/NiPSysEmitterSpeedCtlr.cpp
@@ -13,20 +13,20 @@ NiPSysEmitterSpeedCtlr::NiPSysEmitterSpeedCtlr() NI_P_SYS_EMITTER_SPEED_CTLR_CON
 
 NiPSysEmitterSpeedCtlr::~NiPSysEmitterSpeedCtlr() {}
 
-void NiPSysEmitterSpeedCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysEmitterSpeedCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysEmitterSpeedCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysEmitterSpeedCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysEmitterSpeedCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysEmitterSpeedCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysEmitterSpeedCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysEmitterSpeedCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysGravityModifier.cpp b/src/obj/NiPSysGravityModifier.cpp
index 458ae1a1..01eb1029 100644
--- a/src/obj/NiPSysGravityModifier.cpp
+++ b/src/obj/NiPSysGravityModifier.cpp
@@ -12,20 +12,20 @@ NiPSysGravityModifier::NiPSysGravityModifier() NI_P_SYS_GRAVITY_MODIFIER_CONSTRU
 
 NiPSysGravityModifier::~NiPSysGravityModifier() {}
 
-void NiPSysGravityModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGravityModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGravityModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGravityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGravityModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGravityModifier::GetRefs() const {
diff --git a/src/obj/NiPSysGravityStrengthCtlr.cpp b/src/obj/NiPSysGravityStrengthCtlr.cpp
index ab105e61..c9cf6253 100644
--- a/src/obj/NiPSysGravityStrengthCtlr.cpp
+++ b/src/obj/NiPSysGravityStrengthCtlr.cpp
@@ -12,20 +12,20 @@ NiPSysGravityStrengthCtlr::NiPSysGravityStrengthCtlr() NI_P_SYS_GRAVITY_STRENGTH
 
 NiPSysGravityStrengthCtlr::~NiPSysGravityStrengthCtlr() {}
 
-void NiPSysGravityStrengthCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGravityStrengthCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGravityStrengthCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGravityStrengthCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGravityStrengthCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGravityStrengthCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGravityStrengthCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGravityStrengthCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysGrowFadeModifier.cpp b/src/obj/NiPSysGrowFadeModifier.cpp
index 43f56f9e..20de9aa6 100644
--- a/src/obj/NiPSysGrowFadeModifier.cpp
+++ b/src/obj/NiPSysGrowFadeModifier.cpp
@@ -11,20 +11,20 @@ NiPSysGrowFadeModifier::NiPSysGrowFadeModifier() NI_P_SYS_GROW_FADE_MODIFIER_CON
 
 NiPSysGrowFadeModifier::~NiPSysGrowFadeModifier() {}
 
-void NiPSysGrowFadeModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysGrowFadeModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysGrowFadeModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysGrowFadeModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysGrowFadeModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysGrowFadeModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysGrowFadeModifier::GetRefs() const {
diff --git a/src/obj/NiPSysMeshEmitter.cpp b/src/obj/NiPSysMeshEmitter.cpp
index fcbdd317..ea1c4e2f 100644
--- a/src/obj/NiPSysMeshEmitter.cpp
+++ b/src/obj/NiPSysMeshEmitter.cpp
@@ -12,20 +12,20 @@ NiPSysMeshEmitter::NiPSysMeshEmitter() NI_P_SYS_MESH_EMITTER_CONSTRUCT {}
 
 NiPSysMeshEmitter::~NiPSysMeshEmitter() {}
 
-void NiPSysMeshEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysMeshEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysMeshEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysMeshEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysMeshEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysMeshEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysMeshEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysMeshUpdateModifier.cpp b/src/obj/NiPSysMeshUpdateModifier.cpp
index 8dc38098..ae629ee8 100644
--- a/src/obj/NiPSysMeshUpdateModifier.cpp
+++ b/src/obj/NiPSysMeshUpdateModifier.cpp
@@ -12,20 +12,20 @@ NiPSysMeshUpdateModifier::NiPSysMeshUpdateModifier() NI_P_SYS_MESH_UPDATE_MODIFI
 
 NiPSysMeshUpdateModifier::~NiPSysMeshUpdateModifier() {}
 
-void NiPSysMeshUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysMeshUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysMeshUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysMeshUpdateModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysMeshUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysMeshUpdateModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysMeshUpdateModifier::GetRefs() const {
diff --git a/src/obj/NiPSysModifier.cpp b/src/obj/NiPSysModifier.cpp
index 15de5152..9b769d1f 100644
--- a/src/obj/NiPSysModifier.cpp
+++ b/src/obj/NiPSysModifier.cpp
@@ -12,20 +12,20 @@ NiPSysModifier::NiPSysModifier() NI_P_SYS_MODIFIER_CONSTRUCT {}
 
 NiPSysModifier::~NiPSysModifier() {}
 
-void NiPSysModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysModifier::GetRefs() const {
diff --git a/src/obj/NiPSysModifierActiveCtlr.cpp b/src/obj/NiPSysModifierActiveCtlr.cpp
index 352d75bb..cb3aa4b8 100644
--- a/src/obj/NiPSysModifierActiveCtlr.cpp
+++ b/src/obj/NiPSysModifierActiveCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysModifierActiveCtlr::NiPSysModifierActiveCtlr() NI_P_SYS_MODIFIER_ACTIVE_CT
 
 NiPSysModifierActiveCtlr::~NiPSysModifierActiveCtlr() {}
 
-void NiPSysModifierActiveCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysModifierActiveCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysModifierActiveCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysModifierActiveCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysModifierActiveCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysModifierActiveCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysModifierActiveCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysPlanarCollider.cpp b/src/obj/NiPSysPlanarCollider.cpp
index f931eed2..0eeadf19 100644
--- a/src/obj/NiPSysPlanarCollider.cpp
+++ b/src/obj/NiPSysPlanarCollider.cpp
@@ -14,20 +14,20 @@ NiPSysPlanarCollider::NiPSysPlanarCollider() NI_P_SYS_PLANAR_COLLIDER_CONSTRUCT
 
 NiPSysPlanarCollider::~NiPSysPlanarCollider() {}
 
-void NiPSysPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysPlanarCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysPlanarCollider::GetRefs() const {
diff --git a/src/obj/NiPSysPositionModifier.cpp b/src/obj/NiPSysPositionModifier.cpp
index b09a7913..f1c74582 100644
--- a/src/obj/NiPSysPositionModifier.cpp
+++ b/src/obj/NiPSysPositionModifier.cpp
@@ -11,20 +11,20 @@ NiPSysPositionModifier::NiPSysPositionModifier() NI_P_SYS_POSITION_MODIFIER_CONS
 
 NiPSysPositionModifier::~NiPSysPositionModifier() {}
 
-void NiPSysPositionModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysPositionModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysPositionModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysPositionModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysPositionModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysPositionModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysPositionModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysPositionModifier::GetRefs() const {
diff --git a/src/obj/NiPSysResetOnLoopCtlr.cpp b/src/obj/NiPSysResetOnLoopCtlr.cpp
index 147e5f03..47eb901d 100644
--- a/src/obj/NiPSysResetOnLoopCtlr.cpp
+++ b/src/obj/NiPSysResetOnLoopCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysResetOnLoopCtlr::NiPSysResetOnLoopCtlr() NI_P_SYS_RESET_ON_LOOP_CTLR_CONST
 
 NiPSysResetOnLoopCtlr::~NiPSysResetOnLoopCtlr() {}
 
-void NiPSysResetOnLoopCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysResetOnLoopCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysResetOnLoopCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysResetOnLoopCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysResetOnLoopCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysResetOnLoopCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysResetOnLoopCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysRotationModifier.cpp b/src/obj/NiPSysRotationModifier.cpp
index 95fa37ab..2d96e2a2 100644
--- a/src/obj/NiPSysRotationModifier.cpp
+++ b/src/obj/NiPSysRotationModifier.cpp
@@ -11,20 +11,20 @@ NiPSysRotationModifier::NiPSysRotationModifier() NI_P_SYS_ROTATION_MODIFIER_CONS
 
 NiPSysRotationModifier::~NiPSysRotationModifier() {}
 
-void NiPSysRotationModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysRotationModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysRotationModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysRotationModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysRotationModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysRotationModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysRotationModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysRotationModifier::GetRefs() const {
diff --git a/src/obj/NiPSysSpawnModifier.cpp b/src/obj/NiPSysSpawnModifier.cpp
index c3c5251e..3520f2f2 100644
--- a/src/obj/NiPSysSpawnModifier.cpp
+++ b/src/obj/NiPSysSpawnModifier.cpp
@@ -11,20 +11,20 @@ NiPSysSpawnModifier::NiPSysSpawnModifier() NI_P_SYS_SPAWN_MODIFIER_CONSTRUCT {}
 
 NiPSysSpawnModifier::~NiPSysSpawnModifier() {}
 
-void NiPSysSpawnModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysSpawnModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysSpawnModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysSpawnModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysSpawnModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysSpawnModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysSpawnModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysSpawnModifier::GetRefs() const {
diff --git a/src/obj/NiPSysSphereEmitter.cpp b/src/obj/NiPSysSphereEmitter.cpp
index 1b4c8619..38d7a070 100644
--- a/src/obj/NiPSysSphereEmitter.cpp
+++ b/src/obj/NiPSysSphereEmitter.cpp
@@ -11,20 +11,20 @@ NiPSysSphereEmitter::NiPSysSphereEmitter() NI_P_SYS_SPHERE_EMITTER_CONSTRUCT {}
 
 NiPSysSphereEmitter::~NiPSysSphereEmitter() {}
 
-void NiPSysSphereEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysSphereEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysSphereEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysSphereEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysSphereEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysSphereEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysSphereEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysSphereEmitter::GetRefs() const {
diff --git a/src/obj/NiPSysUpdateCtlr.cpp b/src/obj/NiPSysUpdateCtlr.cpp
index ad0980f8..7fedf06a 100644
--- a/src/obj/NiPSysUpdateCtlr.cpp
+++ b/src/obj/NiPSysUpdateCtlr.cpp
@@ -11,20 +11,20 @@ NiPSysUpdateCtlr::NiPSysUpdateCtlr() NI_P_SYS_UPDATE_CTLR_CONSTRUCT {}
 
 NiPSysUpdateCtlr::~NiPSysUpdateCtlr() {}
 
-void NiPSysUpdateCtlr::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysUpdateCtlr::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysUpdateCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysUpdateCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysUpdateCtlr::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysUpdateCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysUpdateCtlr::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysUpdateCtlr::GetRefs() const {
diff --git a/src/obj/NiPSysVolumeEmitter.cpp b/src/obj/NiPSysVolumeEmitter.cpp
index 32e8dd77..cfaa05a8 100644
--- a/src/obj/NiPSysVolumeEmitter.cpp
+++ b/src/obj/NiPSysVolumeEmitter.cpp
@@ -12,20 +12,20 @@ NiPSysVolumeEmitter::NiPSysVolumeEmitter() NI_P_SYS_VOLUME_EMITTER_CONSTRUCT {}
 
 NiPSysVolumeEmitter::~NiPSysVolumeEmitter() {}
 
-void NiPSysVolumeEmitter::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPSysVolumeEmitter::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPSysVolumeEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPSysVolumeEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPSysVolumeEmitter::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPSysVolumeEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPSysVolumeEmitter::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPSysVolumeEmitter::GetRefs() const {
diff --git a/src/obj/NiPalette.cpp b/src/obj/NiPalette.cpp
index c3db59ee..5cc31e4a 100644
--- a/src/obj/NiPalette.cpp
+++ b/src/obj/NiPalette.cpp
@@ -11,20 +11,20 @@ NiPalette::NiPalette() NI_PALETTE_CONSTRUCT {}
 
 NiPalette::~NiPalette() {}
 
-void NiPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPalette::GetRefs() const {
diff --git a/src/obj/NiParticleBomb.cpp b/src/obj/NiParticleBomb.cpp
index 70172da4..aea20b39 100644
--- a/src/obj/NiParticleBomb.cpp
+++ b/src/obj/NiParticleBomb.cpp
@@ -11,20 +11,20 @@ NiParticleBomb::NiParticleBomb() NI_PARTICLE_BOMB_CONSTRUCT {}
 
 NiParticleBomb::~NiParticleBomb() {}
 
-void NiParticleBomb::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleBomb::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleBomb::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleBomb::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleBomb::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleBomb::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleBomb::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleBomb::GetRefs() const {
diff --git a/src/obj/NiParticleColorModifier.cpp b/src/obj/NiParticleColorModifier.cpp
index 398c1546..2d50f417 100644
--- a/src/obj/NiParticleColorModifier.cpp
+++ b/src/obj/NiParticleColorModifier.cpp
@@ -12,20 +12,20 @@ NiParticleColorModifier::NiParticleColorModifier() NI_PARTICLE_COLOR_MODIFIER_CO
 
 NiParticleColorModifier::~NiParticleColorModifier() {}
 
-void NiParticleColorModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleColorModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleColorModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleColorModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleColorModifier::GetRefs() const {
diff --git a/src/obj/NiParticleGrowFade.cpp b/src/obj/NiParticleGrowFade.cpp
index d803fbcf..8ac1f794 100644
--- a/src/obj/NiParticleGrowFade.cpp
+++ b/src/obj/NiParticleGrowFade.cpp
@@ -11,20 +11,20 @@ NiParticleGrowFade::NiParticleGrowFade() NI_PARTICLE_GROW_FADE_CONSTRUCT {}
 
 NiParticleGrowFade::~NiParticleGrowFade() {}
 
-void NiParticleGrowFade::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleGrowFade::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleGrowFade::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleGrowFade::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleGrowFade::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleGrowFade::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleGrowFade::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleGrowFade::GetRefs() const {
diff --git a/src/obj/NiParticleMeshModifier.cpp b/src/obj/NiParticleMeshModifier.cpp
index c00ec9ea..24812ea7 100644
--- a/src/obj/NiParticleMeshModifier.cpp
+++ b/src/obj/NiParticleMeshModifier.cpp
@@ -12,20 +12,20 @@ NiParticleMeshModifier::NiParticleMeshModifier() NI_PARTICLE_MESH_MODIFIER_CONST
 
 NiParticleMeshModifier::~NiParticleMeshModifier() {}
 
-void NiParticleMeshModifier::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshModifier::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshModifier::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshModifier::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshModifier::GetRefs() const {
diff --git a/src/obj/NiParticleMeshes.cpp b/src/obj/NiParticleMeshes.cpp
index b8bb43fa..dc78081a 100644
--- a/src/obj/NiParticleMeshes.cpp
+++ b/src/obj/NiParticleMeshes.cpp
@@ -11,20 +11,20 @@ NiParticleMeshes::NiParticleMeshes() NI_PARTICLE_MESHES_CONSTRUCT {}
 
 NiParticleMeshes::~NiParticleMeshes() {}
 
-void NiParticleMeshes::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshes::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshes::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshes::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshes::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshes::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshes::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshes::GetRefs() const {
diff --git a/src/obj/NiParticleMeshesData.cpp b/src/obj/NiParticleMeshesData.cpp
index b995e5dd..2bcb9ab5 100644
--- a/src/obj/NiParticleMeshesData.cpp
+++ b/src/obj/NiParticleMeshesData.cpp
@@ -12,20 +12,20 @@ NiParticleMeshesData::NiParticleMeshesData() NI_PARTICLE_MESHES_DATA_CONSTRUCT {
 
 NiParticleMeshesData::~NiParticleMeshesData() {}
 
-void NiParticleMeshesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleMeshesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleMeshesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleMeshesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleMeshesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleMeshesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleMeshesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleMeshesData::GetRefs() const {
diff --git a/src/obj/NiParticleRotation.cpp b/src/obj/NiParticleRotation.cpp
index d9c51bf3..a55791a5 100644
--- a/src/obj/NiParticleRotation.cpp
+++ b/src/obj/NiParticleRotation.cpp
@@ -11,20 +11,20 @@ NiParticleRotation::NiParticleRotation() NI_PARTICLE_ROTATION_CONSTRUCT {}
 
 NiParticleRotation::~NiParticleRotation() {}
 
-void NiParticleRotation::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleRotation::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleRotation::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleRotation::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleRotation::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleRotation::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleRotation::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleRotation::GetRefs() const {
diff --git a/src/obj/NiParticleSystem.cpp b/src/obj/NiParticleSystem.cpp
index ca1d43fc..2866766a 100644
--- a/src/obj/NiParticleSystem.cpp
+++ b/src/obj/NiParticleSystem.cpp
@@ -12,20 +12,20 @@ NiParticleSystem::NiParticleSystem() NI_PARTICLE_SYSTEM_CONSTRUCT {}
 
 NiParticleSystem::~NiParticleSystem() {}
 
-void NiParticleSystem::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleSystem::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleSystem::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleSystem::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleSystem::GetRefs() const {
diff --git a/src/obj/NiParticleSystemController.cpp b/src/obj/NiParticleSystemController.cpp
index 44bf011f..b7ab5a10 100644
--- a/src/obj/NiParticleSystemController.cpp
+++ b/src/obj/NiParticleSystemController.cpp
@@ -14,20 +14,20 @@ NiParticleSystemController::NiParticleSystemController() NI_PARTICLE_SYSTEM_CONT
 
 NiParticleSystemController::~NiParticleSystemController() {}
 
-void NiParticleSystemController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticleSystemController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticleSystemController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticleSystemController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticleSystemController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticleSystemController::GetRefs() const {
diff --git a/src/obj/NiParticles.cpp b/src/obj/NiParticles.cpp
index 04c31fea..f24464e9 100644
--- a/src/obj/NiParticles.cpp
+++ b/src/obj/NiParticles.cpp
@@ -11,20 +11,20 @@ NiParticles::NiParticles() NI_PARTICLES_CONSTRUCT {}
 
 NiParticles::~NiParticles() {}
 
-void NiParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticles::GetRefs() const {
diff --git a/src/obj/NiParticlesData.cpp b/src/obj/NiParticlesData.cpp
index 874301ad..f9e315fb 100644
--- a/src/obj/NiParticlesData.cpp
+++ b/src/obj/NiParticlesData.cpp
@@ -11,20 +11,20 @@ NiParticlesData::NiParticlesData() NI_PARTICLES_DATA_CONSTRUCT {}
 
 NiParticlesData::~NiParticlesData() {}
 
-void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiParticlesData::GetRefs() const {
diff --git a/src/obj/NiPathController.cpp b/src/obj/NiPathController.cpp
index 77d90b56..1aa726a3 100644
--- a/src/obj/NiPathController.cpp
+++ b/src/obj/NiPathController.cpp
@@ -13,20 +13,20 @@ NiPathController::NiPathController() NI_PATH_CONTROLLER_CONSTRUCT {}
 
 NiPathController::~NiPathController() {}
 
-void NiPathController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPathController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPathController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPathController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPathController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPathController::GetRefs() const {
diff --git a/src/obj/NiPathInterpolator.cpp b/src/obj/NiPathInterpolator.cpp
index e59456a9..659178c8 100644
--- a/src/obj/NiPathInterpolator.cpp
+++ b/src/obj/NiPathInterpolator.cpp
@@ -13,20 +13,20 @@ NiPathInterpolator::NiPathInterpolator() NI_PATH_INTERPOLATOR_CONSTRUCT {}
 
 NiPathInterpolator::~NiPathInterpolator() {}
 
-void NiPathInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPathInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPathInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPathInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPathInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPathInterpolator::GetRefs() const {
diff --git a/src/obj/NiPixelData.cpp b/src/obj/NiPixelData.cpp
index ee4c031b..7aadf9bd 100644
--- a/src/obj/NiPixelData.cpp
+++ b/src/obj/NiPixelData.cpp
@@ -14,20 +14,20 @@ NiPixelData::NiPixelData() NI_PIXEL_DATA_CONSTRUCT {}
 
 NiPixelData::~NiPixelData() {}
 
-void NiPixelData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPixelData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPixelData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPixelData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPixelData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPixelData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPixelData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPixelData::GetRefs() const {
diff --git a/src/obj/NiPlanarCollider.cpp b/src/obj/NiPlanarCollider.cpp
index 421e8303..71a96f61 100644
--- a/src/obj/NiPlanarCollider.cpp
+++ b/src/obj/NiPlanarCollider.cpp
@@ -11,20 +11,20 @@ NiPlanarCollider::NiPlanarCollider() NI_PLANAR_COLLIDER_CONSTRUCT {}
 
 NiPlanarCollider::~NiPlanarCollider() {}
 
-void NiPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPlanarCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPlanarCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPlanarCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPlanarCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPlanarCollider::GetRefs() const {
diff --git a/src/obj/NiPoint3Interpolator.cpp b/src/obj/NiPoint3Interpolator.cpp
index 321a4478..9943ab61 100644
--- a/src/obj/NiPoint3Interpolator.cpp
+++ b/src/obj/NiPoint3Interpolator.cpp
@@ -12,20 +12,20 @@ NiPoint3Interpolator::NiPoint3Interpolator() NI_POINT3_INTERPOLATOR_CONSTRUCT {}
 
 NiPoint3Interpolator::~NiPoint3Interpolator() {}
 
-void NiPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPoint3Interpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPoint3Interpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPoint3Interpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPoint3Interpolator::GetRefs() const {
diff --git a/src/obj/NiPointLight.cpp b/src/obj/NiPointLight.cpp
index 7d2d571e..fb711e77 100644
--- a/src/obj/NiPointLight.cpp
+++ b/src/obj/NiPointLight.cpp
@@ -11,20 +11,20 @@ NiPointLight::NiPointLight() NI_POINT_LIGHT_CONSTRUCT {}
 
 NiPointLight::~NiPointLight() {}
 
-void NiPointLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPointLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPointLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPointLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPointLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPointLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPointLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPointLight::GetRefs() const {
diff --git a/src/obj/NiPosData.cpp b/src/obj/NiPosData.cpp
index 79de5011..33e69ab3 100644
--- a/src/obj/NiPosData.cpp
+++ b/src/obj/NiPosData.cpp
@@ -12,20 +12,20 @@ NiPosData::NiPosData() NI_POS_DATA_CONSTRUCT {}
 
 NiPosData::~NiPosData() {}
 
-void NiPosData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiPosData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiPosData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiPosData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiPosData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiPosData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiPosData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiPosData::GetRefs() const {
diff --git a/src/obj/NiProperty.cpp b/src/obj/NiProperty.cpp
index cbade92f..e70d314d 100644
--- a/src/obj/NiProperty.cpp
+++ b/src/obj/NiProperty.cpp
@@ -11,20 +11,20 @@ NiProperty::NiProperty() NI_PROPERTY_CONSTRUCT {}
 
 NiProperty::~NiProperty() {}
 
-void NiProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiProperty::GetRefs() const {
diff --git a/src/obj/NiRangeLODData.cpp b/src/obj/NiRangeLODData.cpp
index dcea35de..f2e6016c 100644
--- a/src/obj/NiRangeLODData.cpp
+++ b/src/obj/NiRangeLODData.cpp
@@ -12,20 +12,20 @@ NiRangeLODData::NiRangeLODData() NI_RANGE_L_O_D_DATA_CONSTRUCT {}
 
 NiRangeLODData::~NiRangeLODData() {}
 
-void NiRangeLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRangeLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRangeLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRangeLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRangeLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRangeLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRangeLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRangeLODData::GetRefs() const {
diff --git a/src/obj/NiRotatingParticles.cpp b/src/obj/NiRotatingParticles.cpp
index 75fddfa4..424d46e0 100644
--- a/src/obj/NiRotatingParticles.cpp
+++ b/src/obj/NiRotatingParticles.cpp
@@ -11,20 +11,20 @@ NiRotatingParticles::NiRotatingParticles() NI_ROTATING_PARTICLES_CONSTRUCT {}
 
 NiRotatingParticles::~NiRotatingParticles() {}
 
-void NiRotatingParticles::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRotatingParticles::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRotatingParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRotatingParticles::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRotatingParticles::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRotatingParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticles::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRotatingParticles::GetRefs() const {
diff --git a/src/obj/NiRotatingParticlesData.cpp b/src/obj/NiRotatingParticlesData.cpp
index 754ef6bd..6f4a482b 100644
--- a/src/obj/NiRotatingParticlesData.cpp
+++ b/src/obj/NiRotatingParticlesData.cpp
@@ -11,20 +11,20 @@ NiRotatingParticlesData::NiRotatingParticlesData() NI_ROTATING_PARTICLES_DATA_CO
 
 NiRotatingParticlesData::~NiRotatingParticlesData() {}
 
-void NiRotatingParticlesData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiRotatingParticlesData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiRotatingParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiRotatingParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiRotatingParticlesData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiRotatingParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiRotatingParticlesData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiRotatingParticlesData::GetRefs() const {
diff --git a/src/obj/NiScreenLODData.cpp b/src/obj/NiScreenLODData.cpp
index 5c0ac37d..c6982408 100644
--- a/src/obj/NiScreenLODData.cpp
+++ b/src/obj/NiScreenLODData.cpp
@@ -11,20 +11,20 @@ NiScreenLODData::NiScreenLODData() NI_SCREEN_L_O_D_DATA_CONSTRUCT {}
 
 NiScreenLODData::~NiScreenLODData() {}
 
-void NiScreenLODData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiScreenLODData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiScreenLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiScreenLODData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiScreenLODData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiScreenLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiScreenLODData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiScreenLODData::GetRefs() const {
diff --git a/src/obj/NiSequenceStreamHelper.cpp b/src/obj/NiSequenceStreamHelper.cpp
index 93ce5563..3976c0f8 100644
--- a/src/obj/NiSequenceStreamHelper.cpp
+++ b/src/obj/NiSequenceStreamHelper.cpp
@@ -11,20 +11,20 @@ NiSequenceStreamHelper::NiSequenceStreamHelper() NI_SEQUENCE_STREAM_HELPER_CONST
 
 NiSequenceStreamHelper::~NiSequenceStreamHelper() {}
 
-void NiSequenceStreamHelper::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSequenceStreamHelper::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSequenceStreamHelper::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSequenceStreamHelper::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSequenceStreamHelper::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSequenceStreamHelper::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSequenceStreamHelper::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSequenceStreamHelper::GetRefs() const {
diff --git a/src/obj/NiShadeProperty.cpp b/src/obj/NiShadeProperty.cpp
index e9397a2c..aa95e9cf 100644
--- a/src/obj/NiShadeProperty.cpp
+++ b/src/obj/NiShadeProperty.cpp
@@ -11,20 +11,20 @@ NiShadeProperty::NiShadeProperty() NI_SHADE_PROPERTY_CONSTRUCT {}
 
 NiShadeProperty::~NiShadeProperty() {}
 
-void NiShadeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiShadeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiShadeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiShadeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiShadeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiShadeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiShadeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiShadeProperty::GetRefs() const {
diff --git a/src/obj/NiSingleInterpolatorController.cpp b/src/obj/NiSingleInterpolatorController.cpp
index 036f2e65..95a9a1dc 100644
--- a/src/obj/NiSingleInterpolatorController.cpp
+++ b/src/obj/NiSingleInterpolatorController.cpp
@@ -12,20 +12,20 @@ NiSingleInterpolatorController::NiSingleInterpolatorController() NI_SINGLE_INTER
 
 NiSingleInterpolatorController::~NiSingleInterpolatorController() {}
 
-void NiSingleInterpolatorController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSingleInterpolatorController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSingleInterpolatorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSingleInterpolatorController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSingleInterpolatorController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSingleInterpolatorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSingleInterpolatorController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSingleInterpolatorController::GetRefs() const {
diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp
index df8924ed..448428fd 100644
--- a/src/obj/NiSkinData.cpp
+++ b/src/obj/NiSkinData.cpp
@@ -17,20 +17,20 @@ NiSkinData::NiSkinData() NI_SKIN_DATA_CONSTRUCT {}
 
 NiSkinData::~NiSkinData() {}
 
-void NiSkinData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSkinData::GetRefs() const {
diff --git a/src/obj/NiSkinInstance.cpp b/src/obj/NiSkinInstance.cpp
index 694537de..6794b761 100644
--- a/src/obj/NiSkinInstance.cpp
+++ b/src/obj/NiSkinInstance.cpp
@@ -59,20 +59,20 @@ NiSkinInstance::~NiSkinInstance() {
 	}
 }
 
-void NiSkinInstance::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinInstance::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinInstance::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinInstance::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 
 	//Inform newly fixed skeleton root of attachment
 	if ( skeletonRoot != NULL ) {
diff --git a/src/obj/NiSkinPartition.cpp b/src/obj/NiSkinPartition.cpp
index 93cae031..6f9291fe 100644
--- a/src/obj/NiSkinPartition.cpp
+++ b/src/obj/NiSkinPartition.cpp
@@ -31,20 +31,20 @@ NiSkinPartition::NiSkinPartition() NI_SKIN_PARTITION_CONSTRUCT {}
 
 NiSkinPartition::~NiSkinPartition() {}
 
-void NiSkinPartition::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSkinPartition::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSkinPartition::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSkinPartition::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSkinPartition::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSkinPartition::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSkinPartition::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSkinPartition::GetRefs() const {
diff --git a/src/obj/NiSourceTexture.cpp b/src/obj/NiSourceTexture.cpp
index 46114bb0..ddf2773d 100644
--- a/src/obj/NiSourceTexture.cpp
+++ b/src/obj/NiSourceTexture.cpp
@@ -13,20 +13,20 @@ NiSourceTexture::NiSourceTexture() NI_SOURCE_TEXTURE_CONSTRUCT {}
 
 NiSourceTexture::~NiSourceTexture() {}
 
-void NiSourceTexture::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSourceTexture::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSourceTexture::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSourceTexture::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSourceTexture::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSourceTexture::GetRefs() const {
diff --git a/src/obj/NiSpecularProperty.cpp b/src/obj/NiSpecularProperty.cpp
index 3d312b10..35e020a6 100644
--- a/src/obj/NiSpecularProperty.cpp
+++ b/src/obj/NiSpecularProperty.cpp
@@ -11,20 +11,20 @@ NiSpecularProperty::NiSpecularProperty() NI_SPECULAR_PROPERTY_CONSTRUCT {}
 
 NiSpecularProperty::~NiSpecularProperty() {}
 
-void NiSpecularProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSpecularProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSpecularProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSpecularProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSpecularProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSpecularProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSpecularProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSpecularProperty::GetRefs() const {
diff --git a/src/obj/NiSphericalCollider.cpp b/src/obj/NiSphericalCollider.cpp
index b0d7d389..d9ff0066 100644
--- a/src/obj/NiSphericalCollider.cpp
+++ b/src/obj/NiSphericalCollider.cpp
@@ -11,20 +11,20 @@ NiSphericalCollider::NiSphericalCollider() NI_SPHERICAL_COLLIDER_CONSTRUCT {}
 
 NiSphericalCollider::~NiSphericalCollider() {}
 
-void NiSphericalCollider::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSphericalCollider::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSphericalCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSphericalCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSphericalCollider::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSphericalCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSphericalCollider::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSphericalCollider::GetRefs() const {
diff --git a/src/obj/NiSpotLight.cpp b/src/obj/NiSpotLight.cpp
index 2773c301..164b9174 100644
--- a/src/obj/NiSpotLight.cpp
+++ b/src/obj/NiSpotLight.cpp
@@ -11,20 +11,20 @@ NiSpotLight::NiSpotLight() NI_SPOT_LIGHT_CONSTRUCT {}
 
 NiSpotLight::~NiSpotLight() {}
 
-void NiSpotLight::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiSpotLight::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiSpotLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiSpotLight::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiSpotLight::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiSpotLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiSpotLight::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiSpotLight::GetRefs() const {
diff --git a/src/obj/NiStencilProperty.cpp b/src/obj/NiStencilProperty.cpp
index a78e2c35..08b968cf 100644
--- a/src/obj/NiStencilProperty.cpp
+++ b/src/obj/NiStencilProperty.cpp
@@ -11,20 +11,20 @@ NiStencilProperty::NiStencilProperty() NI_STENCIL_PROPERTY_CONSTRUCT {}
 
 NiStencilProperty::~NiStencilProperty() {}
 
-void NiStencilProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStencilProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStencilProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStencilProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStencilProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStencilProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStencilProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStencilProperty::GetRefs() const {
diff --git a/src/obj/NiStringExtraData.cpp b/src/obj/NiStringExtraData.cpp
index 55a7c371..d2640659 100644
--- a/src/obj/NiStringExtraData.cpp
+++ b/src/obj/NiStringExtraData.cpp
@@ -11,20 +11,20 @@ NiStringExtraData::NiStringExtraData() NI_STRING_EXTRA_DATA_CONSTRUCT {}
 
 NiStringExtraData::~NiStringExtraData() {}
 
-void NiStringExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringExtraData::GetRefs() const {
diff --git a/src/obj/NiStringPalette.cpp b/src/obj/NiStringPalette.cpp
index 9a4f7d6d..a513746f 100644
--- a/src/obj/NiStringPalette.cpp
+++ b/src/obj/NiStringPalette.cpp
@@ -12,20 +12,20 @@ NiStringPalette::NiStringPalette() NI_STRING_PALETTE_CONSTRUCT {}
 
 NiStringPalette::~NiStringPalette() {}
 
-void NiStringPalette::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringPalette::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringPalette::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringPalette::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringPalette::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringPalette::GetRefs() const {
diff --git a/src/obj/NiStringsExtraData.cpp b/src/obj/NiStringsExtraData.cpp
index 20c3ee3f..4581ef56 100644
--- a/src/obj/NiStringsExtraData.cpp
+++ b/src/obj/NiStringsExtraData.cpp
@@ -11,20 +11,20 @@ NiStringsExtraData::NiStringsExtraData() NI_STRINGS_EXTRA_DATA_CONSTRUCT {}
 
 NiStringsExtraData::~NiStringsExtraData() {}
 
-void NiStringsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiStringsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiStringsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiStringsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiStringsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiStringsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiStringsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiStringsExtraData::GetRefs() const {
diff --git a/src/obj/NiTextKeyExtraData.cpp b/src/obj/NiTextKeyExtraData.cpp
index 0965b1f1..7a3aefe7 100644
--- a/src/obj/NiTextKeyExtraData.cpp
+++ b/src/obj/NiTextKeyExtraData.cpp
@@ -11,20 +11,20 @@ NiTextKeyExtraData::NiTextKeyExtraData() NI_TEXT_KEY_EXTRA_DATA_CONSTRUCT {}
 
 NiTextKeyExtraData::~NiTextKeyExtraData() {}
 
-void NiTextKeyExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextKeyExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextKeyExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextKeyExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextKeyExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextKeyExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextKeyExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextKeyExtraData::GetRefs() const {
diff --git a/src/obj/NiTextureEffect.cpp b/src/obj/NiTextureEffect.cpp
index 820999c4..83556339 100644
--- a/src/obj/NiTextureEffect.cpp
+++ b/src/obj/NiTextureEffect.cpp
@@ -12,20 +12,20 @@ NiTextureEffect::NiTextureEffect() NI_TEXTURE_EFFECT_CONSTRUCT {}
 
 NiTextureEffect::~NiTextureEffect() {}
 
-void NiTextureEffect::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureEffect::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureEffect::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureEffect::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureEffect::GetRefs() const {
diff --git a/src/obj/NiTextureModeProperty.cpp b/src/obj/NiTextureModeProperty.cpp
index 4010601b..77b098ce 100644
--- a/src/obj/NiTextureModeProperty.cpp
+++ b/src/obj/NiTextureModeProperty.cpp
@@ -11,20 +11,20 @@ NiTextureModeProperty::NiTextureModeProperty() NI_TEXTURE_MODE_PROPERTY_CONSTRUC
 
 NiTextureModeProperty::~NiTextureModeProperty() {}
 
-void NiTextureModeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureModeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureModeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureModeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureModeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureModeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureModeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureModeProperty::GetRefs() const {
diff --git a/src/obj/NiTextureProperty.cpp b/src/obj/NiTextureProperty.cpp
index e3aae486..d7281507 100644
--- a/src/obj/NiTextureProperty.cpp
+++ b/src/obj/NiTextureProperty.cpp
@@ -12,20 +12,20 @@ NiTextureProperty::NiTextureProperty() NI_TEXTURE_PROPERTY_CONSTRUCT {}
 
 NiTextureProperty::~NiTextureProperty() {}
 
-void NiTextureProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureProperty::GetRefs() const {
diff --git a/src/obj/NiTextureTransformController.cpp b/src/obj/NiTextureTransformController.cpp
index 3d079c30..fd4382db 100644
--- a/src/obj/NiTextureTransformController.cpp
+++ b/src/obj/NiTextureTransformController.cpp
@@ -12,20 +12,20 @@ NiTextureTransformController::NiTextureTransformController() NI_TEXTURE_TRANSFOR
 
 NiTextureTransformController::~NiTextureTransformController() {}
 
-void NiTextureTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTextureTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTextureTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTextureTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTextureTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTextureTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTextureTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTextureTransformController::GetRefs() const {
diff --git a/src/obj/NiTexturingProperty.cpp b/src/obj/NiTexturingProperty.cpp
index 00742454..a8a588b1 100644
--- a/src/obj/NiTexturingProperty.cpp
+++ b/src/obj/NiTexturingProperty.cpp
@@ -13,20 +13,20 @@ NiTexturingProperty::NiTexturingProperty() NI_TEXTURING_PROPERTY_CONSTRUCT {}
 
 NiTexturingProperty::~NiTexturingProperty() {}
 
-void NiTexturingProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTexturingProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTexturingProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTexturingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTexturingProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTexturingProperty::GetRefs() const {
diff --git a/src/obj/NiTimeController.cpp b/src/obj/NiTimeController.cpp
index c583566d..5d580c2f 100644
--- a/src/obj/NiTimeController.cpp
+++ b/src/obj/NiTimeController.cpp
@@ -12,20 +12,20 @@ NiTimeController::NiTimeController() NI_TIME_CONTROLLER_CONSTRUCT {}
 
 NiTimeController::~NiTimeController() {}
 
-void NiTimeController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTimeController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTimeController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTimeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTimeController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTimeController::GetRefs() const {
diff --git a/src/obj/NiTransformController.cpp b/src/obj/NiTransformController.cpp
index 9f936a2f..742b31d1 100644
--- a/src/obj/NiTransformController.cpp
+++ b/src/obj/NiTransformController.cpp
@@ -11,20 +11,20 @@ NiTransformController::NiTransformController() NI_TRANSFORM_CONTROLLER_CONSTRUCT
 
 NiTransformController::~NiTransformController() {}
 
-void NiTransformController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformController::GetRefs() const {
diff --git a/src/obj/NiTransformData.cpp b/src/obj/NiTransformData.cpp
index db46591f..e6f56314 100644
--- a/src/obj/NiTransformData.cpp
+++ b/src/obj/NiTransformData.cpp
@@ -11,20 +11,20 @@ NiTransformData::NiTransformData() NI_TRANSFORM_DATA_CONSTRUCT {}
 
 NiTransformData::~NiTransformData() {}
 
-void NiTransformData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformData::GetRefs() const {
diff --git a/src/obj/NiTransformInterpolator.cpp b/src/obj/NiTransformInterpolator.cpp
index b26e9ae5..467e5eeb 100644
--- a/src/obj/NiTransformInterpolator.cpp
+++ b/src/obj/NiTransformInterpolator.cpp
@@ -12,20 +12,20 @@ NiTransformInterpolator::NiTransformInterpolator() NI_TRANSFORM_INTERPOLATOR_CON
 
 NiTransformInterpolator::~NiTransformInterpolator() {}
 
-void NiTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTransformInterpolator::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTransformInterpolator::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTransformInterpolator::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTransformInterpolator::GetRefs() const {
diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp
index a65bd465..be255c05 100644
--- a/src/obj/NiTriBasedGeom.cpp
+++ b/src/obj/NiTriBasedGeom.cpp
@@ -18,20 +18,20 @@ NiTriBasedGeom::NiTriBasedGeom() NI_TRI_BASED_GEOM_CONSTRUCT {}
 
 NiTriBasedGeom::~NiTriBasedGeom() {}
 
-void NiTriBasedGeom::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriBasedGeom::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriBasedGeom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriBasedGeom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriBasedGeom::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriBasedGeom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriBasedGeom::GetRefs() const {
diff --git a/src/obj/NiTriBasedGeomData.cpp b/src/obj/NiTriBasedGeomData.cpp
index 148222b4..adc97de9 100644
--- a/src/obj/NiTriBasedGeomData.cpp
+++ b/src/obj/NiTriBasedGeomData.cpp
@@ -12,20 +12,20 @@ NiTriBasedGeomData::NiTriBasedGeomData() NI_TRI_BASED_GEOM_DATA_CONSTRUCT {}
 
 NiTriBasedGeomData::~NiTriBasedGeomData() {}
 
-void NiTriBasedGeomData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriBasedGeomData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriBasedGeomData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriBasedGeomData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriBasedGeomData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriBasedGeomData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriBasedGeomData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriBasedGeomData::GetRefs() const {
diff --git a/src/obj/NiTriShape.cpp b/src/obj/NiTriShape.cpp
index b52bada7..42744c1a 100644
--- a/src/obj/NiTriShape.cpp
+++ b/src/obj/NiTriShape.cpp
@@ -11,20 +11,20 @@ NiTriShape::NiTriShape() NI_TRI_SHAPE_CONSTRUCT {}
 
 NiTriShape::~NiTriShape() {}
 
-void NiTriShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriShape::GetRefs() const {
diff --git a/src/obj/NiTriShapeData.cpp b/src/obj/NiTriShapeData.cpp
index fb7c89fc..4cdba1d3 100644
--- a/src/obj/NiTriShapeData.cpp
+++ b/src/obj/NiTriShapeData.cpp
@@ -12,20 +12,20 @@ NiTriShapeData::NiTriShapeData() NI_TRI_SHAPE_DATA_CONSTRUCT {}
 
 NiTriShapeData::~NiTriShapeData() {}
 
-void NiTriShapeData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriShapeData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriShapeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriShapeData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriShapeData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriShapeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriShapeData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriShapeData::GetRefs() const {
diff --git a/src/obj/NiTriStrips.cpp b/src/obj/NiTriStrips.cpp
index 6131cae8..582dba11 100644
--- a/src/obj/NiTriStrips.cpp
+++ b/src/obj/NiTriStrips.cpp
@@ -11,20 +11,20 @@ NiTriStrips::NiTriStrips() NI_TRI_STRIPS_CONSTRUCT {}
 
 NiTriStrips::~NiTriStrips() {}
 
-void NiTriStrips::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriStrips::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriStrips::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriStrips::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriStrips::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriStrips::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriStrips::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriStrips::GetRefs() const {
diff --git a/src/obj/NiTriStripsData.cpp b/src/obj/NiTriStripsData.cpp
index b36ce652..488ee3a2 100644
--- a/src/obj/NiTriStripsData.cpp
+++ b/src/obj/NiTriStripsData.cpp
@@ -20,20 +20,20 @@ NiTriStripsData::NiTriStripsData() NI_TRI_STRIPS_DATA_CONSTRUCT {}
 
 NiTriStripsData::~NiTriStripsData() {}
 
-void NiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiTriStripsData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiTriStripsData::GetRefs() const {
diff --git a/src/obj/NiUVController.cpp b/src/obj/NiUVController.cpp
index ffadd60a..ae89f5e4 100644
--- a/src/obj/NiUVController.cpp
+++ b/src/obj/NiUVController.cpp
@@ -12,20 +12,20 @@ NiUVController::NiUVController() NI_U_V_CONTROLLER_CONSTRUCT {}
 
 NiUVController::~NiUVController() {}
 
-void NiUVController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiUVController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiUVController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiUVController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiUVController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiUVController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiUVController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiUVController::GetRefs() const {
diff --git a/src/obj/NiUVData.cpp b/src/obj/NiUVData.cpp
index f635dc0d..4c83a476 100644
--- a/src/obj/NiUVData.cpp
+++ b/src/obj/NiUVData.cpp
@@ -12,20 +12,20 @@ NiUVData::NiUVData() NI_U_V_DATA_CONSTRUCT {}
 
 NiUVData::~NiUVData() {}
 
-void NiUVData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiUVData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiUVData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiUVData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiUVData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiUVData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiUVData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiUVData::GetRefs() const {
diff --git a/src/obj/NiVectorExtraData.cpp b/src/obj/NiVectorExtraData.cpp
index 81d6e399..4d6526b6 100644
--- a/src/obj/NiVectorExtraData.cpp
+++ b/src/obj/NiVectorExtraData.cpp
@@ -11,20 +11,20 @@ NiVectorExtraData::NiVectorExtraData() NI_VECTOR_EXTRA_DATA_CONSTRUCT {}
 
 NiVectorExtraData::~NiVectorExtraData() {}
 
-void NiVectorExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVectorExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVectorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVectorExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVectorExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVectorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVectorExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVectorExtraData::GetRefs() const {
diff --git a/src/obj/NiVertWeightsExtraData.cpp b/src/obj/NiVertWeightsExtraData.cpp
index d78a614c..29bc214b 100644
--- a/src/obj/NiVertWeightsExtraData.cpp
+++ b/src/obj/NiVertWeightsExtraData.cpp
@@ -11,20 +11,20 @@ NiVertWeightsExtraData::NiVertWeightsExtraData() NI_VERT_WEIGHTS_EXTRA_DATA_CONS
 
 NiVertWeightsExtraData::~NiVertWeightsExtraData() {}
 
-void NiVertWeightsExtraData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVertWeightsExtraData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVertWeightsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVertWeightsExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVertWeightsExtraData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVertWeightsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVertWeightsExtraData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVertWeightsExtraData::GetRefs() const {
diff --git a/src/obj/NiVertexColorProperty.cpp b/src/obj/NiVertexColorProperty.cpp
index 2660e963..bb774889 100644
--- a/src/obj/NiVertexColorProperty.cpp
+++ b/src/obj/NiVertexColorProperty.cpp
@@ -11,20 +11,20 @@ NiVertexColorProperty::NiVertexColorProperty() NI_VERTEX_COLOR_PROPERTY_CONSTRUC
 
 NiVertexColorProperty::~NiVertexColorProperty() {}
 
-void NiVertexColorProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVertexColorProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVertexColorProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVertexColorProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVertexColorProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVertexColorProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVertexColorProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVertexColorProperty::GetRefs() const {
diff --git a/src/obj/NiVisController.cpp b/src/obj/NiVisController.cpp
index 079eafe6..fdd4c95a 100644
--- a/src/obj/NiVisController.cpp
+++ b/src/obj/NiVisController.cpp
@@ -12,20 +12,20 @@ NiVisController::NiVisController() NI_VIS_CONTROLLER_CONSTRUCT {}
 
 NiVisController::~NiVisController() {}
 
-void NiVisController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVisController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVisController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVisController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVisController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVisController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVisController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVisController::GetRefs() const {
diff --git a/src/obj/NiVisData.cpp b/src/obj/NiVisData.cpp
index 950ccee0..963ce87c 100644
--- a/src/obj/NiVisData.cpp
+++ b/src/obj/NiVisData.cpp
@@ -11,20 +11,20 @@ NiVisData::NiVisData() NI_VIS_DATA_CONSTRUCT {}
 
 NiVisData::~NiVisData() {}
 
-void NiVisData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiVisData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiVisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiVisData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiVisData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiVisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiVisData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiVisData::GetRefs() const {
diff --git a/src/obj/NiWireframeProperty.cpp b/src/obj/NiWireframeProperty.cpp
index c5a03786..33ee8f19 100644
--- a/src/obj/NiWireframeProperty.cpp
+++ b/src/obj/NiWireframeProperty.cpp
@@ -11,20 +11,20 @@ NiWireframeProperty::NiWireframeProperty() NI_WIREFRAME_PROPERTY_CONSTRUCT {}
 
 NiWireframeProperty::~NiWireframeProperty() {}
 
-void NiWireframeProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiWireframeProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiWireframeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiWireframeProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiWireframeProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiWireframeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiWireframeProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiWireframeProperty::GetRefs() const {
diff --git a/src/obj/NiZBufferProperty.cpp b/src/obj/NiZBufferProperty.cpp
index 56297412..ee4fe422 100644
--- a/src/obj/NiZBufferProperty.cpp
+++ b/src/obj/NiZBufferProperty.cpp
@@ -11,20 +11,20 @@ NiZBufferProperty::NiZBufferProperty() NI_Z_BUFFER_PROPERTY_CONSTRUCT {}
 
 NiZBufferProperty::~NiZBufferProperty() {}
 
-void NiZBufferProperty::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void NiZBufferProperty::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void NiZBufferProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void NiZBufferProperty::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string NiZBufferProperty::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void NiZBufferProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void NiZBufferProperty::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> NiZBufferProperty::GetRefs() const {
diff --git a/src/obj/RootCollisionNode.cpp b/src/obj/RootCollisionNode.cpp
index d8e54282..3efffc98 100644
--- a/src/obj/RootCollisionNode.cpp
+++ b/src/obj/RootCollisionNode.cpp
@@ -11,20 +11,20 @@ RootCollisionNode::RootCollisionNode() ROOT_COLLISION_NODE_CONSTRUCT {}
 
 RootCollisionNode::~RootCollisionNode() {}
 
-void RootCollisionNode::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void RootCollisionNode::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void RootCollisionNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void RootCollisionNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string RootCollisionNode::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void RootCollisionNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void RootCollisionNode::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> RootCollisionNode::GetRefs() const {
diff --git a/src/obj/bhkBlendCollisionObject.cpp b/src/obj/bhkBlendCollisionObject.cpp
index efdac89d..b6881e6e 100644
--- a/src/obj/bhkBlendCollisionObject.cpp
+++ b/src/obj/bhkBlendCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkBlendCollisionObject::bhkBlendCollisionObject() BHK_BLEND_COLLISION_OBJECT_CO
 
 bhkBlendCollisionObject::~bhkBlendCollisionObject() {}
 
-void bhkBlendCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBlendCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBlendCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBlendCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBlendCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBlendCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBlendCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBlendCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkBlendController.cpp b/src/obj/bhkBlendController.cpp
index 56ed2414..f224d66a 100644
--- a/src/obj/bhkBlendController.cpp
+++ b/src/obj/bhkBlendController.cpp
@@ -11,20 +11,20 @@ bhkBlendController::bhkBlendController() BHK_BLEND_CONTROLLER_CONSTRUCT {}
 
 bhkBlendController::~bhkBlendController() {}
 
-void bhkBlendController::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBlendController::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBlendController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBlendController::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBlendController::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBlendController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBlendController::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBlendController::GetRefs() const {
diff --git a/src/obj/bhkBoxShape.cpp b/src/obj/bhkBoxShape.cpp
index 5dc8c6bf..ceabc9ad 100644
--- a/src/obj/bhkBoxShape.cpp
+++ b/src/obj/bhkBoxShape.cpp
@@ -11,20 +11,20 @@ bhkBoxShape::bhkBoxShape() BHK_BOX_SHAPE_CONSTRUCT {}
 
 bhkBoxShape::~bhkBoxShape() {}
 
-void bhkBoxShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkBoxShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkBoxShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkBoxShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkBoxShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkBoxShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkBoxShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkBoxShape::GetRefs() const {
diff --git a/src/obj/bhkCapsuleShape.cpp b/src/obj/bhkCapsuleShape.cpp
index 7d01c6c5..5fc48018 100644
--- a/src/obj/bhkCapsuleShape.cpp
+++ b/src/obj/bhkCapsuleShape.cpp
@@ -11,20 +11,20 @@ bhkCapsuleShape::bhkCapsuleShape() BHK_CAPSULE_SHAPE_CONSTRUCT {}
 
 bhkCapsuleShape::~bhkCapsuleShape() {}
 
-void bhkCapsuleShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkCapsuleShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkCapsuleShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkCapsuleShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkCapsuleShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkCapsuleShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkCapsuleShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkCapsuleShape::GetRefs() const {
diff --git a/src/obj/bhkCollisionObject.cpp b/src/obj/bhkCollisionObject.cpp
index dfce63d3..47808747 100644
--- a/src/obj/bhkCollisionObject.cpp
+++ b/src/obj/bhkCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkCollisionObject::bhkCollisionObject() BHK_COLLISION_OBJECT_CONSTRUCT {}
 
 bhkCollisionObject::~bhkCollisionObject() {}
 
-void bhkCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkConvexShape.cpp b/src/obj/bhkConvexShape.cpp
index 9630c36b..bfd811a1 100644
--- a/src/obj/bhkConvexShape.cpp
+++ b/src/obj/bhkConvexShape.cpp
@@ -11,20 +11,20 @@ bhkConvexShape::bhkConvexShape() BHK_CONVEX_SHAPE_CONSTRUCT {}
 
 bhkConvexShape::~bhkConvexShape() {}
 
-void bhkConvexShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexShape::GetRefs() const {
diff --git a/src/obj/bhkConvexTransformShape.cpp b/src/obj/bhkConvexTransformShape.cpp
index 4eedc742..9581d2c8 100644
--- a/src/obj/bhkConvexTransformShape.cpp
+++ b/src/obj/bhkConvexTransformShape.cpp
@@ -11,20 +11,20 @@ bhkConvexTransformShape::bhkConvexTransformShape() BHK_CONVEX_TRANSFORM_SHAPE_CO
 
 bhkConvexTransformShape::~bhkConvexTransformShape() {}
 
-void bhkConvexTransformShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexTransformShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexTransformShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexTransformShape::GetRefs() const {
diff --git a/src/obj/bhkConvexVerticesShape.cpp b/src/obj/bhkConvexVerticesShape.cpp
index 21f20448..25f84aa0 100644
--- a/src/obj/bhkConvexVerticesShape.cpp
+++ b/src/obj/bhkConvexVerticesShape.cpp
@@ -11,20 +11,20 @@ bhkConvexVerticesShape::bhkConvexVerticesShape() BHK_CONVEX_VERTICES_SHAPE_CONST
 
 bhkConvexVerticesShape::~bhkConvexVerticesShape() {}
 
-void bhkConvexVerticesShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkConvexVerticesShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkConvexVerticesShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkConvexVerticesShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkConvexVerticesShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkConvexVerticesShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkConvexVerticesShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkConvexVerticesShape::GetRefs() const {
diff --git a/src/obj/bhkEntity.cpp b/src/obj/bhkEntity.cpp
index a09a3998..39dfe3d0 100644
--- a/src/obj/bhkEntity.cpp
+++ b/src/obj/bhkEntity.cpp
@@ -12,20 +12,20 @@ bhkEntity::bhkEntity() BHK_ENTITY_CONSTRUCT {}
 
 bhkEntity::~bhkEntity() {}
 
-void bhkEntity::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkEntity::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkEntity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkEntity::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkEntity::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkEntity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkEntity::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkEntity::GetRefs() const {
diff --git a/src/obj/bhkHingeConstraint.cpp b/src/obj/bhkHingeConstraint.cpp
index e3eb5655..b0ed22c8 100644
--- a/src/obj/bhkHingeConstraint.cpp
+++ b/src/obj/bhkHingeConstraint.cpp
@@ -11,20 +11,20 @@ bhkHingeConstraint::bhkHingeConstraint() BHK_HINGE_CONSTRAINT_CONSTRUCT {}
 
 bhkHingeConstraint::~bhkHingeConstraint() {}
 
-void bhkHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkHingeConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkHingeConstraint::GetRefs() const {
diff --git a/src/obj/bhkLimitedHingeConstraint.cpp b/src/obj/bhkLimitedHingeConstraint.cpp
index 3686e1da..94d40ad7 100644
--- a/src/obj/bhkLimitedHingeConstraint.cpp
+++ b/src/obj/bhkLimitedHingeConstraint.cpp
@@ -12,20 +12,20 @@ bhkLimitedHingeConstraint::bhkLimitedHingeConstraint() BHK_LIMITED_HINGE_CONSTRA
 
 bhkLimitedHingeConstraint::~bhkLimitedHingeConstraint() {}
 
-void bhkLimitedHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkLimitedHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkLimitedHingeConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkLimitedHingeConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkLimitedHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkLimitedHingeConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkLimitedHingeConstraint::GetRefs() const {
diff --git a/src/obj/bhkListShape.cpp b/src/obj/bhkListShape.cpp
index bab6afbd..45844e8c 100644
--- a/src/obj/bhkListShape.cpp
+++ b/src/obj/bhkListShape.cpp
@@ -12,20 +12,20 @@ bhkListShape::bhkListShape() BHK_LIST_SHAPE_CONSTRUCT {}
 
 bhkListShape::~bhkListShape() {}
 
-void bhkListShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkListShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkListShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkListShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkListShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkListShape::GetRefs() const {
diff --git a/src/obj/bhkMalleableConstraint.cpp b/src/obj/bhkMalleableConstraint.cpp
index 28baa7c5..9b644671 100644
--- a/src/obj/bhkMalleableConstraint.cpp
+++ b/src/obj/bhkMalleableConstraint.cpp
@@ -14,20 +14,20 @@ bhkMalleableConstraint::bhkMalleableConstraint() BHK_MALLEABLE_CONSTRAINT_CONSTR
 
 bhkMalleableConstraint::~bhkMalleableConstraint() {}
 
-void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMalleableConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMalleableConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMalleableConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMalleableConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMalleableConstraint::GetRefs() const {
diff --git a/src/obj/bhkMoppBvTreeShape.cpp b/src/obj/bhkMoppBvTreeShape.cpp
index 39fc1f3d..ae8ee96b 100644
--- a/src/obj/bhkMoppBvTreeShape.cpp
+++ b/src/obj/bhkMoppBvTreeShape.cpp
@@ -12,20 +12,20 @@ bhkMoppBvTreeShape::bhkMoppBvTreeShape() BHK_MOPP_BV_TREE_SHAPE_CONSTRUCT {}
 
 bhkMoppBvTreeShape::~bhkMoppBvTreeShape() {}
 
-void bhkMoppBvTreeShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMoppBvTreeShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMoppBvTreeShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMoppBvTreeShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMoppBvTreeShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMoppBvTreeShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMoppBvTreeShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMoppBvTreeShape::GetRefs() const {
diff --git a/src/obj/bhkMultiSphereShape.cpp b/src/obj/bhkMultiSphereShape.cpp
index 13c06fef..4e6492e4 100644
--- a/src/obj/bhkMultiSphereShape.cpp
+++ b/src/obj/bhkMultiSphereShape.cpp
@@ -12,20 +12,20 @@ bhkMultiSphereShape::bhkMultiSphereShape() BHK_MULTI_SPHERE_SHAPE_CONSTRUCT {}
 
 bhkMultiSphereShape::~bhkMultiSphereShape() {}
 
-void bhkMultiSphereShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkMultiSphereShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkMultiSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkMultiSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkMultiSphereShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkMultiSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkMultiSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkMultiSphereShape::GetRefs() const {
diff --git a/src/obj/bhkNiTriStripsShape.cpp b/src/obj/bhkNiTriStripsShape.cpp
index c0187b0a..92f80df9 100644
--- a/src/obj/bhkNiTriStripsShape.cpp
+++ b/src/obj/bhkNiTriStripsShape.cpp
@@ -12,20 +12,20 @@ bhkNiTriStripsShape::bhkNiTriStripsShape() BHK_NI_TRI_STRIPS_SHAPE_CONSTRUCT {}
 
 bhkNiTriStripsShape::~bhkNiTriStripsShape() {}
 
-void bhkNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkNiTriStripsShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkNiTriStripsShape::GetRefs() const {
diff --git a/src/obj/bhkPackedNiTriStripsShape.cpp b/src/obj/bhkPackedNiTriStripsShape.cpp
index e1640c99..e1b01672 100644
--- a/src/obj/bhkPackedNiTriStripsShape.cpp
+++ b/src/obj/bhkPackedNiTriStripsShape.cpp
@@ -12,20 +12,20 @@ bhkPackedNiTriStripsShape::bhkPackedNiTriStripsShape() BHK_PACKED_NI_TRI_STRIPS_
 
 bhkPackedNiTriStripsShape::~bhkPackedNiTriStripsShape() {}
 
-void bhkPackedNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkPackedNiTriStripsShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkPackedNiTriStripsShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkPackedNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkPackedNiTriStripsShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkPackedNiTriStripsShape::GetRefs() const {
diff --git a/src/obj/bhkPrismaticConstraint.cpp b/src/obj/bhkPrismaticConstraint.cpp
index dfedecb7..871b9195 100644
--- a/src/obj/bhkPrismaticConstraint.cpp
+++ b/src/obj/bhkPrismaticConstraint.cpp
@@ -11,20 +11,20 @@ bhkPrismaticConstraint::bhkPrismaticConstraint() BHK_PRISMATIC_CONSTRAINT_CONSTR
 
 bhkPrismaticConstraint::~bhkPrismaticConstraint() {}
 
-void bhkPrismaticConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkPrismaticConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkPrismaticConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkPrismaticConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkPrismaticConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkPrismaticConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkPrismaticConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkPrismaticConstraint::GetRefs() const {
diff --git a/src/obj/bhkRagdollConstraint.cpp b/src/obj/bhkRagdollConstraint.cpp
index bebcc13d..e0122151 100644
--- a/src/obj/bhkRagdollConstraint.cpp
+++ b/src/obj/bhkRagdollConstraint.cpp
@@ -11,20 +11,20 @@ bhkRagdollConstraint::bhkRagdollConstraint() BHK_RAGDOLL_CONSTRAINT_CONSTRUCT {}
 
 bhkRagdollConstraint::~bhkRagdollConstraint() {}
 
-void bhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRagdollConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRagdollConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRagdollConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRagdollConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRagdollConstraint::GetRefs() const {
diff --git a/src/obj/bhkRefObject.cpp b/src/obj/bhkRefObject.cpp
index 9035e64e..7e6ca99a 100644
--- a/src/obj/bhkRefObject.cpp
+++ b/src/obj/bhkRefObject.cpp
@@ -11,20 +11,20 @@ bhkRefObject::bhkRefObject() BHK_REF_OBJECT_CONSTRUCT {}
 
 bhkRefObject::~bhkRefObject() {}
 
-void bhkRefObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRefObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRefObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRefObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRefObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRefObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRefObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRefObject::GetRefs() const {
diff --git a/src/obj/bhkRigidBody.cpp b/src/obj/bhkRigidBody.cpp
index 1df0cc2a..bd783078 100644
--- a/src/obj/bhkRigidBody.cpp
+++ b/src/obj/bhkRigidBody.cpp
@@ -13,20 +13,20 @@ bhkRigidBody::bhkRigidBody() BHK_RIGID_BODY_CONSTRUCT {}
 
 bhkRigidBody::~bhkRigidBody() {}
 
-void bhkRigidBody::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRigidBody::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRigidBody::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRigidBody::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRigidBody::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRigidBody::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRigidBody::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRigidBody::GetRefs() const {
diff --git a/src/obj/bhkRigidBodyT.cpp b/src/obj/bhkRigidBodyT.cpp
index 0f7d102b..4d0d2b4e 100644
--- a/src/obj/bhkRigidBodyT.cpp
+++ b/src/obj/bhkRigidBodyT.cpp
@@ -11,20 +11,20 @@ bhkRigidBodyT::bhkRigidBodyT() BHK_RIGID_BODY_T_CONSTRUCT {}
 
 bhkRigidBodyT::~bhkRigidBodyT() {}
 
-void bhkRigidBodyT::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkRigidBodyT::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkRigidBodyT::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkRigidBodyT::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkRigidBodyT::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkRigidBodyT::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkRigidBodyT::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkRigidBodyT::GetRefs() const {
diff --git a/src/obj/bhkSPCollisionObject.cpp b/src/obj/bhkSPCollisionObject.cpp
index 8cb00948..6f1135c7 100644
--- a/src/obj/bhkSPCollisionObject.cpp
+++ b/src/obj/bhkSPCollisionObject.cpp
@@ -11,20 +11,20 @@ bhkSPCollisionObject::bhkSPCollisionObject() BHK_S_P_COLLISION_OBJECT_CONSTRUCT
 
 bhkSPCollisionObject::~bhkSPCollisionObject() {}
 
-void bhkSPCollisionObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSPCollisionObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSPCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSPCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSPCollisionObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSPCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSPCollisionObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSPCollisionObject::GetRefs() const {
diff --git a/src/obj/bhkSerializable.cpp b/src/obj/bhkSerializable.cpp
index fdbd73f4..3b237d16 100644
--- a/src/obj/bhkSerializable.cpp
+++ b/src/obj/bhkSerializable.cpp
@@ -11,20 +11,20 @@ bhkSerializable::bhkSerializable() BHK_SERIALIZABLE_CONSTRUCT {}
 
 bhkSerializable::~bhkSerializable() {}
 
-void bhkSerializable::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSerializable::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSerializable::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSerializable::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSerializable::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSerializable::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSerializable::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSerializable::GetRefs() const {
diff --git a/src/obj/bhkShape.cpp b/src/obj/bhkShape.cpp
index d19a2436..fe837574 100644
--- a/src/obj/bhkShape.cpp
+++ b/src/obj/bhkShape.cpp
@@ -11,20 +11,20 @@ bhkShape::bhkShape() BHK_SHAPE_CONSTRUCT {}
 
 bhkShape::~bhkShape() {}
 
-void bhkShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkShape::GetRefs() const {
diff --git a/src/obj/bhkSimpleShapePhantom.cpp b/src/obj/bhkSimpleShapePhantom.cpp
index 7fba8498..f14831d7 100644
--- a/src/obj/bhkSimpleShapePhantom.cpp
+++ b/src/obj/bhkSimpleShapePhantom.cpp
@@ -11,20 +11,20 @@ bhkSimpleShapePhantom::bhkSimpleShapePhantom() BHK_SIMPLE_SHAPE_PHANTOM_CONSTRUC
 
 bhkSimpleShapePhantom::~bhkSimpleShapePhantom() {}
 
-void bhkSimpleShapePhantom::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSimpleShapePhantom::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSimpleShapePhantom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSimpleShapePhantom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSimpleShapePhantom::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSimpleShapePhantom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSimpleShapePhantom::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSimpleShapePhantom::GetRefs() const {
diff --git a/src/obj/bhkSphereRepShape.cpp b/src/obj/bhkSphereRepShape.cpp
index 7c8370e8..28fc5066 100644
--- a/src/obj/bhkSphereRepShape.cpp
+++ b/src/obj/bhkSphereRepShape.cpp
@@ -11,20 +11,20 @@ bhkSphereRepShape::bhkSphereRepShape() BHK_SPHERE_REP_SHAPE_CONSTRUCT {}
 
 bhkSphereRepShape::~bhkSphereRepShape() {}
 
-void bhkSphereRepShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSphereRepShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSphereRepShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSphereRepShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSphereRepShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSphereRepShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSphereRepShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSphereRepShape::GetRefs() const {
diff --git a/src/obj/bhkSphereShape.cpp b/src/obj/bhkSphereShape.cpp
index fda79ecf..e0404f5c 100644
--- a/src/obj/bhkSphereShape.cpp
+++ b/src/obj/bhkSphereShape.cpp
@@ -11,20 +11,20 @@ bhkSphereShape::bhkSphereShape() BHK_SPHERE_SHAPE_CONSTRUCT {}
 
 bhkSphereShape::~bhkSphereShape() {}
 
-void bhkSphereShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkSphereShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkSphereShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkSphereShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkSphereShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkSphereShape::GetRefs() const {
diff --git a/src/obj/bhkStiffSpringConstraint.cpp b/src/obj/bhkStiffSpringConstraint.cpp
index 14c92413..8dbe1330 100644
--- a/src/obj/bhkStiffSpringConstraint.cpp
+++ b/src/obj/bhkStiffSpringConstraint.cpp
@@ -11,20 +11,20 @@ bhkStiffSpringConstraint::bhkStiffSpringConstraint() BHK_STIFF_SPRING_CONSTRAINT
 
 bhkStiffSpringConstraint::~bhkStiffSpringConstraint() {}
 
-void bhkStiffSpringConstraint::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkStiffSpringConstraint::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkStiffSpringConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkStiffSpringConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkStiffSpringConstraint::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkStiffSpringConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkStiffSpringConstraint::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkStiffSpringConstraint::GetRefs() const {
diff --git a/src/obj/bhkTransformShape.cpp b/src/obj/bhkTransformShape.cpp
index 366fd93a..324dc4fa 100644
--- a/src/obj/bhkTransformShape.cpp
+++ b/src/obj/bhkTransformShape.cpp
@@ -11,20 +11,20 @@ bhkTransformShape::bhkTransformShape() BHK_TRANSFORM_SHAPE_CONSTRUCT {}
 
 bhkTransformShape::~bhkTransformShape() {}
 
-void bhkTransformShape::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkTransformShape::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkTransformShape::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkTransformShape::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkTransformShape::GetRefs() const {
diff --git a/src/obj/bhkWorldObject.cpp b/src/obj/bhkWorldObject.cpp
index 4acc8d51..199a1178 100644
--- a/src/obj/bhkWorldObject.cpp
+++ b/src/obj/bhkWorldObject.cpp
@@ -11,20 +11,20 @@ bhkWorldObject::bhkWorldObject() BHK_WORLD_OBJECT_CONSTRUCT {}
 
 bhkWorldObject::~bhkWorldObject() {}
 
-void bhkWorldObject::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void bhkWorldObject::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void bhkWorldObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void bhkWorldObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string bhkWorldObject::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void bhkWorldObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void bhkWorldObject::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> bhkWorldObject::GetRefs() const {
diff --git a/src/obj/hkPackedNiTriStripsData.cpp b/src/obj/hkPackedNiTriStripsData.cpp
index 2fec4142..f20ae0fb 100644
--- a/src/obj/hkPackedNiTriStripsData.cpp
+++ b/src/obj/hkPackedNiTriStripsData.cpp
@@ -12,20 +12,20 @@ hkPackedNiTriStripsData::hkPackedNiTriStripsData() HK_PACKED_NI_TRI_STRIPS_DATA_
 
 hkPackedNiTriStripsData::~hkPackedNiTriStripsData() {}
 
-void hkPackedNiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );
+void hkPackedNiTriStripsData::Read( istream& in, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalRead( in, link_stack, info );
 }
 
-void hkPackedNiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, unsigned int version, unsigned int user_version ) const {
-	InternalWrite( out, link_map, version, user_version );
+void hkPackedNiTriStripsData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map, const NifInfo & info ) const {
+	InternalWrite( out, link_map, info );
 }
 
 string hkPackedNiTriStripsData::asString( bool verbose ) const {
 	return InternalAsString( verbose );
 }
 
-void hkPackedNiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalFixLinks( objects, link_stack, version, user_version );
+void hkPackedNiTriStripsData::FixLinks( const map<unsigned int,NiObjectRef> & objects, list<unsigned int> & link_stack, const NifInfo & info ) {
+	InternalFixLinks( objects, link_stack, info );
 }
 
 list<NiObjectRef> hkPackedNiTriStripsData::GetRefs() const {
-- 
GitLab