diff --git a/Source/Processors/DataThreads/RHD2000Thread.cpp b/Source/Processors/DataThreads/RHD2000Thread.cpp
index a3f714f105e27f6860559ab99440e0eb9f718a8b..ba0714ac243250ec0b9bff36d72d6b9d5d38c2b2 100644
--- a/Source/Processors/DataThreads/RHD2000Thread.cpp
+++ b/Source/Processors/DataThreads/RHD2000Thread.cpp
@@ -349,7 +349,7 @@ void RHD2000Thread::initializeBoard()
 
     bitfilename = executableDirectory;
     bitfilename += File::separatorString;
-    bitfilename += "rhd2000.bit";
+    bitfilename += evalBoard->isUSB3() ? "rhd2000_usb3.bit" : "rhd2000.bit";
 
     if (!uploadBitfile(bitfilename))
     {
@@ -597,13 +597,13 @@ void RHD2000Thread::scanPorts()
     int chipIdx = 0;
     for (hs = 0; hs < MAX_NUM_HEADSTAGES; ++hs)
     {
-        if ((tmpChipId[hs] > 0) && (enabledStreams.size() < MAX_NUM_DATA_STREAMS))
+        if ((tmpChipId[hs] > 0) && (enabledStreams.size() < MAX_NUM_DATA_STREAMS(evalBoard->isUSB3())))
         {
             chipId.set(chipIdx++,tmpChipId[hs]);
             //std::cout << "Enabling headstage on stream " << stream << std::endl;
             if (tmpChipId[hs] == CHIP_ID_RHD2164) //RHD2164
             {
-                if (enabledStreams.size() < MAX_NUM_DATA_STREAMS - 1)
+                if (enabledStreams.size() < MAX_NUM_DATA_STREAMS(evalBoard->isUSB3()) - 1)
                 {
                     enableHeadstage(hs,true,2,32);
                     chipId.set(chipIdx++,CHIP_ID_RHD2164_B);
@@ -1072,7 +1072,7 @@ bool RHD2000Thread::enableHeadstage(int hsNum, bool enabled, int nStr, int strCh
 
 void RHD2000Thread::updateBoardStreams()
 {
-    for (int i=0; i <  MAX_NUM_DATA_STREAMS; i++)
+    for (int i=0; i <  MAX_NUM_DATA_STREAMS(evalBoard->isUSB3()); i++)
     {
         if (i < enabledStreams.size())
         {
@@ -2055,7 +2055,7 @@ void RHDImpedanceMeasure::runImpedanceMeasurement()
 	int chOffset;
 
 	Array<int> enabledStreams;
-	for (stream = 0; stream < MAX_NUM_DATA_STREAMS; ++stream)
+	for (stream = 0; stream < MAX_NUM_DATA_STREAMS(board->evalBoard->isUSB3()); ++stream)
 	{
 		CHECK_EXIT;
 		if (board->evalBoard->isStreamEnabled(stream))
diff --git a/Source/Processors/DataThreads/RHD2000Thread.h b/Source/Processors/DataThreads/RHD2000Thread.h
index 7b6a5568d10023f30148a6fc4484d28277d70dec..c74fefd8adb6f4d18ec4659442bb22e4303ab8df 100644
--- a/Source/Processors/DataThreads/RHD2000Thread.h
+++ b/Source/Processors/DataThreads/RHD2000Thread.h
@@ -39,9 +39,12 @@
 #include "DataThread.h"
 #include "../GenericProcessor/GenericProcessor.h"
 
-#define MAX_NUM_DATA_STREAMS 8
+#define MAX_NUM_DATA_STREAMS_USB2 8
+#define MAX_NUM_DATA_STREAMS_USB3 16
 #define MAX_NUM_HEADSTAGES 8
 
+#define MAX_NUM_DATA_STREAMS(u3) (u3 ? MAX_NUM_DATA_STREAMS_USB3 : MAX_NUM_DATA_STREAMS_USB2)
+
 class SourceNode;
 class RHDHeadstage;
 class RHDImpedanceMeasure;
diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
index 0e24f8da2fb4580c8a6761143c3356ca83b591ec..fb302d3ce9f24855fa946d1bfc9446e77a13a132 100755
--- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
+++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
@@ -44,7 +44,7 @@ Rhd2000EvalBoard::Rhd2000EvalBoard()
 	dev = 0;
 	usb3 = false;
 
-    for (i = 0; i < MAX_NUM_DATA_STREAMS; ++i) {
+    for (i = 0; i < MAX_NUM_DATA_STREAMS_USB3; ++i) {
         dataStreamEnabled[i] = 0;
     }
 
@@ -1575,7 +1575,7 @@ void Rhd2000EvalBoard::resetFpga()
 
 bool Rhd2000EvalBoard::isStreamEnabled(int streamIndex)
 {
-  if (streamIndex < 0 || streamIndex > (MAX_NUM_DATA_STREAMS - 1))
+  if (streamIndex < 0 || streamIndex > (MAX_NUM_DATA_STREAMS_USB3 - 1))
     return false;
 
   return dataStreamEnabled[streamIndex];