diff --git a/Source/Processors/DataThreads/DataBuffer.h b/Source/Processors/DataThreads/DataBuffer.h
index 2695ab61d314e6ebe38189f3c9d550bcf34e4886..dc088a63000497d09f14bce680bf50c5db12b7f8 100644
--- a/Source/Processors/DataThreads/DataBuffer.h
+++ b/Source/Processors/DataThreads/DataBuffer.h
@@ -28,6 +28,9 @@ private:
 	AbstractFifo abstractFifo;
 	AudioSampleBuffer buffer;
 	int numChans;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataBuffer);
+
 };
 
 
diff --git a/Source/Processors/DataThreads/DataThread.cpp b/Source/Processors/DataThreads/DataThread.cpp
index a10c258dd7bd21d25339efbba1e28245187e2ee5..dd83b847c237fe7672fceedc8ffd7da0d43e3e2f 100644
--- a/Source/Processors/DataThreads/DataThread.cpp
+++ b/Source/Processors/DataThreads/DataThread.cpp
@@ -31,7 +31,10 @@ DataThread::DataThread(SourceNode* s) : Thread ("Data Thread"), dataBuffer(0)
 	setPriority(10);
 }
 
-DataThread::~DataThread() {}
+DataThread::~DataThread() 
+{
+    deleteAndZero(dataBuffer);
+}
 
 void DataThread::run() {
 
diff --git a/Source/Processors/DataThreads/DataThread.h b/Source/Processors/DataThreads/DataThread.h
index a86cfa4e266065ad5aea5de7bb57c21770e5ad0d..001bb8e5fabc36645a5ea8c49a8792ebdf8b9448 100644
--- a/Source/Processors/DataThreads/DataThread.h
+++ b/Source/Processors/DataThreads/DataThread.h
@@ -64,6 +64,11 @@ public:
 
 	SourceNode* sn;
 
+private:
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataThread);
+
+
 };
 
 
diff --git a/Source/Processors/EventNode.cpp b/Source/Processors/EventNode.cpp
index c0ee0c90e4c43a1a94d70feb0860804a312d188f..b36be29e73a6aa93391520d8b17e46d6faee1e11 100644
--- a/Source/Processors/EventNode.cpp
+++ b/Source/Processors/EventNode.cpp
@@ -69,7 +69,7 @@ void EventNode::process(AudioSampleBuffer &buffer,
 		if (accumulator > getSampleRate()/Hz)
 		{
 			//std::cout << "Adding message." << std::endl;
-			addEvent(midiMessages, 10, i);
+			addEvent(midiMessages, TTL, i);
 			accumulator = 0;
 		}
 
diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp
index 2ffebde260de37c8b7bdf6f4692d049537c244f7..6fa0d3d360a485e3247826d0c65663e3c22dcfee 100644
--- a/Source/Processors/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor.cpp
@@ -88,17 +88,16 @@ void GenericProcessor::resetConnections()
 	wasConnected = false;
 }
 
-void GenericProcessor::setNumSamples(MidiBuffer& midiMessages, int numberToAdd) {
+void GenericProcessor::setNumSamples(MidiBuffer& midiMessages, int sampleIndex) {
 
 	uint8 data[2];
 
-	data[0] = numberToAdd >> 8; 	// most-significant byte
-    data[1] = numberToAdd & 0xFF; 	// least-significant byte
+	data[0] = BUFFER_SIZE; 	// most-significant byte
+    data[1] = nodeId; 		// least-significant byte
 
     midiMessages.addEvent(data, 		// spike data
-                          sizeof(data), // total bytes
-                          -1);           // sample index
-
+                          2, 			// total bytes
+                          sampleIndex); // sample index
 
 }
 
@@ -118,13 +117,13 @@ int GenericProcessor::getNumSamples(MidiBuffer& midiMessages) {
 
 		while (i.getNextEvent (message, samplePosition)) {
 			
-				int numbytes = message.getRawDataSize();
-				uint8* dataptr = message.getRawData();
+			uint8* dataptr = message.getRawData();
 
-				if (message.getTimeStamp() < 0)
-					numRead = (*dataptr<<8) + *(dataptr+1);
+			if (*dataptr == BUFFER_SIZE)
+			{
+				numRead = message.getTimeStamp();
+			}
 		}
-
 	}
 
 	return numRead;
@@ -321,18 +320,11 @@ int GenericProcessor::checkForEvents(MidiBuffer& midiMessages)
 
 		while (i.getNextEvent (message, samplePosition)) {
 			
-				int numbytes = message.getRawDataSize();
-				uint8* dataptr = message.getRawData();
+			//int numbytes = message.getRawDataSize();
+			uint8* dataptr = message.getRawData();
 
-				//std::cout << " Bytes received: " << numbytes << std::endl;
-				//std::cout << " Message timestamp = " << message.getTimeStamp() << std::endl;
+			handleEvent(*dataptr, message);
 
-				if (message.getTimeStamp() >= 0)
-				{
-					int value = (*dataptr<<8) + *(dataptr+1);
-					//std::cout << "   " << value << std::endl;
-					return value;
-				}
 		}
 
 	}
@@ -341,12 +333,21 @@ int GenericProcessor::checkForEvents(MidiBuffer& midiMessages)
 
 }
 
-void GenericProcessor::addEvent(MidiBuffer& midiMessages, int numberToAdd, int sampleNum)
+void GenericProcessor::addEvent(MidiBuffer& midiMessages,
+							    uint8 type,
+							    int sampleNum,
+							    uint8 eventId,
+							    uint8 eventChannel,
+							    uint8 numBytes,
+							    uint8* eventData)
 {
-	uint8 data[2];
+	uint8 data[4+numBytes];
 
-	data[0] = numberToAdd >> 8; 	// most-significant byte
-    data[1] = numberToAdd & 0xFF; 	// least-significant byte
+	data[0] = type;    // event type
+    data[1] = nodeId;  // processor ID
+    data[2] = eventId; // event ID
+    data[3] = eventChannel; // event channel
+    memcpy(&data[4], eventData, numBytes);
 
     midiMessages.addEvent(data, 		// spike data
                           sizeof(data), // total bytes
diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h
index a5742e6cabd5942c7f200ef2dabef7b114a698ee..bd6d1424cc9aad3dbdd3f85dd0f6360d83aa4143 100644
--- a/Source/Processors/GenericProcessor.h
+++ b/Source/Processors/GenericProcessor.h
@@ -158,17 +158,33 @@ public:
 
 	virtual bool stillHasSource() {return true;}
 
+	bool isEnabled;
+	bool wasConnected;
+
 	virtual AudioSampleBuffer* getContinuousBuffer() {return 0;}
 	virtual MidiBuffer* getEventBuffer() {return 0;}
 
 	int nextAvailableChannel;
 
-	int checkForEvents(MidiBuffer& mb);
-	void addEvent(MidiBuffer& mb, int a, int b);
-
-	bool isEnabled;
-
-	bool wasConnected;
+	// event buffers
+	virtual int checkForEvents(MidiBuffer& mb);
+	virtual void addEvent(MidiBuffer& mb,
+	                      uint8 type,
+	                      int sampleNum,
+	                      uint8 eventID = 0,
+	                      uint8 eventChannel = 0,
+	                      uint8 numBytes = 0,
+	                      uint8* data = 0);
+
+	virtual void handleEvent(int eventType, MidiMessage& event) {}
+
+	enum eventTypes 
+ 	{
+ 		BUFFER_SIZE = 0,
+ 		PARAMETER_CHANGE = 1,
+ 		TTL = 2,
+ 		SPIKE = 3
+ 	};
 
 	int saveOrder;
 	int loadOrder;
@@ -202,15 +218,15 @@ public:
 	virtual void generateDefaultChannelNames(StringArray&);
 
 	virtual void update(); // default node updating
-	virtual void updateSettings() {};
+	virtual void updateSettings() {} // custom node updating
+
+	int nodeId;
 
 private:
 
 	void processBlock (AudioSampleBuffer &buffer, MidiBuffer &midiMessages);
 
 	const String name;
-
-	int nodeId;
 	
 	int getNumSamples(MidiBuffer&);
 	void setNumSamples(MidiBuffer&, int);
diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp
index fb313b3829dc7b4925009bdd6f7d2b72534ca613..c444d776a51e218e684a9581cf80c1bcde91c82d 100644
--- a/Source/Processors/LfpDisplayNode.cpp
+++ b/Source/Processors/LfpDisplayNode.cpp
@@ -100,6 +100,7 @@ void LfpDisplayNode::setParameter (int parameterIndex, float newValue)
 void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples)
 {
 	// 1. place any new samples into the displayBuffer
+
 	int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex;
 
 	if (nSamples < samplesLeft)
diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp
index c964169f0b24d9dad8fccff3d34fda162dbb9d52..e22db7a14f7720cc7b432ce45ef06bcb51293873 100644
--- a/Source/Processors/SourceNode.cpp
+++ b/Source/Processors/SourceNode.cpp
@@ -27,7 +27,7 @@
 
 SourceNode::SourceNode(const String& name_)
 	: GenericProcessor(name_),
-	  dataThread(0),
+	  dataThread(0), inputBuffer(0),
 	  sourceCheckInterval(2000), wasDisabled(true)
 {
 	if (getName().equalsIgnoreCase("Intan Demo Board")) {
@@ -55,14 +55,14 @@ SourceNode::SourceNode(const String& name_)
 
 SourceNode::~SourceNode() 
 {
-	//if (dataThread != 0)
-	//	deleteAndZero(dataThread);
-
-	//config->removeDataSource(this);	
 }
 
 void SourceNode::updateSettings()
 {
+	if (inputBuffer == 0 && dataThread != 0)
+	{
+		inputBuffer = dataThread->getBufferAddress();
+	}
 
 }
 
@@ -122,7 +122,6 @@ void SourceNode::timerCallback()
 			//stopTimer(); // check for input source every two seconds
 			enabledState(true);
 			GenericEditor* ed = getEditor();
-			//ed->enable();
 			getEditorViewport()->makeEditorVisible(ed);
 		}
 	} else {
@@ -130,7 +129,6 @@ void SourceNode::timerCallback()
 			std::cout << "No input source found." << std::endl;
 			enabledState(false);
 			GenericEditor* ed = getEditor();
-			//ed->disable();
 			getEditorViewport()->makeEditorVisible(ed);
 		}
 	}
@@ -161,29 +159,6 @@ bool SourceNode::enable() {
 
 	stopTimer();
 
-	
-
-	// bool return_code = true;
-
-	// if (getName().equalsIgnoreCase("Intan Demo Board")) {
-		
-	// 	dataThread = new IntanThread();
-	// 	inputBuffer = dataThread->getBufferAddress();
-	// 	return_code = dataThread->threadStarted();
-
-	// 	if (!return_code)
-	// 		deleteAndZero(dataThread);
-
-	// } else if (getName().equalsIgnoreCase("Custom FPGA")) {
-	// 	dataThread = new FPGAThread();
-	// 	inputBuffer = dataThread->getBufferAddress();
-	// } else if (getName().equalsIgnoreCase("File Reader")) {
-	// 	dataThread = new FileReaderThread();
-	// 	inputBuffer = dataThread->getBufferAddress();
-	// }
-
-	// return return_code;
-
 }
 
 bool SourceNode::disable() {
@@ -217,22 +192,14 @@ void SourceNode::acquisitionStopped()
 }
 
 
-void SourceNode::process(AudioSampleBuffer &outputBuffer, 
-                            MidiBuffer &midiMessages,
+void SourceNode::process(AudioSampleBuffer &buffer, 
+                            MidiBuffer &events,
                             int& nSamples)
 {
-
-	//std::cout << "Source node processing." << std::endl;
-	//std::cout << outputBuffer.getNumChannels() << " " << outputBuffer.getNumSamples() << std::endl;
-
 	
-	 outputBuffer.clear();
-	 nSamples = inputBuffer->readAllFromBuffer(outputBuffer,outputBuffer.getNumSamples());
-	// //setNumSamples(numRead); // write the total number of samples
-	// setNumSamples(midiMessages, numRead);
-	//std::cout << numRead << std::endl;
-
-	//addMidiEvent(midiMessages,10, 10);
+	 buffer.clear();
+	 nSamples = inputBuffer->readAllFromBuffer(buffer,buffer.getNumSamples());
+	
 }
 
 
diff --git a/Source/Processors/SpikeDetector.h b/Source/Processors/SpikeDetector.h
index 8d0a1059e24a74ec24d3edd90b56b5a5c7d42073..770ed5800acc4749afc7ea94f1cab679d5b510ca 100644
--- a/Source/Processors/SpikeDetector.h
+++ b/Source/Processors/SpikeDetector.h
@@ -31,8 +31,6 @@
 
 /**
 
-  --UNDER CONSTRUCTION--
-
   Detects spikes in a continuous signal and outputs events containing the spike data.
 
   @see GenericProcessor, SpikeDetectorEditor
diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp
index 2609c2d4f03e0f41f5865335d6f7ea0d5cc79779..3c54ef979d269713d83b13c47b8401d9c4882e56 100644
--- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp
+++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp
@@ -92,6 +92,12 @@ void LfpDisplayCanvas::update()
 	if (nChans < 200 && nChans > 0)
 		screenBuffer->setSize(nChans, 10000);
 	//sampleRate = processor->getSampleRate();
+
+	screenBuffer->clear();
+
+	repaint();
+
+	totalHeight = (plotHeight+yBuffer)*nChans + yBuffer;
 }