diff --git a/gen/obj_defines.h b/gen/obj_defines.h
index 9ab7c25237ed742996789d6981f2edd94f3ce933..3cd44b8dacefb9da0272f88d1e9d68d990c92e06 100644
--- a/gen/obj_defines.h
+++ b/gen/obj_defines.h
@@ -442,13 +442,15 @@ return InternalGetRefs(); \
 #define NI_B_SPLINE_INTERPOLATOR_MEMBERS \
 float startTime; \
 float stopTime; \
+Ref<NiBSplineData > splineData; \
+Ref<NiBSplineBasisData > basisData; \
 
 #define NI_B_SPLINE_INTERPOLATOR_INCLUDE "NiInterpolator.h" \
 
 #define NI_B_SPLINE_INTERPOLATOR_PARENT NiInterpolator \
 
 #define NI_B_SPLINE_INTERPOLATOR_CONSTRUCT \
- : startTime(0.0f), stopTime(0.0f) \
+ : startTime(0.0f), stopTime(0.0f), splineData(NULL), basisData(NULL) \
 
 #define NI_B_SPLINE_INTERPOLATOR_READ \
 InternalRead( in, link_stack, version, user_version ); \
@@ -2143,7 +2145,7 @@ InternalFixLinks( objects, link_stack, version, user_version ); \
 return InternalGetRefs(); \
 
 #define NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_MEMBERS \
-array<float,6> unknownFloats; \
+array<float,4> unknownFloats; \
 
 #define NI_B_SPLINE_COMP_FLOAT_INTERPOLATOR_INCLUDE "NiBSplineInterpolator.h" \
 
@@ -2167,8 +2169,6 @@ InternalFixLinks( objects, link_stack, version, user_version ); \
 return InternalGetRefs(); \
 
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_MEMBERS \
-Ref<NiBSplineData > data; \
-Ref<NiObject > unknownLink; \
 array<float,6> unknownFloats; \
 
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_INCLUDE "NiBSplineInterpolator.h" \
@@ -2176,7 +2176,6 @@ array<float,6> unknownFloats; \
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_PARENT NiBSplineInterpolator \
 
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_CONSTRUCT \
- : data(NULL), unknownLink(NULL) \
 
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_READ \
 InternalRead( in, link_stack, version, user_version ); \
@@ -2194,8 +2193,6 @@ InternalFixLinks( objects, link_stack, version, user_version ); \
 return InternalGetRefs(); \
 
 #define NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_MEMBERS \
-Ref<NiBSplineData > data; \
-Ref<NiBSplineBasisData > basisData; \
 Vector3 translation; \
 Quaternion rotation; \
 float scale; \
@@ -2212,7 +2209,7 @@ float scaleMultiplier; \
 #define NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_PARENT NiBSplineInterpolator \
 
 #define NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_CONSTRUCT \
- : data(NULL), basisData(NULL), scale(0.0f), translateBias(0.0f), translateMultiplier(0.0f), rotationBias(0.0f), rotationMultiplier(0.0f), scaleBias(0.0f), scaleMultiplier(0.0f) \
+ : scale(0.0f), translateBias(0.0f), translateMultiplier(0.0f), rotationBias(0.0f), rotationMultiplier(0.0f), scaleBias(0.0f), scaleMultiplier(0.0f) \
 
 #define NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_READ \
 InternalRead( in, link_stack, version, user_version ); \
diff --git a/gen/obj_impl.cpp b/gen/obj_impl.cpp
index 93fc8436f9cdd09eba8e21b97714c13c80298ec4..df56df67b588405314250c4a86ce9523f61fc19f 100644
--- a/gen/obj_impl.cpp
+++ b/gen/obj_impl.cpp
@@ -802,15 +802,28 @@ std::list<NiObjectRef> NiBlendInterpolator::InternalGetRefs() const {
 }
 
 void NiBSplineInterpolator::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+	uint block_num;
 	NiInterpolator::Read( in, link_stack, version, user_version );
 	NifStream( startTime, in, version );
 	NifStream( stopTime, in, version );
+	NifStream( block_num, in, version );
+	link_stack.push_back( block_num );
+	NifStream( block_num, in, version );
+	link_stack.push_back( block_num );
 }
 
 void NiBSplineInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> 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 );
+	if ( splineData != NULL )
+		NifStream( link_map[StaticCast<NiObject>(splineData)], out, version );
+	else
+		NifStream( 0xffffffff, out, version );
+	if ( basisData != NULL )
+		NifStream( link_map[StaticCast<NiObject>(basisData)], out, version );
+	else
+		NifStream( 0xffffffff, out, version );
 }
 
 std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
@@ -818,16 +831,40 @@ std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
 	out << NiInterpolator::asString();
 	out << "  Start Time:  " << startTime << endl;
 	out << "  Stop Time:  " << stopTime << endl;
+	out << "  Spline Data:  " << splineData << endl;
+	out << "  Basis Data:  " << basisData << endl;
 	return out.str();
 }
 
 void NiBSplineInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiInterpolator::FixLinks( objects, link_stack, version, user_version );
+	if (link_stack.empty())
+		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
+	if (link_stack.front() != 0xffffffff) {
+		splineData = DynamicCast<NiBSplineData>(objects[link_stack.front()]);
+		if ( splineData == NULL )
+			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
+	} else
+		splineData = NULL;
+	link_stack.pop_front();
+	if (link_stack.empty())
+		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
+	if (link_stack.front() != 0xffffffff) {
+		basisData = DynamicCast<NiBSplineBasisData>(objects[link_stack.front()]);
+		if ( basisData == NULL )
+			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
+	} else
+		basisData = NULL;
+	link_stack.pop_front();
 }
 
 std::list<NiObjectRef> NiBSplineInterpolator::InternalGetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiInterpolator::GetRefs();
+	if ( splineData != NULL )
+		refs.push_back(StaticCast<NiObject>(splineData));
+	if ( basisData != NULL )
+		refs.push_back(StaticCast<NiObject>(basisData));
 	return refs;
 }
 
@@ -4436,14 +4473,14 @@ std::list<NiObjectRef> NiBSplineBasisData::InternalGetRefs() const {
 
 void NiBSplineCompFloatInterpolator::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
-	for (uint i1 = 0; i1 < 6; i1++) {
+	for (uint i1 = 0; i1 < 4; i1++) {
 		NifStream( unknownFloats[i1], in, version );
 	};
 }
 
 void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
 	NiBSplineInterpolator::Write( out, link_map, version, user_version );
-	for (uint i1 = 0; i1 < 6; i1++) {
+	for (uint i1 = 0; i1 < 4; i1++) {
 		NifStream( unknownFloats[i1], out, version );
 	};
 }
@@ -4451,7 +4488,7 @@ void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, map<NiObjectRe
 std::string NiBSplineCompFloatInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
 	out << NiBSplineInterpolator::asString();
-	for (uint i1 = 0; i1 < 6; i1++) {
+	for (uint i1 = 0; i1 < 4; i1++) {
 		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
@@ -4472,12 +4509,7 @@ std::list<NiObjectRef> NiBSplineCompFloatInterpolator::InternalGetRefs() const {
 }
 
 void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
-	uint block_num;
 	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
-	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
-	link_stack.push_back( block_num );
 	for (uint i1 = 0; i1 < 6; i1++) {
 		NifStream( unknownFloats[i1], in, version );
 	};
@@ -4485,14 +4517,6 @@ void NiBSplineCompPoint3Interpolator::InternalRead( istream& in, list<uint> & li
 
 void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
 	NiBSplineInterpolator::Write( out, link_map, version, user_version );
-	if ( data != NULL )
-		NifStream( link_map[StaticCast<NiObject>(data)], out, version );
-	else
-		NifStream( 0xffffffff, out, version );
-	if ( unknownLink != NULL )
-		NifStream( link_map[StaticCast<NiObject>(unknownLink)], out, version );
-	else
-		NifStream( 0xffffffff, out, version );
 	for (uint i1 = 0; i1 < 6; i1++) {
 		NifStream( unknownFloats[i1], out, version );
 	};
@@ -4501,8 +4525,6 @@ void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, map<NiObjectR
 std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
 	out << NiBSplineInterpolator::asString();
-	out << "  Data:  " << data << endl;
-	out << "  Unknown Link:  " << unknownLink << endl;
 	for (uint i1 = 0; i1 < 6; i1++) {
 		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
@@ -4515,43 +4537,16 @@ std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) co
 
 void NiBSplineCompPoint3Interpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiBSplineData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		unknownLink = DynamicCast<NiObject>(objects[link_stack.front()]);
-		if ( unknownLink == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		unknownLink = NULL;
-	link_stack.pop_front();
 }
 
 std::list<NiObjectRef> NiBSplineCompPoint3Interpolator::InternalGetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiBSplineInterpolator::GetRefs();
-	if ( data != NULL )
-		refs.push_back(StaticCast<NiObject>(data));
-	if ( unknownLink != NULL )
-		refs.push_back(StaticCast<NiObject>(unknownLink));
 	return refs;
 }
 
 void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
-	uint block_num;
 	NiBSplineInterpolator::Read( in, link_stack, version, user_version );
-	NifStream( block_num, in, version );
-	link_stack.push_back( block_num );
-	NifStream( block_num, in, version );
-	link_stack.push_back( block_num );
 	NifStream( translation, in, version );
 	NifStream( rotation, in, version );
 	NifStream( scale, in, version );
@@ -4566,14 +4561,6 @@ void NiBSplineCompTransformInterpolator::InternalRead( istream& in, list<uint> &
 
 void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
 	NiBSplineInterpolator::Write( out, link_map, version, user_version );
-	if ( data != NULL )
-		NifStream( link_map[StaticCast<NiObject>(data)], out, version );
-	else
-		NifStream( 0xffffffff, out, version );
-	if ( basisData != NULL )
-		NifStream( link_map[StaticCast<NiObject>(basisData)], out, version );
-	else
-		NifStream( 0xffffffff, out, version );
 	NifStream( translation, out, version );
 	NifStream( rotation, out, version );
 	NifStream( scale, out, version );
@@ -4589,8 +4576,6 @@ void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, map<NiObje
 std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
 	out << NiBSplineInterpolator::asString();
-	out << "  Data:  " << data << endl;
-	out << "  Basis Data:  " << basisData << endl;
 	out << "  Translation:  " << translation << endl;
 	out << "  Rotation:  " << rotation << endl;
 	out << "  Scale:  " << scale << endl;
@@ -4606,33 +4591,11 @@ std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose )
 
 void NiBSplineCompTransformInterpolator::InternalFixLinks( const vector<NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	NiBSplineInterpolator::FixLinks( objects, link_stack, version, user_version );
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		data = DynamicCast<NiBSplineData>(objects[link_stack.front()]);
-		if ( data == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		data = NULL;
-	link_stack.pop_front();
-	if (link_stack.empty())
-		throw runtime_error("Trying to pop a link from empty stack. This is probably a bug.");
-	if (link_stack.front() != 0xffffffff) {
-		basisData = DynamicCast<NiBSplineBasisData>(objects[link_stack.front()]);
-		if ( basisData == NULL )
-			throw runtime_error("Link could not be cast to required type during file read. This NIF file may be invalid or improperly understood.");
-	} else
-		basisData = NULL;
-	link_stack.pop_front();
 }
 
 std::list<NiObjectRef> NiBSplineCompTransformInterpolator::InternalGetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiBSplineInterpolator::GetRefs();
-	if ( data != NULL )
-		refs.push_back(StaticCast<NiObject>(data));
-	if ( basisData != NULL )
-		refs.push_back(StaticCast<NiObject>(basisData));
 	return refs;
 }
 
diff --git a/obj/NiBSplineCompPoint3Interpolator.cpp b/obj/NiBSplineCompPoint3Interpolator.cpp
index 47158d6f9959bd5dea4a20788d182250c31a9481..0e2d2d522c138b07a1972ebebac34e296e5c0a23 100644
--- a/obj/NiBSplineCompPoint3Interpolator.cpp
+++ b/obj/NiBSplineCompPoint3Interpolator.cpp
@@ -2,8 +2,6 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 #include "NiBSplineCompPoint3Interpolator.h"
-#include "NiBSplineData.h"
-#include "NiObject.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
@@ -36,12 +34,3 @@ list<NiObjectRef> NiBSplineCompPoint3Interpolator::GetRefs() const {
 const Type & NiBSplineCompPoint3Interpolator::GetType() const {
 	return TYPE;
 };
-
-Ref<NiBSplineData > NiBSplineCompPoint3Interpolator::GetData() const {
-	return data;
-}
-
-void NiBSplineCompPoint3Interpolator::SetData( Ref<NiBSplineData > value ) {
-	data = value;
-}
-
diff --git a/obj/NiBSplineCompPoint3Interpolator.h b/obj/NiBSplineCompPoint3Interpolator.h
index ef6234efa7d8b3786b15923ceba1983334e6b5b5..12c641789dedc83ece033beb8c4241be831209f0 100644
--- a/obj/NiBSplineCompPoint3Interpolator.h
+++ b/obj/NiBSplineCompPoint3Interpolator.h
@@ -10,10 +10,6 @@ All rights reserved.  Please see niflib.h for licence. */
 #include "../Ref.h"
 namespace Niflib {
 
-// Forward define of referenced blocks
-class NiBSplineData;
-class NiObject;
-
 #include "../gen/obj_defines.h"
 
 class NiBSplineCompPoint3Interpolator;
@@ -39,12 +35,6 @@ public:
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
-	/*!
-	 * Refers to NiBSplineData.
-	 */
-	Ref<NiBSplineData > GetData() const;
-	void SetData( Ref<NiBSplineData > value );
-
 protected:
 	NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_MEMBERS
 	STANDARD_INTERNAL_METHODS
diff --git a/obj/NiBSplineCompTransformInterpolator.cpp b/obj/NiBSplineCompTransformInterpolator.cpp
index 64f8c73f2f4b46123a5a9522b76d73978655e299..ebf906ecb3ffc3c5cb43568b9d0558fd73ce6d37 100644
--- a/obj/NiBSplineCompTransformInterpolator.cpp
+++ b/obj/NiBSplineCompTransformInterpolator.cpp
@@ -2,8 +2,6 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 #include "NiBSplineCompTransformInterpolator.h"
-#include "NiBSplineData.h"
-#include "NiBSplineBasisData.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
@@ -37,19 +35,3 @@ const Type & NiBSplineCompTransformInterpolator::GetType() const {
 	return TYPE;
 };
 
-Ref<NiBSplineData > NiBSplineCompTransformInterpolator::GetData() const {
-	return data;
-}
-
-void NiBSplineCompTransformInterpolator::SetData( Ref<NiBSplineData > value ) {
-	data = value;
-}
-
-Ref<NiBSplineBasisData > NiBSplineCompTransformInterpolator::GetBasisData() const {
-	return basisData;
-}
-
-void NiBSplineCompTransformInterpolator::SetBasisData( Ref<NiBSplineBasisData > value ) {
-	basisData = value;
-}
-
diff --git a/obj/NiBSplineCompTransformInterpolator.h b/obj/NiBSplineCompTransformInterpolator.h
index d662b90c8a9da1c6c5c7a8dcebe7876b51bf09f6..408d81fd02cfe5e1c6feb0236cab792722f620a6 100644
--- a/obj/NiBSplineCompTransformInterpolator.h
+++ b/obj/NiBSplineCompTransformInterpolator.h
@@ -10,10 +10,6 @@ All rights reserved.  Please see niflib.h for licence. */
 #include "../Ref.h"
 namespace Niflib {
 
-// Forward define of referenced blocks
-class NiBSplineData;
-class NiBSplineBasisData;
-
 #include "../gen/obj_defines.h"
 
 class NiBSplineCompTransformInterpolator;
@@ -39,18 +35,6 @@ public:
 	virtual list<NiObjectRef> GetRefs() const;
 	virtual const Type & GetType() const;
 
-	/*!
-	 * Refers to NiBSplineData.
-	 */
-	Ref<NiBSplineData > GetData() const;
-	void SetData( Ref<NiBSplineData > value );
-
-	/*!
-	 * Refers to NiBSPlineBasisData.
-	 */
-	Ref<NiBSplineBasisData > GetBasisData() const;
-	void SetBasisData( Ref<NiBSplineBasisData > value );
-
 protected:
 	NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_MEMBERS
 	STANDARD_INTERNAL_METHODS
diff --git a/obj/NiBSplineInterpolator.cpp b/obj/NiBSplineInterpolator.cpp
index a3a17a06819277dcc9ac6e3dc6dd7c9f09bc791c..ea280a1b6aa58909ad104b39a87a612444f2f359 100644
--- a/obj/NiBSplineInterpolator.cpp
+++ b/obj/NiBSplineInterpolator.cpp
@@ -2,6 +2,8 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 #include "NiBSplineInterpolator.h"
+#include "NiBSplineData.h"
+#include "NiBSplineBasisData.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
@@ -51,3 +53,18 @@ void NiBSplineInterpolator::SetStopTime( float value ) {
 	stopTime = value;
 }
 
+Ref<NiBSplineData > NiBSplineInterpolator::GetSplineData() const {
+	return splineData;
+}
+
+void NiBSplineInterpolator::SetSplineData( Ref<NiBSplineData > value ) {
+	splineData = value;
+}
+
+Ref<NiBSplineBasisData > NiBSplineInterpolator::GetBasisData() const {
+	return basisData;
+}
+
+void NiBSplineInterpolator::SetBasisData( Ref<NiBSplineBasisData > value ) {
+	basisData = value;
+}
\ No newline at end of file
diff --git a/obj/NiBSplineInterpolator.h b/obj/NiBSplineInterpolator.h
index 42b106ee90ba5abb71abbd3c625cc04cf7ef7d6e..c3feaabdfa895619f47cbb83a3ec6666ed63ac7f 100644
--- a/obj/NiBSplineInterpolator.h
+++ b/obj/NiBSplineInterpolator.h
@@ -7,6 +7,9 @@ All rights reserved.  Please see niflib.h for licence. */
 #include "NiInterpolator.h"
 namespace Niflib {
 
+// Forward define of referenced blocks
+class NiBSplineData;
+class NiBSplineBasisData;
 
 #include "../gen/obj_defines.h"
 
@@ -45,6 +48,18 @@ public:
 	float GetStopTime() const;
 	void SetStopTime( float value );
 
+	/*!
+	 * Refers to NiBSplineData.
+	 */
+	Ref<NiBSplineData > GetSplineData() const;
+	void SetSplineData( Ref<NiBSplineData > value );
+
+	/*!
+	 * Refers to NiBSPlineBasisData.
+	 */
+	Ref<NiBSplineBasisData > GetBasisData() const;
+	void SetBasisData( Ref<NiBSplineBasisData > value );
+
 protected:
 	NI_B_SPLINE_INTERPOLATOR_MEMBERS
 	STANDARD_INTERNAL_METHODS