diff --git a/Source/Plugins/SerialInput/SerialInput.cpp b/Source/Plugins/SerialInput/SerialInput.cpp
index f1dc7d227d3e14b49c7fa4532d2bfb616817e70a..5c90d831a9c86c3981fd04571b96d594722db65b 100644
--- a/Source/Plugins/SerialInput/SerialInput.cpp
+++ b/Source/Plugins/SerialInput/SerialInput.cpp
@@ -24,6 +24,7 @@
 
 #include <stdio.h>
 #include "SerialInput.h"
+#define MAX_MSG_SIZE 10000
 
 const int SerialInput::BAUDRATES[12] = 
 {
@@ -45,8 +46,10 @@ const int SerialInput::BAUDRATES[12] =
 SerialInput::SerialInput()
     : GenericProcessor  ("Serial Port")
     , baudrate          (0)
+	, lastRecv			(0)
 {
     setProcessorType (PROCESSOR_TYPE_SOURCE);
+	dataBuffer.calloc(MAX_MSG_SIZE);
 }
 
 
@@ -55,6 +58,15 @@ SerialInput::~SerialInput()
     serial.close();
 }
 
+//Since the data needs a meximum buffer size but the actual number of read bytes might be less, let's 
+//add that info as a metadata field.
+void SerialInput::createEventChannels()
+{
+	//It's going to be raw binary data, so let's make it uint8
+	EventChannel* chan = new EventChannel(EventChannel::UINT8_ARRAY, 1, MAX_MSG_SIZE, this);
+	chan->addEventMetaData(new MetaDataDescriptor(MetaDataDescriptor::UINT64, 1, "Read Bytes", "Number of actual read bytes in the buffer", "bufferLength"));
+	eventChannelArray.add(chan);
+}
 
 StringArray SerialInput::getDevices()
 {
@@ -112,8 +124,11 @@ bool SerialInput::disable()
 }
 
 
-void SerialInput::process (AudioSampleBuffer&, MidiBuffer& events)
+void SerialInput::process (AudioSampleBuffer&)
 {
+	uint64 timestamp = CoreServices::getGlobalTimestamp();
+	setTimestampAndSamples(timestamp, 0);
+
     int bytesAvailable = serial.available();
 
     if (bytesAvailable == OF_SERIAL_ERROR)
@@ -125,18 +140,22 @@ void SerialInput::process (AudioSampleBuffer&, MidiBuffer& events)
 
     if (bytesAvailable > 0)
     {
-        unsigned char buffer[10000];
-        int bytesRead = serial.readBytes (buffer, bytesAvailable);
+
+        int bytesRead = serial.readBytes (dataBuffer, bytesAvailable);
 
         if (bytesRead > 0)
         {
-            addEvent (events,       // MidiBuffer
-                      BINARY_MSG,   // eventType
-                      0,            // sampleNum
-                      nodeId,       // eventID
-                      0,            // eventChannel
-                      bytesRead,    // numBytes
-                      buffer);      // data
+			//Clear the rest of the buffer so we don't send garbage.
+			if (bytesRead < lastRecv)
+				zeromem(dataBuffer.getData() + bytesRead, lastRecv - bytesRead);
+			lastRecv = bytesRead;
+			MetaDataValueArray metadata;
+			MetaDataValuePtr bufferRead = new MetaDataValue(MetaDataDescriptor::UINT64, 1);
+			bufferRead->setValue(static_cast<uint64>(bytesRead));
+			metadata.add(bufferRead);
+			const EventChannel* chan = getEventChannel(getEventChannelIndex(0, getNodeId()));
+			BinaryEventPtr event = BinaryEvent::createBinaryEvent(chan, timestamp, static_cast<uint8*>(dataBuffer.getData()), MAX_MSG_SIZE, metadata);
+			addEvent(chan, event, 0);
         }
         else if (bytesRead < 0)
         {
diff --git a/Source/Plugins/SerialInput/SerialInput.h b/Source/Plugins/SerialInput/SerialInput.h
index b9333bc86a9c06dceb98e436e9f09fd11bf55c1c..624af4da26e9f47110639a724769d0302cded52d 100644
--- a/Source/Plugins/SerialInput/SerialInput.h
+++ b/Source/Plugins/SerialInput/SerialInput.h
@@ -56,7 +56,7 @@ public:
 
         Adds all the new serial data that is available to the event data buffer.
      */
-    void process (AudioSampleBuffer& buffer, MidiBuffer& events) override;
+    void process (AudioSampleBuffer& buffer) override;
 
     /**
         This should only be run by the ProcessorGraph, before acquisition will be started.
@@ -89,6 +89,8 @@ public:
 
     /** Setter, that allows you to set the baudrate that will be used during acquisition */
     void setBaudrate (int baudrate);
+protected:
+	void createEventChannels() override;
 
 
 private:
@@ -104,6 +106,9 @@ private:
     // List of baudrates that are available by default.
     static const int BAUDRATES[12];
 
+	HeapBlock<unsigned char> dataBuffer;
+	int lastRecv;
+
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SerialInput);
 };
 
diff --git a/Source/Processors/Channel/MetaData.cpp b/Source/Processors/Channel/MetaData.cpp
index 2458f09bff8622b2cfad48961cba7c4e78630291..b4f7759985441784bc2eb866332655bd0b311709 100644
--- a/Source/Processors/Channel/MetaData.cpp
+++ b/Source/Processors/Channel/MetaData.cpp
@@ -337,74 +337,74 @@ MetaDataEventLock::MetaDataEventLock() {}
 //2-To define a fixed set of types that can be used, instead of a general instantiation. Trying to use this with other types
 //will throuw a linker error.
 
-template void MetaDataValue::setValue<char>(char);
-template void MetaDataValue::setValue<int8>(int8);
-template void MetaDataValue::setValue<uint8>(uint8);
-template void MetaDataValue::setValue<int16>(int16);
-template void MetaDataValue::setValue<uint16>(uint16);
-template void MetaDataValue::setValue<int32>(int32);
-template void MetaDataValue::setValue<uint32>(uint32);
-template void MetaDataValue::setValue<int64>(int64);
-template void MetaDataValue::setValue<uint64>(uint64);
-template void MetaDataValue::setValue<float>(float);
-template void MetaDataValue::setValue<double>(double);
-
-template void MetaDataValue::getValue<char>(char&) const;
-template void MetaDataValue::getValue<int8>(int8&) const;
-template void MetaDataValue::getValue<uint8>(uint8&) const;
-template void MetaDataValue::getValue<int16>(int16&) const;
-template void MetaDataValue::getValue<uint16>(uint16&) const;
-template void MetaDataValue::getValue<int32>(int32&) const;
-template void MetaDataValue::getValue<uint32>(uint32&) const;
-template void MetaDataValue::getValue<int64>(int64&) const;
-template void MetaDataValue::getValue<uint64>(uint64&) const;
-template void MetaDataValue::getValue<float>(float&) const;
-template void MetaDataValue::getValue<double>(double&) const;
-
-template void MetaDataValue::setValue<char>(const char*);
-template void MetaDataValue::setValue<int8>(const int8*);
-template void MetaDataValue::setValue<uint8>(const uint8*);
-template void MetaDataValue::setValue<int16>(const int16*);
-template void MetaDataValue::setValue<uint16>(const uint16*);
-template void MetaDataValue::setValue<int32>(const int32*);
-template void MetaDataValue::setValue<uint32>(const uint32*);
-template void MetaDataValue::setValue<int64>(const int64*);
-template void MetaDataValue::setValue<uint64>(const uint64*);
-template void MetaDataValue::setValue<float>(const float*);
-template void MetaDataValue::setValue<double>(const double*);
-
-template void MetaDataValue::getValue<char>(char*) const;
-template void MetaDataValue::getValue<int8>(int8*) const;
-template void MetaDataValue::getValue<uint8>(uint8*) const;
-template void MetaDataValue::getValue<int16>(int16*) const;
-template void MetaDataValue::getValue<uint16>(uint16*) const;
-template void MetaDataValue::getValue<int32>(int32*) const;
-template void MetaDataValue::getValue<uint32>(uint32*) const;
-template void MetaDataValue::getValue<int64>(int64*) const;
-template void MetaDataValue::getValue<uint64>(uint64*) const;
-template void MetaDataValue::getValue<float>(float*) const;
-template void MetaDataValue::getValue<double>(double*) const;
-
-template void MetaDataValue::setValue<char>(const Array<char>&);
-template void MetaDataValue::setValue<int8>(const Array<int8>&);
-template void MetaDataValue::setValue<uint8>(const Array<uint8>&);
-template void MetaDataValue::setValue<int16>(const Array<int16>&);
-template void MetaDataValue::setValue<uint16>(const Array<uint16>&);
-template void MetaDataValue::setValue<int32>(const Array<int32>&);
-template void MetaDataValue::setValue<uint32>(const Array<uint32>&);
-template void MetaDataValue::setValue<int64>(const Array<int64>&);
-template void MetaDataValue::setValue<uint64>(const Array<uint64>&);
-template void MetaDataValue::setValue<float>(const Array<float>&);
-template void MetaDataValue::setValue<double>(const Array<double>&);
-
-template void MetaDataValue::getValue<char>(Array<char>&) const;
-template void MetaDataValue::getValue<int8>(Array<int8>&) const;
-template void MetaDataValue::getValue<uint8>(Array<uint8>&) const;
-template void MetaDataValue::getValue<int16>(Array<int16>&) const;
-template void MetaDataValue::getValue<uint16>(Array<uint16>&) const;
-template void MetaDataValue::getValue<int32>(Array<int32>&) const;
-template void MetaDataValue::getValue<uint32>(Array<uint32>&) const;
-template void MetaDataValue::getValue<int64>(Array<int64>&) const;
-template void MetaDataValue::getValue<uint64>(Array<uint64>&) const;
-template void MetaDataValue::getValue<float>(Array<float>&) const;
-template void MetaDataValue::getValue<double>(Array<double>&) const;
\ No newline at end of file
+template PLUGIN_API void MetaDataValue::setValue<char>(char);
+template PLUGIN_API void MetaDataValue::setValue<int8>(int8);
+template PLUGIN_API void MetaDataValue::setValue<uint8>(uint8);
+template PLUGIN_API void MetaDataValue::setValue<int16>(int16);
+template PLUGIN_API void MetaDataValue::setValue<uint16>(uint16);
+template PLUGIN_API void MetaDataValue::setValue<int32>(int32);
+template PLUGIN_API void MetaDataValue::setValue<uint32>(uint32);
+template PLUGIN_API void MetaDataValue::setValue<int64>(int64);
+template PLUGIN_API void MetaDataValue::setValue<uint64>(uint64);
+template PLUGIN_API void MetaDataValue::setValue<float>(float);
+template PLUGIN_API void MetaDataValue::setValue<double>(double);
+
+template PLUGIN_API void MetaDataValue::getValue<char>(char&) const;
+template PLUGIN_API void MetaDataValue::getValue<int8>(int8&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint8>(uint8&) const;
+template PLUGIN_API void MetaDataValue::getValue<int16>(int16&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint16>(uint16&) const;
+template PLUGIN_API void MetaDataValue::getValue<int32>(int32&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint32>(uint32&) const;
+template PLUGIN_API void MetaDataValue::getValue<int64>(int64&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint64>(uint64&) const;
+template PLUGIN_API void MetaDataValue::getValue<float>(float&) const;
+template PLUGIN_API void MetaDataValue::getValue<double>(double&) const;
+
+template PLUGIN_API void MetaDataValue::setValue<char>(const char*);
+template PLUGIN_API void MetaDataValue::setValue<int8>(const int8*);
+template PLUGIN_API void MetaDataValue::setValue<uint8>(const uint8*);
+template PLUGIN_API void MetaDataValue::setValue<int16>(const int16*);
+template PLUGIN_API void MetaDataValue::setValue<uint16>(const uint16*);
+template PLUGIN_API void MetaDataValue::setValue<int32>(const int32*);
+template PLUGIN_API void MetaDataValue::setValue<uint32>(const uint32*);
+template PLUGIN_API void MetaDataValue::setValue<int64>(const int64*);
+template PLUGIN_API void MetaDataValue::setValue<uint64>(const uint64*);
+template PLUGIN_API void MetaDataValue::setValue<float>(const float*);
+template PLUGIN_API void MetaDataValue::setValue<double>(const double*);
+
+template PLUGIN_API void MetaDataValue::getValue<char>(char*) const;
+template PLUGIN_API void MetaDataValue::getValue<int8>(int8*) const;
+template PLUGIN_API void MetaDataValue::getValue<uint8>(uint8*) const;
+template PLUGIN_API void MetaDataValue::getValue<int16>(int16*) const;
+template PLUGIN_API void MetaDataValue::getValue<uint16>(uint16*) const;
+template PLUGIN_API void MetaDataValue::getValue<int32>(int32*) const;
+template PLUGIN_API void MetaDataValue::getValue<uint32>(uint32*) const;
+template PLUGIN_API void MetaDataValue::getValue<int64>(int64*) const;
+template PLUGIN_API void MetaDataValue::getValue<uint64>(uint64*) const;
+template PLUGIN_API void MetaDataValue::getValue<float>(float*) const;
+template PLUGIN_API void MetaDataValue::getValue<double>(double*) const;
+
+template PLUGIN_API void MetaDataValue::setValue<char>(const Array<char>&);
+template PLUGIN_API void MetaDataValue::setValue<int8>(const Array<int8>&);
+template PLUGIN_API void MetaDataValue::setValue<uint8>(const Array<uint8>&);
+template PLUGIN_API void MetaDataValue::setValue<int16>(const Array<int16>&);
+template PLUGIN_API void MetaDataValue::setValue<uint16>(const Array<uint16>&);
+template PLUGIN_API void MetaDataValue::setValue<int32>(const Array<int32>&);
+template PLUGIN_API void MetaDataValue::setValue<uint32>(const Array<uint32>&);
+template PLUGIN_API void MetaDataValue::setValue<int64>(const Array<int64>&);
+template PLUGIN_API void MetaDataValue::setValue<uint64>(const Array<uint64>&);
+template PLUGIN_API void MetaDataValue::setValue<float>(const Array<float>&);
+template PLUGIN_API void MetaDataValue::setValue<double>(const Array<double>&);
+
+template PLUGIN_API void MetaDataValue::getValue<char>(Array<char>&) const;
+template PLUGIN_API void MetaDataValue::getValue<int8>(Array<int8>&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint8>(Array<uint8>&) const;
+template PLUGIN_API void MetaDataValue::getValue<int16>(Array<int16>&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint16>(Array<uint16>&) const;
+template PLUGIN_API void MetaDataValue::getValue<int32>(Array<int32>&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint32>(Array<uint32>&) const;
+template PLUGIN_API void MetaDataValue::getValue<int64>(Array<int64>&) const;
+template PLUGIN_API void MetaDataValue::getValue<uint64>(Array<uint64>&) const;
+template PLUGIN_API void MetaDataValue::getValue<float>(Array<float>&) const;
+template PLUGIN_API void MetaDataValue::getValue<double>(Array<double>&) const;
\ No newline at end of file
diff --git a/Source/Processors/Events/Events.cpp b/Source/Processors/Events/Events.cpp
index fccc10e97eadfff130860662fc832acce5494c92..d54570d7c17c3eb5e10190823e6dd91d3971a335 100644
--- a/Source/Processors/Events/Events.cpp
+++ b/Source/Processors/Events/Events.cpp
@@ -294,7 +294,7 @@ bool Event::createChecks(const EventChannel* channelInfo, EventChannel::EventCha
 bool Event::createChecks(const EventChannel* channelInfo, EventChannel::EventChannelTypes eventType, uint16 channel, const MetaDataValueArray& metaData)
 {
 	if (!channelInfo) return false;
-	if (channelInfo->getChannelType() != EventChannel::TTL) return false;
+	if (channelInfo->getChannelType() != eventType) return false;
 	if ((channel < 0) || (channel >= channelInfo->getNumChannels())) return false;
 	if (!compareMetaData(channelInfo, metaData)) return nullptr;
 	return true;
@@ -681,7 +681,7 @@ BinaryEventPtr BinaryEvent::createBinaryEvent(const EventChannel* channelInfo, u
 		return nullptr;
 	}
 
-	if (!createChecks(channelInfo, EventChannel::TTL, channel, metaData))
+	if (!createChecks(channelInfo, type, channel, metaData))
 	{
 		jassertfalse;
 		return nullptr;
@@ -1019,24 +1019,24 @@ float* SpikeEvent::SpikeBuffer::operator[](const int index)
 }
 
 //Template definitions
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, uint16);
-
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, const MetaDataValueArray&, uint16);
-template BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, const MetaDataValueArray&, uint16);
\ No newline at end of file
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, uint16);
+
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int8>(const EventChannel*, uint64, const int8* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint8>(const EventChannel*, uint64, const uint8* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int16>(const EventChannel*, uint64, const int16* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint16>(const EventChannel*, uint64, const uint16* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int32>(const EventChannel*, uint64, const int32* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint32>(const EventChannel*, uint64, const uint32* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<int64>(const EventChannel*, uint64, const int64* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<uint64>(const EventChannel*, uint64, const uint64* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<float>(const EventChannel*, uint64, const float* data, int, const MetaDataValueArray&, uint16);
+template PLUGIN_API BinaryEventPtr BinaryEvent::createBinaryEvent<double>(const EventChannel*, uint64, const double* data, int, const MetaDataValueArray&, uint16);
\ No newline at end of file