diff --git a/src/nifqhull.cpp b/src/nifqhull.cpp
index cfb8dbc916e432de46b8444eb5d8aeff8cf1c27d..f8c7c3f7fcdf95142d2b61473dc4c8be887c408d 100644
--- a/src/nifqhull.cpp
+++ b/src/nifqhull.cpp
@@ -25,6 +25,7 @@ extern "C"
 #include "../qhull/src/libqhull/poly2.c"
 #include "../qhull/src/libqhull/geom2.c"
 #include "../qhull/src/libqhull/userprintf.c"
+#include "../qhull/src/libqhull/userprintf_rbox.c"
 #include "../qhull/src/libqhull/usermem.c"
 #include "../qhull/src/libqhull/random.c"
 #include "../qhull/src/libqhull/rboxlib.c"
diff --git a/src/obj/NiBSplineData.cpp b/src/obj/NiBSplineData.cpp
index 13708c6e2da8b42236564c9659bef0a4207d046e..21aa5e55ac726d004360ac2a66f0fecf1bf88445 100644
--- a/src/obj/NiBSplineData.cpp
+++ b/src/obj/NiBSplineData.cpp
@@ -147,6 +147,27 @@ vector<float> NiBSplineData::GetFloatControlPoints() const
 	return floatControlPoints;
 }
 
+void NiBSplineData::SetFloatControlPoints( vector<float> value ) 
+{
+	this->floatControlPoints.clear();
+	this->numFloatControlPoints = value.size();
+
+	for(int i = 0; i < value.size(); i++) {
+		this->floatControlPoints.push_back(value[i]);
+	}
+}
+
+
+void NiBSplineData::AppendFloatControlPoints( vector<float> value )
+{
+	this->numFloatControlPoints += value.size();
+
+	for(int i = 0; i < this->floatControlPoints.size(); i++) {
+		this->floatControlPoints.push_back(value[i]);
+	}
+}
+
+
 vector<float> NiBSplineData::GetFloatControlPointRange(int offset, int count) const
 {
 	vector<float> value;
@@ -163,6 +184,25 @@ vector<short > NiBSplineData::GetShortControlPoints() const
 	return shortControlPoints;
 }
 
+void NiBSplineData::SetShortControlPoints( vector<short> value )
+{
+	this->shortControlPoints.clear();
+	this->numShortControlPoints = value.size();
+
+	for(int i = 0; i < value.size(); i++) {
+		this->shortControlPoints.push_back(value);
+	}
+}
+
+void NiBSplineData::AppendShortControlPoints( vector<short> value )
+{
+	this->numShortControlPoints += value.size();
+
+	for(int i = 0; i < value.size(); i++) {
+		this->shortControlPoints.push_back(value[i]);
+	}
+}
+
 vector<short > NiBSplineData::GetShortControlPointRange(int offset, int count) const
 {
    vector<short> value;
diff --git a/src/obj/NiBSplineTransformInterpolator.cpp b/src/obj/NiBSplineTransformInterpolator.cpp
index dcd74704b8ce60301662eb3c5f342f0e6b3df88d..cd81a1dfb07c316cdd9eb1fc4ee0e036fdd635a9 100644
--- a/src/obj/NiBSplineTransformInterpolator.cpp
+++ b/src/obj/NiBSplineTransformInterpolator.cpp
@@ -124,6 +124,14 @@ void NiBSplineTransformInterpolator::SetTranslation( Vector3 value ) {
 	translation = value;
 }
 
+int NiBSplineTransformInterpolator::GetTranslationOffset() {
+	return translationOffset;
+}
+
+void NiBSplineTransformInterpolator::SetTranslationOffset( int value ) {
+	translationOffset = value;
+}
+
 Quaternion NiBSplineTransformInterpolator::GetRotation() const {
 	return rotation;
 }
@@ -132,6 +140,14 @@ void NiBSplineTransformInterpolator::SetRotation( Quaternion value ) {
 	rotation = value;
 }
 
+int NiBSplineTransformInterpolator::GetRotationOffset() {
+	return rotationOffset;
+}
+
+void NiBSplineTransformInterpolator::SetRotationOffset( int value ) {
+	rotationOffset = value;
+}
+
 float NiBSplineTransformInterpolator::GetScale() const {
 	return scale;
 }
@@ -140,6 +156,13 @@ void NiBSplineTransformInterpolator::SetScale( float value ) {
 	scale = value;
 }
 
+int NiBSplineTransformInterpolator::GetScaleOffset() {
+	return scaleOffset;
+}
+
+void Niflib::NiBSplineTransformInterpolator::SetScaleOffset( int value ) {
+	scaleOffset = value;
+}
 
 vector< Quaternion > NiBSplineTransformInterpolator::GetQuatRotateControlData() const
 {