diff --git a/NIF_Blocks.cpp b/NIF_Blocks.cpp
index 77ca145ff6aa81b9416bb37c2f6e002d58483d1b..7dee27bbccf9b99cfc363076f6dbdd1a05e819d4 100644
--- a/NIF_Blocks.cpp
+++ b/NIF_Blocks.cpp
@@ -2124,10 +2124,10 @@ void NiTextKeyExtraData::Read( ifstream& in ) {
 
 	uint keyCount = ReadUInt( in );
 
-	keys.resize(keyCount);
-	for (uint i = 0; i < keys.size(); ++i ) {
-		keys[i].time = ReadFloat( in );
-		keys[i].data = ReadString( in );
+	_keys.resize(keyCount);
+	for (uint i = 0; i < _keys.size(); ++i ) {
+		_keys[i].time = ReadFloat( in );
+		_keys[i].data = ReadString( in );
 	}
 }
 
@@ -2138,11 +2138,11 @@ void NiTextKeyExtraData::Write( ofstream& out ) {
 	GetAttr("Next Extra Data")->Write( out );
 	GetAttr("Unknown Int")->Write( out );
 
-	WriteUInt( uint(keys.size()), out );
+	WriteUInt( uint(_keys.size()), out );
 
-	for (uint i = 0; i < keys.size(); ++i ) {
-		WriteFloat( keys[i].time, out );
-		WriteString( keys[i].data, out );
+	for (uint i = 0; i < _keys.size(); ++i ) {
+		WriteFloat( _keys[i].time, out );
+		WriteString( _keys[i].data, out );
 	}
 }
 
@@ -2153,12 +2153,12 @@ string NiTextKeyExtraData::asString() {
 
 	out << "Next Extra Data:  " <<  GetAttr("Next Extra Data")->asLink() << endl
 		<< "Unknown Int (Key Type?):  " << GetAttr("Unknown Int")->asInt() << endl
-		<< "Key Count:  " << uint(keys.size()) << endl;
+		<< "Key Count:  " << uint(_keys.size()) << endl;
 
 	if (verbose) {
-		for (uint i = 0; i < keys.size(); ++i ) {
-			out << "Key Time:  " << keys[i].time << endl
-				<< "Key Text:  " << keys[i].data << endl;
+		for (uint i = 0; i < _keys.size(); ++i ) {
+			out << "Key Time:  " << _keys[i].time << endl
+				<< "Key Text:  " << _keys[i].data << endl;
 		}
 	} else {
 		out << "<<Data Not Shown>>" << endl;
diff --git a/NIF_Blocks.h b/NIF_Blocks.h
index c2eca2dd3e4de6989e7a678c6e1b6448a16b5930..dd414443e5f3bc8ffcf9aceb64b87de9520e0c99 100644
--- a/NIF_Blocks.h
+++ b/NIF_Blocks.h
@@ -1197,12 +1197,12 @@ class NiRotatingParticlesData : public ABlock{
 
 };
 
-class NiTextKeyExtraData : public AExtraData{
+class NiTextKeyExtraData : public AExtraData, public ITextKeyExtraData {
 
 	public:
 
 		NiTextKeyExtraData(){
-			AddAttr( "int", "Unknown Int" );	
+			AddAttr( "int", "Unknown Int" );
 		}
 		~NiTextKeyExtraData(){}
 
@@ -1211,8 +1211,20 @@ class NiTextKeyExtraData : public AExtraData{
 		string asString();
 		string GetBlockType() { return "NiTextKeyExtraData"; }
 
+		void * QueryInterface( int id ) {
+			if ( id == TextKeyExtraData ) {
+				return (void*)static_cast<ITextKeyExtraData*>(this);;
+			} else {
+				return AExtraData::QueryInterface( id );
+			}
+		}
+
+		//--ITextKeyExtraData Functions--//
+		virtual vector< Key<string> > GetRotateKeys() { return _keys; }
+		virtual void SetRotateKeys( vector< Key<string> > & keys ) { _keys = keys; }
+
 	private:
-		vector< Key<string> > keys;
+		vector< Key<string> > _keys;
 };
 
 class NiUVData : public ABlock{
diff --git a/niflib.cpp b/niflib.cpp
index ea3b27990ed0bdbbaa96fb73b6b67186a2fdabf7..7a96c9c6857b6424ae555516b5894aa266cb9396 100644
--- a/niflib.cpp
+++ b/niflib.cpp
@@ -467,18 +467,22 @@ attr_ref::operator Texture() { return _attr->asTexture(); }
 
 //--Query Functions--//
 
-ITriShapeData * QueryTriShapeData( blk_ref block ) {
+ITriShapeData * QueryTriShapeData( blk_ref & block ) {
 	return (ITriShapeData*)block->QueryInterface( TriShapeData );
 }
 
-ISkinData * QuerySkinData( blk_ref block ) {
+ISkinData * QuerySkinData( blk_ref & block ) {
 	return (ISkinData*)block->QueryInterface( SkinData );
 }
 
-INode * QueryNode( blk_ref block ) {
+INode * QueryNode( blk_ref & block ) {
 	return (INode*)block->QueryInterface( Node );
 }
 
-IKeyframeData * QueryKeyframeData( blk_ref block ) {
+IKeyframeData * QueryKeyframeData( blk_ref & block ) {
 	return (IKeyframeData*)block->QueryInterface( KeyframeData );
 }
+
+ITextKeyExtraData * QueryTextKeyExtraData ( blk_ref & block ) {
+	return (ITextKeyExtraData*)block->QueryInterface( TextKeyExtraData );
+}
diff --git a/niflib.h b/niflib.h
index 168ccbe1b29c59f287312b63096b69b6ef97c84d..cb477d835ec5b6134f3573a92d9b07c2590eb82e 100644
--- a/niflib.h
+++ b/niflib.h
@@ -55,6 +55,7 @@ class IBlock;
 class ITriShapeData;
 class ISkinData;
 class IKeyframeData;
+class ITextKeyExtraData;
 class INode;
 class blk_ref;
 class attr_ref;
@@ -73,6 +74,7 @@ const int TriShapeData = 0;
 const int SkinData = 1;
 const int Node = 2;
 const int KeyframeData = 3;
+const int TextKeyExtraData = 4;
 
 //--Main Functions--//
 
@@ -99,10 +101,11 @@ unsigned int BlocksInMemory();
 
 //--Query Functions--//
 // These are shorthands for using QueryInterface, and required for scripting languages
-ITriShapeData * QueryTriShapeData( blk_ref block );
-ISkinData * QuerySkinData( blk_ref block );
-INode * QueryNode( blk_ref block );
-IKeyframeData * QueryKeyframeData( blk_ref block );
+ITriShapeData * QueryTriShapeData( blk_ref & block );
+ISkinData * QuerySkinData( blk_ref & block );
+INode * QueryNode( blk_ref & block );
+IKeyframeData * QueryKeyframeData( blk_ref & block );
+ITextKeyExtraData * QueryTextKeyExtraData ( blk_ref & block );
 
 //--TypeDefs--//
 
@@ -285,6 +288,14 @@ public:
 	virtual void SetScaleKeys( vector< Key<float> > & keys ) = 0;
 };
 
+class ITextKeyExtraData {
+public:
+	ITextKeyExtraData() {}
+	virtual ~ITextKeyExtraData () {}
+	virtual vector< Key<string> > GetRotateKeys() = 0;
+	virtual void SetRotateKeys( vector< Key<string> > & keys ) = 0;
+};
+
 //--Attribute Reference--//
 class attr_ref {
 public: