diff --git a/NIF_Blocks.cpp b/NIF_Blocks.cpp
index 74029b508b9667b7caa02f987d7fc1d93e930d1d..b91e2c3f7fdfac87367893cacd14290ae1d79456 100644
--- a/NIF_Blocks.cpp
+++ b/NIF_Blocks.cpp
@@ -3337,6 +3337,83 @@ string AKeyframeData::asString() const {
 	return out.str();
 }
 
+/***********************************************************
+ * NiPSysEmitterCtlrData methods
+ **********************************************************/
+
+void NiPSysEmitterCtlrData::Read( istream& file, unsigned int version ) {
+
+	//--Float Keys--//
+	uint numKeys = ReadUInt( file );
+
+	if (numKeys > 0) {
+		NifStream( f_key_type, file );
+		float_keys.resize( numKeys );
+		for ( uint i = 0; i < float_keys.size(); ++i ) {
+			NifStream( float_keys[i], file, f_key_type );
+		}
+	}
+
+	//--Byte Keys--//
+	numKeys = ReadUInt( file );
+
+	byte_keys.resize( numKeys );
+	for ( uint i = 0; i < byte_keys.size(); ++i ) {
+		NifStream( byte_keys[i], file, LINEAR_KEY );
+	}	
+}
+
+void NiPSysEmitterCtlrData::Write( ostream& file, unsigned int version ) const {
+
+	//--Float Keys--//
+	WriteUInt( uint(float_keys.size()), file );
+
+	if (float_keys.size() > 0) {
+		NifStream( f_key_type, file );
+		for ( uint i = 0; i < float_keys.size(); ++i ) {
+			NifStream( float_keys[i], file, f_key_type );
+		}	
+	}
+
+	//--Byte Keys--//
+	WriteUInt( uint(byte_keys.size()), file );
+
+	for ( uint i = 0; i < byte_keys.size(); ++i ) {
+		NifStream( byte_keys[i], file, LINEAR_KEY );
+	}	
+}
+
+string NiPSysEmitterCtlrData::asString() const {
+	stringstream out;
+	out.setf(ios::fixed, ios::floatfield);
+	out << setprecision(1);
+
+	out << "Float Key Count:  " << uint(float_keys.size()) << endl
+		<< "Float Key Type:  " << f_key_type << endl;
+
+	if (verbose) {
+		vector< Key<float> >::const_iterator it;
+		for ( it = float_keys.begin(); it != float_keys.end(); ++it ) {
+			out << "Key Time:  " <<  it->time << "  Float Value:  " << it->data << endl;
+		}
+	} else {
+		out << "<<Data Not Shown>>" << endl;
+	}
+
+	out << "Byte Key Count:  " << uint(byte_keys.size()) << endl;
+
+	if (verbose) {
+		vector< Key<byte> >::const_iterator it;
+		for ( it = byte_keys.begin(); it != byte_keys.end(); ++it ) {
+			out << "Key Time:  " <<  it->time << "  Float Value:  " << it->data << endl;
+		}
+	} else {
+		out << "<<Data Not Shown>>" << endl;
+	}
+
+	return out.str();
+}
+
 /***********************************************************
  * NiBoolData methods
  **********************************************************/
diff --git a/NIF_Blocks.h b/NIF_Blocks.h
index 6368624a9d7215c2845462d9b2aada31a93d2ef6..ce5dd561adb03b1a5c154e26ac83c5f1ec32134b 100644
--- a/NIF_Blocks.h
+++ b/NIF_Blocks.h
@@ -727,27 +727,6 @@ private:
 	uint unkInt2;
 };
 
-/**
- * NiPSysEmitterCtlrData
- */
-class NiPSysEmitterCtlrData : public AData {
-public:
-	NiPSysEmitterCtlrData() {
-		AddAttr( attr_int, "Unknown Int 1" );
-		AddAttr( attr_int, "Unknown Int 2" );
-		AddAttr( attr_int, "Unknown Int 3" );
-		AddAttr( attr_float, "Unknown Float 1" );
-		AddAttr( attr_int, "Unknown Int 4" );
-		AddAttr( attr_int, "Unknown Int 5" );
-		AddAttr( attr_byte, "Unknown Byte 1" );
-		AddAttr( attr_float, "Unknown Float 2" );
-		AddAttr( attr_byte, "Unknown Byte 2" );
-	}
-	~NiPSysEmitterCtlrData() {}
-
-	string GetBlockType() const { return "NiPSysEmitterCtlrData"; }
-};
-
 /**
  * NiMaterialProperty - material properties
  */
@@ -1750,6 +1729,24 @@ public:
 	string GetBlockType() const { return "NiPSysSphereEmitter"; }
 }; 
 
+/**
+ * NiPSysEmitterCtlrData
+ */
+class NiPSysEmitterCtlrData : public AData {
+public:
+	NiPSysEmitterCtlrData() {}
+	~NiPSysEmitterCtlrData() {}
+
+	string GetBlockType() const { return "NiPSysEmitterCtlrData"; }
+	void Read( istream& in, unsigned int version );
+	void Write( ostream& out, unsigned int version ) const;
+	string asString() const;
+private:
+	KeyType f_key_type;
+	vector< Key<float> > float_keys;
+	vector< Key<byte> > byte_keys;
+};
+
 /**
  * AKeyframeData -
  */
@@ -2281,6 +2278,79 @@ public:
 	
 };
 
+class NiBinaryExtraData : public AExtraData {
+public:
+	NiBinaryExtraData() {}
+	~NiBinaryExtraData() {}
+	string GetBlockType() const { return "NiBinaryExtraData"; };
+
+	void Read( istream& in, unsigned int version ) {
+		AExtraData::Read( in, version );
+		
+		uint numBytes = ReadUInt( in );
+		binData.resize( numBytes );
+		NifStream( binData, in );
+
+	}
+	void Write( ostream& out, unsigned int version ) const {
+		AExtraData::Write( out, version );
+		
+		WriteUInt( uint(binData.size()), out );
+		NifStream( binData, out );
+	}
+
+	string asString() const {
+		stringstream out;
+		out.setf(ios::fixed, ios::floatfield);
+		out << setprecision(1);
+
+		out << AExtraData::asString()
+			<< "Binary Data (" << uint(binData.size()) << " bytes):" << endl;
+
+		for ( uint i = 0; i < binData.size(); ++i ) {
+			out << "   " << i << ":  " << binData[i] << endl;
+		}
+
+		return out.str();
+	}
+private:
+	vector<byte> binData;
+	
+};
+
+class NiVectorExtraData : public AExtraData {
+public:
+	NiVectorExtraData() {
+		AddAttr( attr_vector3, "Vector Data" );
+		AddAttr( attr_float, "Unknown Float" );
+	}
+	~NiVectorExtraData() {}
+	string GetBlockType() const { return "NiVectorExtraData"; };
+
+	void Read( istream& in, unsigned int version ) {
+		AExtraData::Read( in, version );
+		GetAttr("Vector Data")->Read( in, version );
+		GetAttr("Unknown Float")->Read( in, version );
+	}
+	void Write( ostream& out, unsigned int version ) const {
+		GetAttr("Vector Data")->Write( out, version );
+		GetAttr("Unknown Float")->Write( out, version );
+	}
+
+	string asString() const {
+		stringstream out;
+		out.setf(ios::fixed, ios::floatfield);
+		out << setprecision(1);
+
+		out << AExtraData::asString()
+			<< "Vector Data:  " << GetAttr("Vector Data")->asString() << endl
+			<< "Unknown Float:  " << GetAttr("Unknown Float")->asString() << endl;
+
+		return out.str();
+	}
+	
+};
+
 class NiColorExtraData : public AExtraData {
 public:
 	NiColorExtraData() {}
diff --git a/docsys_extract.cpp b/docsys_extract.cpp
index 686466457b8af3726f473040ea945f065680e96c..7016ff0b842df98fdeedefdf6965a484fa421d46 100644
--- a/docsys_extract.cpp
+++ b/docsys_extract.cpp
@@ -863,6 +863,10 @@ IBlock * CreateNiBillboardNode() {
 	return new NiBillboardNode;
 }
 
+IBlock * CreateNiBinaryExtraData() {
+	return new NiBinaryExtraData;
+}
+
 IBlock * CreateNiBoneLODController() {
 	return new NiBoneLODController;
 }
@@ -1315,6 +1319,10 @@ IBlock * CreateNiUVData() {
 	return new NiUVData;
 }
 
+IBlock * CreateNiVectorExtraData() {
+	return new NiVectorExtraData;
+}
+
 IBlock * CreateNiVertexColorProperty() {
 	return new NiVertexColorProperty;
 }
@@ -1355,6 +1363,7 @@ void RegisterBlockFactories () {
 	global_block_map["NiAutoNormalParticles"] = CreateNiAutoNormalParticles;
 	global_block_map["NiAutoNormalParticlesData"] = CreateNiAutoNormalParticlesData;
 	global_block_map["NiBillboardNode"] = CreateNiBillboardNode;
+	global_block_map["NiBinaryExtraData"] = CreateNiBinaryExtraData;
 	global_block_map["NiBoneLODController"] = CreateNiBoneLODController;
 	global_block_map["NiBoolData"] = CreateNiBoolData;
 	global_block_map["NiBooleanExtraData"] = CreateNiBooleanExtraData;
@@ -1468,6 +1477,7 @@ void RegisterBlockFactories () {
 	global_block_map["NiTriStripsData"] = CreateNiTriStripsData;
 	global_block_map["NiUVController"] = CreateNiUVController;
 	global_block_map["NiUVData"] = CreateNiUVData;
+	global_block_map["NiVectorExtraData"] = CreateNiVectorExtraData;
 	global_block_map["NiVertexColorProperty"] = CreateNiVertexColorProperty;
 	global_block_map["NiVertWeightsExtraData"] = CreateNiVertWeightsExtraData;
 	global_block_map["NiVisController"] = CreateNiVisController;