diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
index 44b95a50980b7ca4d12e40f97d5622433d57a4b8..0e24f8da2fb4580c8a6761143c3356ca83b591ec 100755
--- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
+++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp
@@ -170,7 +170,7 @@ bool Rhd2000EvalBoard::uploadFpgaBitfile(string filename)
     boardId = dev->GetWireOutValue(WireOutBoardId);
     boardVersion = dev->GetWireOutValue(WireOutBoardVersion);
 
-    if (boardId != RHYTHM_BOARD_ID) {
+    if (boardId != (usb3 ? RHYTHM_BOARD_ID_USB3 : RHYTHM_BOARD_ID_USB2)) {
         cerr << "FPGA configuration does not support Rhythm.  Incorrect board ID: " << boardId << endl;
         return(false);
     } else {
@@ -234,7 +234,7 @@ void Rhd2000EvalBoard::initialize()
     setDataSource(7, PortD2);
 
     enableDataStream(0, true);        // start with only one data stream enabled
-    for (i = 1; i < MAX_NUM_DATA_STREAMS; i++) {
+    for (i = 1; i < MAX_NUM_DATA_STREAMS(usb3); i++) {
         enableDataStream(i, false);
     }
 
@@ -846,7 +846,7 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource)
     int bitShift;
     OkEndPoint endPoint;
 
-    if (stream < 0 || stream > 7) {
+	if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS(usb3) - 1)) {
         cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl;
         return;
     }
@@ -884,6 +884,38 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource)
         endPoint = WireInDataStreamSel5678;
         bitShift = 12;
         break;
+	case 8:
+		endPoint = WireInDataStreamSel1234;
+		bitShift = 16;
+		break;
+	case 9:
+		endPoint = WireInDataStreamSel1234;
+		bitShift = 20;
+		break;
+	case 10:
+		endPoint = WireInDataStreamSel1234;
+		bitShift = 24;
+		break;
+	case 11:
+		endPoint = WireInDataStreamSel1234;
+		bitShift = 28;
+		break;
+	case 12:
+		endPoint = WireInDataStreamSel5678;
+		bitShift = 16;
+		break;
+	case 13:
+		endPoint = WireInDataStreamSel5678;
+		bitShift = 20;
+		break;
+	case 14:
+		endPoint = WireInDataStreamSel5678;
+		bitShift = 24;
+		break;
+	case 15:
+		endPoint = WireInDataStreamSel5678;
+		bitShift = 28;
+		break;
     }
 
     dev->SetWireInValue(endPoint, dataSource << bitShift, 0x000f << bitShift);
@@ -893,7 +925,7 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource)
 // Enable or disable one of the eight available USB data streams (0-7).
 void Rhd2000EvalBoard::enableDataStream(int stream, bool enabled)
 {
-    if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS - 1)) {
+    if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS(usb3) - 1)) {
         cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl;
         return;
     }
@@ -991,30 +1023,32 @@ void Rhd2000EvalBoard::enableDac(int dacChannel, bool enabled)
         return;
     }
 
+	UINT32 dacEnMask = usb3 ? 0x0400 : 0x0200;
+
     switch (dacChannel) {
     case 0:
-        dev->SetWireInValue(WireInDacSource1, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource1, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 1:
-        dev->SetWireInValue(WireInDacSource2, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource2, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 2:
-        dev->SetWireInValue(WireInDacSource3, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource3, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 3:
-        dev->SetWireInValue(WireInDacSource4, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource4, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 4:
-        dev->SetWireInValue(WireInDacSource5, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource5, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 5:
-        dev->SetWireInValue(WireInDacSource6, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource6, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 6:
-        dev->SetWireInValue(WireInDacSource7, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource7, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     case 7:
-        dev->SetWireInValue(WireInDacSource8, (enabled ? 0x0200 : 0x0000), 0x0200);
+		dev->SetWireInValue(WireInDacSource8, (enabled ? dacEnMask : 0x0000), dacEnMask);
         break;
     }
     dev->UpdateWireIns();
@@ -1054,35 +1088,37 @@ void Rhd2000EvalBoard::selectDacDataStream(int dacChannel, int stream)
         return;
     }
 
-    if (stream < 0 || stream > 9) {
+    if (stream < 0 || stream > MAX_NUM_DATA_STREAMS(usb3)) {
         cerr << "Error in Rhd2000EvalBoard::selectDacDataStream: stream out of range." << endl;
         return;
     }
 
+	UINT32 dacStreamMask = (usb3 ? 0x03e0 : 0x01e0);
+
     switch (dacChannel) {
     case 0:
-        dev->SetWireInValue(WireInDacSource1, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource1, stream << 5, dacStreamMask);
         break;
     case 1:
-        dev->SetWireInValue(WireInDacSource2, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource2, stream << 5, dacStreamMask);
         break;
     case 2:
-        dev->SetWireInValue(WireInDacSource3, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource3, stream << 5, dacStreamMask);
         break;
     case 3:
-        dev->SetWireInValue(WireInDacSource4, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource4, stream << 5, dacStreamMask);
         break;
     case 4:
-        dev->SetWireInValue(WireInDacSource5, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource5, stream << 5, dacStreamMask);
         break;
     case 5:
-        dev->SetWireInValue(WireInDacSource6, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource6, stream << 5, dacStreamMask);
         break;
     case 6:
-        dev->SetWireInValue(WireInDacSource7, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource7, stream << 5, dacStreamMask);
         break;
     case 7:
-        dev->SetWireInValue(WireInDacSource8, stream << 5, 0x01e0);
+		dev->SetWireInValue(WireInDacSource8, stream << 5, dacStreamMask);
         break;
     }
     dev->UpdateWireIns();
diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h
index f52bda3bb830965fef159add10eba62066b60c21..75438d52abe2ae2f3506a7d696450e9463dd42be 100755
--- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h
+++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h
@@ -22,10 +22,14 @@
 #define RHD2000EVALBOARD_H
 
 #define USB_BUFFER_SIZE 2560000
-#define RHYTHM_BOARD_ID 500
-#define MAX_NUM_DATA_STREAMS 8
+#define RHYTHM_BOARD_ID_USB2 500
+#define RHYTHM_BOARD_ID_USB3 600
+#define MAX_NUM_DATA_STREAMS_USB2 8
+#define MAX_NUM_DATA_STREAMS_USB3 16
 #define FIFO_CAPACITY_WORDS 67108864
 
+#define MAX_NUM_DATA_STREAMS(u3) ( u3 ? MAX_NUM_DATA_STREAMS_USB3 : MAX_NUM_DATA_STREAMS_USB2 )
+
 #define USB3_BLOCK_SIZE	512
 
 #include <queue>
@@ -167,7 +171,7 @@ private:
     okCFrontPanel *dev;
     AmplifierSampleRate sampleRate;
     int numDataStreams; // total number of data streams currently enabled
-    int dataStreamEnabled[MAX_NUM_DATA_STREAMS]; // 0 (disabled) or 1 (enabled)
+    int dataStreamEnabled[MAX_NUM_DATA_STREAMS_USB3]; // 0 (disabled) or 1 (enabled), set for maximum stream number
     vector<int> cableDelay;
 
     // Buffer for reading bytes from USB interface