diff --git a/Source/Processors/HDF5Recording.cpp b/Source/Processors/HDF5Recording.cpp
index f9b89c5d98af6406e4c49930b5555a35fae75c29..b70570bf2785544a7697cad3ae85b0e29880e05a 100644
--- a/Source/Processors/HDF5Recording.cpp
+++ b/Source/Processors/HDF5Recording.cpp
@@ -149,8 +149,8 @@ void HDF5Recording::writeData(AudioSampleBuffer& buffer, int nSamples)
 void HDF5Recording::writeEvent(int eventType, MidiMessage& event, int samplePosition)
 {
     const uint8* dataptr = event.getRawData();
-    //right now only written events are TTL, so type = 0
-    mainFile->writeEvent(0,*(dataptr+2),*(dataptr+1),*(dataptr+3),timestamp+samplePosition);
+	if (eventType == GenericProcessor::TTL)
+		mainFile->writeEvent(0,*(dataptr+2),*(dataptr+1),*(dataptr+3),timestamp+samplePosition);
 }
 
 void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
diff --git a/Source/Processors/OriginalRecording.cpp b/Source/Processors/OriginalRecording.cpp
index c858c793894aeaef6c337f4fdf5429ba3ba5b93f..7ad5469189f6c2bb4971150c62a2ff702146bc17 100644
--- a/Source/Processors/OriginalRecording.cpp
+++ b/Source/Processors/OriginalRecording.cpp
@@ -25,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "../Audio/AudioComponent.h"
 
 OriginalRecording::OriginalRecording() : separateFiles(true), eventFile(nullptr),
-    recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0)
+	messageFile(nullptr), recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0)
 {
     continuousDataIntegerBuffer = new int16[10000];
     continuousDataFloatBuffer = new float[10000];
@@ -78,6 +78,7 @@ void OriginalRecording::openFiles(File rootFolder, int experimentNumber, int rec
     this->recordingNumber = recordingNumber;
     this->experimentNumber = experimentNumber;
     openFile(rootFolder,nullptr);
+	openMessageFile(rootFolder);
     for (int i = 0; i < fileArray.size(); i++)
     {
         if (getChannel(i)->getRecordState())
@@ -173,6 +174,29 @@ void OriginalRecording::openSpikeFile(File rootFolder, SpikeRecordInfo* elec)
 
 }
 
+void OriginalRecording::openMessageFile(File rootFolder)
+{
+	FILE* mFile;
+	String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString);
+	fullPath += "messages.events";
+
+	std::cout << "OPENING FILE: " << fullPath << std::endl;
+
+    File f = File(fullPath);
+
+    bool fileExists = f.exists();
+
+    diskWriteLock.enter();
+
+    mFile = fopen(fullPath.toUTF8(),"ab");
+
+	//If this file needs a header, it goes here
+
+	diskWriteLock.exit();
+	messageFile = mFile;
+
+}
+
 String OriginalRecording::getFileName(Channel* ch)
 {
     String filename;
@@ -287,6 +311,36 @@ String OriginalRecording::generateSpikeHeader(SpikeRecordInfo* elec)
 }
 
 void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int samplePosition)
+{
+	if (eventType == GenericProcessor::TTL)
+		writeTTLEvent(event,samplePosition);
+	else if (eventType == GenericProcessor::MESSAGE)
+		writeMessage(event,samplePosition);
+}
+
+void OriginalRecording::writeMessage(MidiMessage& event, int samplePosition)
+{
+	if (messageFile == nullptr)
+		return;
+	uint64 samplePos = (uint64) samplePosition;
+
+    int64 eventTimestamp = timestamp + samplePos;
+	
+	int msgLength = event.getRawDataSize() - 4;
+	const char* dataptr = (const char*)event.getRawData() + 4;
+
+	String timestampText(eventTimestamp);
+
+	diskWriteLock.enter();
+	fwrite(timestampText.toUTF8(),1,timestampText.length(),messageFile);
+	fwrite(" ",1,1,messageFile);
+	fwrite(dataptr,1,msgLength,messageFile);
+	fwrite("\n",1,1,messageFile);
+	diskWriteLock.exit();
+
+}
+
+void OriginalRecording::writeTTLEvent(MidiMessage& event, int samplePosition)
 {
     // find file and write samples to disk
     // std::cout << "Received event!" << std::endl;
@@ -296,8 +350,7 @@ void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int sample
 
     const uint8* dataptr = event.getRawData();
 
-
-    uint64 samplePos = (uint64) samplePosition;
+	uint64 samplePos = (uint64) samplePosition;
 
     int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp
 
@@ -491,6 +544,13 @@ void OriginalRecording::closeFiles()
         eventFile = nullptr;
         diskWriteLock.exit();
     }
+	if (messageFile != nullptr)
+	{
+		diskWriteLock.enter();
+		fclose(messageFile);
+		messageFile = nullptr;
+		diskWriteLock.exit();
+	}
     blockIndex = 0;
 }
 
diff --git a/Source/Processors/OriginalRecording.h b/Source/Processors/OriginalRecording.h
index 99c6f0a716965fd712e3037ccb9d254663130008..e98e29cdb225981d95512e088b6c671a7e0da4f1 100644
--- a/Source/Processors/OriginalRecording.h
+++ b/Source/Processors/OriginalRecording.h
@@ -59,6 +59,10 @@ private:
     void openSpikeFile(File rootFolder, SpikeRecordInfo* elec);
     String generateSpikeHeader(SpikeRecordInfo* elec);
 
+	void openMessageFile(File rootFolder);
+	void writeTTLEvent(MidiMessage& event, int samplePosition);
+	void writeMessage(MidiMessage& event, int samplePosition);
+
     bool separateFiles;
     int blockIndex;
     int recordingNumber;
@@ -81,6 +85,7 @@ private:
     int64 timestamp;
 
     FILE* eventFile;
+	FILE* messageFile;
     Array<FILE*> fileArray;
     Array<FILE*> spikeFileArray;
     CriticalSection diskWriteLock;
diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp
index d1069ad7f622888fcbf9f83832ed1c9fc5f7e82b..05cd28efb6f545c44229dc5d1094eada79f4cbb1 100755
--- a/Source/Processors/RecordNode.cpp
+++ b/Source/Processors/RecordNode.cpp
@@ -410,7 +410,7 @@ float RecordNode::getFreeSpace()
 
 void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePosition)
 {
-    if (eventType == TTL)
+	if ((eventType == TTL) || (eventType == MESSAGE))
     {
         if (event.getNoteNumber() > 0) // processor ID > 0
         {