diff --git a/Source/Plugins/PCIeRhythm/RHD2000Thread.cpp b/Source/Plugins/PCIeRhythm/RHD2000Thread.cpp
index bca61cce764ecd6ca1f442a218737559395b6875..1d4669b3089cff48cfd9d18efe40cbbd9812110e 100644
--- a/Source/Plugins/PCIeRhythm/RHD2000Thread.cpp
+++ b/Source/Plugins/PCIeRhythm/RHD2000Thread.cpp
@@ -248,7 +248,7 @@ Array<int> RHD2000Thread::getDACchannels()
 }
 bool RHD2000Thread::openBoard()
 {
-    if (evalBoard->open())
+    if (evalBoard->openBoard())
     {
         deviceFound = true;
     }
diff --git a/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.cpp b/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.cpp
index 87f3544cb0efb1c453a55b46a1d4c40800f59f5c..f351f1278bf772cafe928d4d76dc8c4babecae33 100644
--- a/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.cpp
+++ b/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.cpp
@@ -4,22 +4,43 @@
 #include <fstream>
 #include <queue>
 #include <cmath>
-#include <io.h>
-#include <fcntl.h>
 
 #ifdef _WIN32
+#include <io.h>
 #define Open _open
 #define Seek _lseek
 #define Read _read
 #define Write _write
 #define Close _close
+#define CONTROL_FILE "\\\\.\\xillybus_control_regs_16"
+#define STATUS_FILE "\\\\.\\xillybus_status_regs_16"
+#define FIFO_FILE "\\\\.\\xillybus_neural_data_32"
+#define AUXCMD1_FILE "\\\\.\\xillybus_auxcmd1_membank_16"
+#define AUXCMD2_FILE "\\\\.\\xillybus_auxcmd2_membank_16"
+#define AUXCMD3_FILE "\\\\.\\xillybus_auxcmd3_membank_16"
 #else
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #define Open open
 #define Seek lseek
 #define Read read
 #define Write write
 #define Close close
+#define CONTROL_FILE "/dev/xillybus_control_regs_16"
+#define STATUS_FILE "/dev/xillybus_status_regs_16"
+#define FIFO_FILE "/dev/xillybus_neural_data_32"
+#define AUXCMD1_FILE "/dev/xillybus_auxcmd1_membank_16"
+#define AUXCMD2_FILE "/dev/xillybus_auxcmd2_membank_16"
+#define AUXCMD3_FILE "/dev/xillybus_auxcmd3_membank_16"
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
 #endif
+#include <fcntl.h>
 
 #include "rhd2000datablock.h"
 using namespace PCIeRhythm;
@@ -51,21 +72,21 @@ rhd2000PCIe::~rhd2000PCIe()
 		Close(fidFIFO);
 }
 
-void rhd2000PCIe::writeRegister(controlAddr reg, int16_t value, int16_t mask)
+void rhd2000PCIe::writeRegister(controlAddr reg, uint16_t value, uint16_t mask)
 {
 	int regAddr = static_cast<int>(reg);
 
-	
 	if (Seek(fidControl, regAddr, SEEK_SET) < 0)
 	{
 		std::cerr << "Error seeking control to addr " << regAddr << std::endl;
 		return;
 	}
 
-	int16_t writeVal;
-	if (mask != 0xFFFF)
+	uint16_t writeVal;
+	uint16_t curVal = 0x1010; //an easily recognizable value, to distinguish it from an actual read value of zero
+	if ((mask & 0xFFFF) != 0xFFFF)
 	{
-		int16_t curVal;
+
 		int rd = Read(fidControl, &curVal, 2);
 		if (rd < 2)
 		{
@@ -88,9 +109,11 @@ void rhd2000PCIe::writeRegister(controlAddr reg, int16_t value, int16_t mask)
 		std::cerr << "Unsuccesful write to control addr " << regAddr << " code: " << wd << std::endl;
 		return;
 	}
+	printf("Written registry %X val: %X mask: %X\n original: %X written: %X\n", reg, value,
+		mask, curVal, writeVal);
 }
 
-int16_t rhd2000PCIe::readRegister(statusAddr reg) const
+uint16_t rhd2000PCIe::readRegister(statusAddr reg) const
 {
 	int16_t value = -1;
 	int regAddr = static_cast<int>(reg);
@@ -108,16 +131,16 @@ int16_t rhd2000PCIe::readRegister(statusAddr reg) const
 	return value;
 }
 
-bool rhd2000PCIe::open()
+bool rhd2000PCIe::openBoard()
 {
-	fidControl = Open("\\\\.\\xillybus_control_regs_16", O_RDWR | O_BINARY);
+	fidControl = Open(CONTROL_FILE, O_RDWR | O_BINARY);
 	if (fidControl < 0)
 	{
-		std::cerr << "Error opening control file" << std::endl;
+		std::cerr << "Error opening control file " << std::endl;
 		return false;
 	}
 
-	fidStatus = Open("\\\\.\\xillybus_status_regs_16", O_RDONLY | O_BINARY);
+	fidStatus = Open(STATUS_FILE, O_RDONLY | O_BINARY);
 	if (fidStatus < 0)
 	{
 		std::cerr << "Error opening status file" << std::endl;
@@ -132,10 +155,10 @@ bool rhd2000PCIe::open()
 
 bool rhd2000PCIe::openPipe()
 {
-	fidFIFO = Open("\\\\.\\xillybus_neural_data_32", O_RDONLY | O_BINARY);
+	fidFIFO = Open(FIFO_FILE, O_RDONLY | O_BINARY);
 	if (fidFIFO < 0)
 	{
-		std:cerr << "Error opening data FIFO" << std::endl;
+	std:cerr << "Error opening data FIFO" << std::endl;
 		return false;
 	}
 	std::cout << "Pipe opened" << std::endl;
@@ -206,7 +229,7 @@ void rhd2000PCIe::initialize()
 	enableDataStream(0, true);        // start with only one data stream enabled
 	for (i = 1; i < MAX_NUM_DATA_STREAMS; i++) {
 		enableDataStream(i, false);
-	}	
+	}
 }
 
 void rhd2000PCIe::resetBoard()
@@ -354,7 +377,7 @@ bool rhd2000PCIe::setSampleRate(AmplifierSampleRate newSampleRate)
 	while (isDcmProgDone() == false) {}
 
 	// Reprogram clock synthesizer
-	writeRegister(DataFreqPll, D+ ((M<<8)&0x7F00) + (O&0x00FF));
+	writeRegister(DataFreqPll, D + ((M << 8) & 0x7F00) + (O & 0x00FF));
 
 	// Wait for DataClkLocked = 1 before allowing data acquisition to continue
 	while (isDataClockLocked() == false) {}
@@ -447,13 +470,13 @@ void rhd2000PCIe::uploadCommandList(const vector<int> &commandList, AuxCmdSlot a
 	switch (auxCommandSlot)
 	{
 	case AuxCmd1:
-		devFile = "\\\\.\\xillybus_auxcmd1_membank_16";
+		devFile = AUXCMD1_FILE;
 		break;
 	case AuxCmd2:
-		devFile = "\\\\.\\xillybus_auxcmd2_membank_16";
+		devFile = AUXCMD2_FILE;
 		break;
 	case AuxCmd3:
-		devFile = "\\\\.\\xillybus_auxcmd3_membank_16";
+		devFile = AUXCMD3_FILE;
 		break;
 	default:
 		devFile = "";
@@ -467,7 +490,7 @@ void rhd2000PCIe::uploadCommandList(const vector<int> &commandList, AuxCmdSlot a
 	}
 	if (Seek(fidMem, bankPos, SEEK_SET) < 0)
 	{
-		std::cerr << "Error seeking auxcmd " << auxCommandSlot <<" to addr " << bankPos << std::endl;
+		std::cerr << "Error seeking auxcmd " << auxCommandSlot << " to addr " << bankPos << std::endl;
 		Close(fidMem);
 		return;
 	}
@@ -895,7 +918,8 @@ bool rhd2000PCIe::readRawDataBlock(unsigned char** bufferPtr, int nSamples)
 	}
 
 	do {
-		int nr = Read(fidFIFO, dataBuffer, numBytesToRead);
+		int nr = Read(fidFIFO, dataBuffer + numread, numBytesToRead - numread);
+
 
 		if (nr == 0)
 		{
@@ -916,12 +940,12 @@ bool rhd2000PCIe::readRawDataBlock(unsigned char** bufferPtr, int nSamples)
 /*
 void rhd2000PCIe::flush()
 {
-	int nr = 0;
-	do
-	{
-		nr = Read(fidFIFO, &dataBuffer, DATA_BUFFER_SIZE);
+int nr = 0;
+do
+{
+nr = Read(fidFIFO, &dataBuffer, DATA_BUFFER_SIZE);
 
-	} while (nr > 0);
+} while (nr > 0);
 
 }*/
 
@@ -934,6 +958,7 @@ bool rhd2000PCIe::readDataBlock(Rhd2000DataBlock *dataBlock, int nSamples)
 	unsigned int numread = 0;
 
 	numBytesToRead = 2 * dataBlock->calculateDataBlockSizeInWords(numDataStreams, nSamples);
+	std::cout << "To read: " << numBytesToRead << std::endl;
 
 	if (numBytesToRead > DATA_BUFFER_SIZE) {
 		cerr << "Error in rhd2000PCIe::readDataBlock: Data buffer size exceeded.  " <<
@@ -942,7 +967,7 @@ bool rhd2000PCIe::readDataBlock(Rhd2000DataBlock *dataBlock, int nSamples)
 	}
 
 	do {
-		int nr = Read(fidFIFO, dataBuffer, numBytesToRead);
+		int nr = Read(fidFIFO, dataBuffer + numread, numBytesToRead - numread);
 
 		if (nr == 0)
 		{
@@ -955,8 +980,9 @@ bool rhd2000PCIe::readDataBlock(Rhd2000DataBlock *dataBlock, int nSamples)
 			return false;
 		}
 		numread += nr;
+		std::cout << "Read: " << nr << " total: " << numread << " left: " << numBytesToRead - numread << std::endl;
 	} while (numread < numBytesToRead);
-	
+
 
 	dataBlock->fillFromUsbBuffer(dataBuffer, 0, numDataStreams, nSamples);
 
@@ -971,7 +997,7 @@ bool rhd2000PCIe::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &dataQue
 	int i;
 	unsigned int numread = 0;
 	Rhd2000DataBlock *dataBlock;
-	
+
 	if (nSamples < 1) nSamples = SAMPLES_PER_DATA_BLOCK_PCIE;
 
 	numWordsToRead = numBlocks * dataBlock->calculateDataBlockSizeInWords(numDataStreams, nSamples);
@@ -986,7 +1012,7 @@ bool rhd2000PCIe::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &dataQue
 	}
 
 	do {
-		int nr = Read(fidFIFO, dataBuffer, numBytesToRead);
+		int nr = Read(fidFIFO, dataBuffer + numread, numBytesToRead - numread);
 
 		if (nr == 0)
 		{
@@ -1015,4 +1041,4 @@ bool rhd2000PCIe::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &dataQue
 void rhd2000PCIe::setOuputSigs(int sigs)
 {
 	writeRegister(AuxOutputs, sigs);
-}
\ No newline at end of file
+}
diff --git a/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.h b/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.h
index a37fddcfaca3deae991cc3f1056611eac1bf5638..4de6ac73ecd23215f0e529d0d01615ce39c15e7f 100644
--- a/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.h
+++ b/Source/Plugins/PCIeRhythm/rhythm-api/rhd2000PCIe.h
@@ -71,7 +71,7 @@ namespace PCIeRhythm {
 			PortD
 		};
 
-		bool open();
+		bool openBoard();
 		void initialize();
 		void resetBoard();
 
@@ -157,8 +157,8 @@ namespace PCIeRhythm {
 		int dataStreamEnabled[MAX_NUM_DATA_STREAMS]; // 0 (disabled) or 1 (enabled), set for maximum stream number
 		vector<int> cableDelay;
 
-		void writeRegister(controlAddr reg, int16_t value, int16_t mask = 0xFFFF);
-		int16_t readRegister(statusAddr reg) const;
+		void writeRegister(controlAddr reg, uint16_t value, uint16_t mask = 0xFFFF);
+		uint16_t readRegister(statusAddr reg) const;
 
 		bool isDcmProgDone() const;
 		bool isDataClockLocked() const;