diff --git a/Builds/Linux/build/windowState.xml b/Builds/Linux/build/windowState.xml
index 38dad57e4e40f3f0460d946e2ad333503f29dc2c..3488bf5bf021bfbe29f2e82add4a1ccad002fcaf 100644
--- a/Builds/Linux/build/windowState.xml
+++ b/Builds/Linux/build/windowState.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <MAINWINDOW>
-  <BOUNDS x="1729" y="52" w="1161" h="968" fullscreen="0"/>
+  <BOUNDS x="1739" y="52" w="1181" h="831" fullscreen="0"/>
 </MAINWINDOW>
diff --git a/Source/Processors/DataThreads/DataThread.cpp b/Source/Processors/DataThreads/DataThread.cpp
index 0f31a883ee7c209c62380c56187af9463d7cd02c..c165ad233eaf006de02119167e6507abdd5dd747 100644
--- a/Source/Processors/DataThreads/DataThread.cpp
+++ b/Source/Processors/DataThreads/DataThread.cpp
@@ -9,8 +9,13 @@
 */
 
 #include "DataThread.h"
+#include "../SourceNode.h"
 
-DataThread::DataThread() : Thread ("Data Thread"), dataBuffer(0) {}
+
+DataThread::DataThread(SourceNode* s) : Thread ("Data Thread"), dataBuffer(0) 
+{
+	sn = s;
+}
 
 DataThread::~DataThread() {}
 
@@ -21,8 +26,15 @@ void DataThread::run() {
 		const MessageManagerLock mml (Thread::getCurrentThread());
 		if (! mml.lockWasGained())
 			return;
-		if (!updateBuffer())
+		if (!updateBuffer()) {
+			std::cout << "Aquisition error...stopping thread." << std::endl;
 			signalThreadShouldExit();
+			//stopAcquisition();
+			std::cout << "Notifying source node to stop acqusition." << std::endl;
+			sn->acquisitionStopped();
+		}
+			//
+
 	}
 }
 
diff --git a/Source/Processors/DataThreads/DataThread.h b/Source/Processors/DataThreads/DataThread.h
index 33d1975730aa30cae168ab12475098bf975dc7eb..9f269fbee3bd939ce6b0904854e33c224075d437 100644
--- a/Source/Processors/DataThreads/DataThread.h
+++ b/Source/Processors/DataThreads/DataThread.h
@@ -15,12 +15,14 @@
 #include <stdio.h>
 #include "DataBuffer.h"
 
+class SourceNode;
+
 class DataThread : public Thread
 {
 
 public:
 
-	DataThread();
+	DataThread(SourceNode* sn);
 	~DataThread();
 
 	void run();
@@ -37,6 +39,8 @@ public:
 	virtual int getNumChannels() = 0;
 	virtual float getSampleRate() = 0;
 
+	SourceNode* sn;
+
 };
 
 
diff --git a/Source/Processors/DataThreads/FPGAThread.cpp b/Source/Processors/DataThreads/FPGAThread.cpp
index 59b5b18ffeb066669c211e28acbfd4788cb1c6e2..485e978bdb69f72e67d88e92799c61a6d597fdd9 100644
--- a/Source/Processors/DataThreads/FPGAThread.cpp
+++ b/Source/Processors/DataThreads/FPGAThread.cpp
@@ -10,7 +10,7 @@
 
 #include "FPGAThread.h"
 
-FPGAThread::FPGAThread() : DataThread(),
+FPGAThread::FPGAThread(SourceNode* sn) : DataThread(sn),
 			isRunning(false),
 			numchannels(32),
 			m_u32SegmentSize(1048576)
diff --git a/Source/Processors/DataThreads/FPGAThread.h b/Source/Processors/DataThreads/FPGAThread.h
index bf68110a5e4089c45316596ce7a0f9dc87d50c3f..04e9f371bb6448eedf35c08a84bdf815a8e7888e 100644
--- a/Source/Processors/DataThreads/FPGAThread.h
+++ b/Source/Processors/DataThreads/FPGAThread.h
@@ -22,11 +22,14 @@
 #include "okFrontPanelDLL.h"
 #include "DataThread.h"
 
+
+class SourceNode;
+
 class FPGAThread : public DataThread
 
 {
 public:
-	FPGAThread();
+	FPGAThread(SourceNode* sn);
 	~FPGAThread();
 
 	bool foundInputSource() {return true;}
diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp
index 905793497af84bab6c9799a13bc9aa9bed57886a..09dace080f614c5f82f4ac5dec55efc72581a37e 100644
--- a/Source/Processors/DataThreads/FileReaderThread.cpp
+++ b/Source/Processors/DataThreads/FileReaderThread.cpp
@@ -11,7 +11,7 @@
 
 #include "FileReaderThread.h"
 
-FileReaderThread::FileReaderThread() : DataThread(),
+FileReaderThread::FileReaderThread(SourceNode* sn) : DataThread(sn),
 			sampleRate(40000.0),
 			numChannels(16),
 			samplesPerBlock(1024)
diff --git a/Source/Processors/DataThreads/FileReaderThread.h b/Source/Processors/DataThreads/FileReaderThread.h
index d98afa06ac0918ba2d0100eaea199788b23b42bc..676167341212275b437fc3ae3fe31d4b45dcf773 100644
--- a/Source/Processors/DataThreads/FileReaderThread.h
+++ b/Source/Processors/DataThreads/FileReaderThread.h
@@ -17,11 +17,14 @@
 #include <stdio.h>
 #include "DataThread.h"
 
+
+class SourceNode;
+
 class FileReaderThread : public DataThread
 
 {
 public:
-	FileReaderThread();
+	FileReaderThread(SourceNode* sn);
 	~FileReaderThread();
 
 	bool foundInputSource() {return true;}
diff --git a/Source/Processors/DataThreads/IntanThread.cpp b/Source/Processors/DataThreads/IntanThread.cpp
index 607b4fe092a1b1b3e56b1207b7477f0dec586894..fec0ac7dba9eab52f97a278f9eb89e8d3eca54f6 100644
--- a/Source/Processors/DataThreads/IntanThread.cpp
+++ b/Source/Processors/DataThreads/IntanThread.cpp
@@ -10,7 +10,7 @@
 
 #include "IntanThread.h"
 
-IntanThread::IntanThread() : DataThread(),
+IntanThread::IntanThread(SourceNode* sn) : DataThread(sn),
 			vendorID(0x0403),
 			productID(0x6010),
 			baudrate(115200),
@@ -29,7 +29,7 @@ IntanThread::IntanThread() : DataThread(),
 
 IntanThread::~IntanThread() 
 {
-	closeUSB();
+	//closeUSB();
 	deleteAndZero(dataBuffer);
 }
 
@@ -70,17 +70,33 @@ bool IntanThread::foundInputSource()
 
 bool IntanThread::startAcquisition()
 {
+    closeUSB();
+    initializeUSB(false);
     ftdi_write_data(&ftdic, &startCode, 1);
     startThread();
+
+    return true;
 }
 
 bool IntanThread::stopAcquisition()
 {
-    stopThread(500);
+    std::cout << "Received signal to terminate thread." << std::endl;
+    
+    if (isThreadRunning()) {
+        signalThreadShouldExit();
+    }
+
+    std::cout << "Thread stopped successfully, stopping Intan Board." << std::endl;
 
-    ftdi_write_data(&ftdic, &stopCode, 1);
-    unsigned char buf[4097]; // has to be bigger than the on-chip buffer
-    ftdi_read_data(&ftdic, buf, sizeof(buf));
+    int return_value;
+
+    if ((return_value = ftdi_write_data(&ftdic, &stopCode, 1)) > 0) {
+        unsigned char buf[4097]; // has to be bigger than the on-chip buffer
+        ftdi_read_data(&ftdic, buf, sizeof(buf));
+        closeUSB();
+    }
+
+    return true;
 }
 
 
@@ -150,6 +166,7 @@ bool IntanThread::updateBuffer()
     //  >0  : number of bytes read
     if ((bytes_read = ftdi_read_data(&ftdic, buffer, sizeof(buffer))) < 0)
     {
+        std::cout << "NO DATA FOUND!" << std::endl;
         return false;
     }
 
diff --git a/Source/Processors/DataThreads/IntanThread.h b/Source/Processors/DataThreads/IntanThread.h
index 557e08d957173166c10863a865469127672b520a..6b9bb8ee4da2d4b992ed12b5a4e2356418ef0626 100644
--- a/Source/Processors/DataThreads/IntanThread.h
+++ b/Source/Processors/DataThreads/IntanThread.h
@@ -16,11 +16,13 @@
 #include <stdio.h>
 #include "DataThread.h"
 
+class SourceNode;
+
 class IntanThread : public DataThread
 
 {
 public:
-	IntanThread();
+	IntanThread(SourceNode* sn);
 	~IntanThread();
 
 	bool foundInputSource();
diff --git a/Source/Processors/DataThreads/NetworkThread.cpp b/Source/Processors/DataThreads/NetworkThread.cpp
index 25a1e7a4288cf423e0949e29401c1142543d5058..d02538c25997839a77865a393305e44d6c4935f3 100644
--- a/Source/Processors/DataThreads/NetworkThread.cpp
+++ b/Source/Processors/DataThreads/NetworkThread.cpp
@@ -10,7 +10,7 @@
 
 #include "NetworkThread.h"
 
-NetworkThread::NetworkThread() : DataThread()
+NetworkThread::NetworkThread(SourceNode* sn) : DataThread(sn)
 {
 	char host[] = "10.121.43.47";
 	char port[] = "5227";
diff --git a/Source/Processors/DataThreads/NetworkThread.h b/Source/Processors/DataThreads/NetworkThread.h
index 65ab10c5c0138926c68cead4c93b05b0754fb400..e1989bdb8d015fbc7e1efc1373f5f7ba6aaef083 100644
--- a/Source/Processors/DataThreads/NetworkThread.h
+++ b/Source/Processors/DataThreads/NetworkThread.h
@@ -25,7 +25,7 @@ class NetworkThread : public DataThread
 {
 public:
 
-	NetworkThread();
+	NetworkThread(SourceNode* sn);
 	~NetworkThread();
 
 	bool foundInputSource() {return true;}
diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp
index b478fa9d986731b2445749a3de070738361135a7..13e6d78b4274db3b6cbd29898841091f31f5ea2d 100644
--- a/Source/Processors/ProcessorGraph.cpp
+++ b/Source/Processors/ProcessorGraph.cpp
@@ -113,6 +113,7 @@ void* ProcessorGraph::createNewProcessor(String& description)//,
 		processor->setFilterViewport(filterViewport);
 		processor->setConfiguration(config);
 		processor->addActionListener(messageCenter);
+		processor->setUIComponent(UI);
 
 		addNode(processor,id); // have to add it so it can be deleted by the graph
 
diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp
index 7b81329da15958d1f5888c3030b0668e9a2580e3..ef09b9c3c702e6a1fc3234517e98efae69853f66 100644
--- a/Source/Processors/SourceNode.cpp
+++ b/Source/Processors/SourceNode.cpp
@@ -19,11 +19,11 @@ SourceNode::SourceNode(const String& name_)
 	  sourceCheckInterval(1500)
 {
 	if (getName().equalsIgnoreCase("Intan Demo Board")) {
-		dataThread = new IntanThread();
+		dataThread = new IntanThread(this);
 	} else if (getName().equalsIgnoreCase("Custom FPGA")) {
-		dataThread = new FPGAThread();
+		dataThread = new FPGAThread(this);
 	} else if (getName().equalsIgnoreCase("File Reader")) {
-		dataThread = new FileReaderThread();
+		dataThread = new FileReaderThread(this);
 	}
 
 	setNumInputs(0);
@@ -211,6 +211,15 @@ bool SourceNode::disable() {
 	return true;
 }
 
+void SourceNode::acquisitionStopped()
+{
+	std::cout << "Source node sending signal to UI." << std::endl;
+	UI->disableCallbacks();
+	enabledState(false);
+	GenericEditor* ed = (GenericEditor*) getEditor();
+	viewport->updateVisibleEditors(ed, 4);
+}
+
 
 void SourceNode::process(AudioSampleBuffer &outputBuffer, 
                             MidiBuffer &midiMessages,
diff --git a/Source/Processors/SourceNode.h b/Source/Processors/SourceNode.h
index 40cad49f459c397d4ab743e7a34af33c5c27cda4..5605d2c49a369455f700c31302680f87d47d56b5 100644
--- a/Source/Processors/SourceNode.h
+++ b/Source/Processors/SourceNode.h
@@ -19,6 +19,7 @@
 #include "DataThreads/FPGAThread.h"
 #include "DataThreads/FileReaderThread.h"
 #include "GenericProcessor.h"
+#include "../UI/UIComponent.h"
 
 class SourceNode : public GenericProcessor,
 				   public Timer
@@ -54,6 +55,8 @@ public:
 	bool disable();
 
 	bool isSource() {return true;}
+
+	void acquisitionStopped();
 	
 private:
 
diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp
index 70167f3ae72e7ca8b1c45ce5ab2dfa5fa63fd0c8..acec62bad96153ddc12277ddfb1994fee002b0ff 100644
--- a/Source/UI/ControlPanel.cpp
+++ b/Source/UI/ControlPanel.cpp
@@ -268,6 +268,24 @@ void ControlPanel::buttonClicked(Button* button)
 
 }
 
+void ControlPanel::disableCallbacks()
+{
+
+	std::cout << "Control panel received signal to disable callbacks." << std::endl;
+
+	if (audio->callbacksAreActive())
+	{
+		std::cout << "Stopping audio." << std::endl;
+		audio->endCallbacks();
+		std::cout << "Disabling processors." << std::endl;
+		graph->disableProcessors();
+		std::cout << "Updating control panel." << std::endl;
+		cpuMeter->updateCPU(0.0f);
+		playButton->setToggleState(false,false);
+		recordButton->setToggleState(false,false);
+	}
+}
+
 void ControlPanel::actionListenerCallback(const String & msg)
 {
 	//std::cout << "Message Received." << std::endl;
diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h
index 32c37a627d0b0fc9c026283e51a9ae053b25c965..5a2fbce0e8f7fdb0362bc902a721c4649ec47bac 100644
--- a/Source/UI/ControlPanel.h
+++ b/Source/UI/ControlPanel.h
@@ -86,6 +86,8 @@ public:
 	ControlPanel(ProcessorGraph* graph, AudioComponent* audio);
 	~ControlPanel();
 
+	void disableCallbacks();
+
 private:	
 	PlayButton* playButton;
 	RecordButton* recordButton;
diff --git a/Source/UI/UIComponent.cpp b/Source/UI/UIComponent.cpp
index 8e0259b9bf465108ed20568e4efffa9fbcc6b3b3..8a9879abfc05613e824ae93988419ca78e45e073 100644
--- a/Source/UI/UIComponent.cpp
+++ b/Source/UI/UIComponent.cpp
@@ -45,6 +45,7 @@ UIComponent::UIComponent (ProcessorGraph* pgraph, AudioComponent* audio_)
 
 	messageCenter = new MessageCenter();
 	processorGraph->addActionListener(messageCenter);
+	addActionListener(messageCenter);
 	addAndMakeVisible(messageCenter);
 
 	std::cout << "Created message center." << std::endl;
@@ -100,4 +101,10 @@ void UIComponent::resized()
 	if (messageCenter != 0)
 		messageCenter->setBounds(40,h-40,w-160,30);
 
+}
+
+void UIComponent::disableCallbacks()
+{
+	//sendActionMessage("Data acquisition terminated.");
+	controlPanel->disableCallbacks();
 }
\ No newline at end of file
diff --git a/Source/UI/UIComponent.h b/Source/UI/UIComponent.h
index 2a9ecf1e1ad6b735f745044b355ef7fe0893b435..226cd657a4765f85ec8f22e19962fe5e071ba117 100644
--- a/Source/UI/UIComponent.h
+++ b/Source/UI/UIComponent.h
@@ -25,7 +25,7 @@
 
 
 class UIComponent : public Component,
-				    //public ActionBroadcaster,
+				    public ActionBroadcaster,
 				    public DragAndDropContainer // required for 
 				    				            // drag-and-drop
 				    				            // internal components
@@ -40,6 +40,7 @@ public:
 	Configuration* getConfiguration() {return config;}
 
 	//void transmitMessage(const String& message);
+	void disableCallbacks();
 
 private: