diff --git a/Builds/MacOSX/OpenEphys.xcworkspace/contents.xcworkspacedata b/Builds/MacOSX/OpenEphys.xcworkspace/contents.xcworkspacedata
index 5d8052eabbb449c5e96f401bc8cf8b5d3799ace4..0a9ef155f588a09c06f0262dbffa8d353a84a3a2 100644
--- a/Builds/MacOSX/OpenEphys.xcworkspace/contents.xcworkspacedata
+++ b/Builds/MacOSX/OpenEphys.xcworkspace/contents.xcworkspacedata
@@ -35,9 +35,6 @@
       <FileRef
          location = "group:FilterNode/FilterNode.xcodeproj">
       </FileRef>
-      <FileRef
-         location = "group:JuliaProcessor/JuliaProcessor.xcodeproj">
-      </FileRef>
       <FileRef
          location = "group:KWIKFormat/KWIKFormat.xcodeproj">
       </FileRef>
diff --git a/Builds/MacOSX/Plugins/CommonLibs/OpenEphysHDF5/OpenEphysHDF5.xcodeproj/project.pbxproj b/Builds/MacOSX/Plugins/CommonLibs/OpenEphysHDF5/OpenEphysHDF5.xcodeproj/project.pbxproj
index c9f7a595569757a7c9a5cf1278259df5f460ffe4..0b89c3ba44f34809442761dc1fdfeb0136e63dd9 100644
--- a/Builds/MacOSX/Plugins/CommonLibs/OpenEphysHDF5/OpenEphysHDF5.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/Plugins/CommonLibs/OpenEphysHDF5/OpenEphysHDF5.xcodeproj/project.pbxproj
@@ -174,6 +174,7 @@
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(MAC_PACKAGE_DIR)/include",
+					"$(MAC_PACKAGE_DIR)/lib/hdf5-18/include",
 				);
 				OTHER_LDFLAGS = (
 					"$(inherited)",
@@ -191,6 +192,7 @@
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(MAC_PACKAGE_DIR)/include",
+					"$(MAC_PACKAGE_DIR)/lib/hdf5-18/include",
 				);
 				OTHER_LDFLAGS = (
 					"$(inherited)",
diff --git a/Builds/MacOSX/Plugins/Config/Plugin.xcconfig b/Builds/MacOSX/Plugins/Config/Plugin.xcconfig
index a89db7a4d36ce2c2db5e7ee151b415445ac5aff2..462d0672692ffd03910ff8ee09cb9ca9b2a22853 100644
--- a/Builds/MacOSX/Plugins/Config/Plugin.xcconfig
+++ b/Builds/MacOSX/Plugins/Config/Plugin.xcconfig
@@ -5,6 +5,8 @@ MAC_PACKAGE_DIR = /opt/local
 // Pull in machine-specific settings from git-ignored file, if it exists.
 #include "Env.xcconfig"
 
+#include "Base.xcconfig"
+
 CONFIGURATION_BUILD_DIR = $(PROJECT_DIR)/../../build/$(CONFIGURATION)/open-ephys.app/Contents/PlugIns
 COPY_PHASE_STRIP = NO
 DEBUG_INFORMATION_FORMAT = dwarf
diff --git a/Builds/MacOSX/Plugins/KWIKFormat/KWIKFormat.xcodeproj/project.pbxproj b/Builds/MacOSX/Plugins/KWIKFormat/KWIKFormat.xcodeproj/project.pbxproj
index 85bdb247c8f2bd8aac6c6284fa93e6ccc1fdd68f..3a834b9835753875aea507d55d18bc183d6c7a28 100644
--- a/Builds/MacOSX/Plugins/KWIKFormat/KWIKFormat.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/Plugins/KWIKFormat/KWIKFormat.xcodeproj/project.pbxproj
@@ -197,6 +197,15 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = E1F558DB1C9B23830035F88B /* Plugin_Debug.xcconfig */;
 			buildSettings = {
+				HEADER_SEARCH_PATHS = (
+					../../../../JuceLibraryCode,
+					../../../../JuceLibraryCode/modules,
+					../../../../Source/Plugins/Headers,
+					../../../../Source/Plugins/CommonLibs,
+					"$(MAC_PACKAGE_DIR)/lib/hdf5-18/include",
+					"$(MAC_PACKAGE_DIR)/include",
+					"$(inherited)",
+				);
 			};
 			name = Debug;
 		};
@@ -204,6 +213,15 @@
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = E1F558DC1C9B23830035F88B /* Plugin_Release.xcconfig */;
 			buildSettings = {
+				HEADER_SEARCH_PATHS = (
+					../../../../JuceLibraryCode,
+					../../../../JuceLibraryCode/modules,
+					../../../../Source/Plugins/Headers,
+					../../../../Source/Plugins/CommonLibs,
+					"$(MAC_PACKAGE_DIR)/lib/hdf5-18/include",
+					"$(MAC_PACKAGE_DIR)/include",
+					"$(inherited)",
+				);
 			};
 			name = Release;
 		};
diff --git a/Source/Processors/Channel/InfoObjects.cpp b/Source/Processors/Channel/InfoObjects.cpp
index 7c0151dd243810ed7936d42ce2b5ecd903ff3a47..c49d4b8923f15e113ef2c3cd05f69599bdd73f2c 100644
--- a/Source/Processors/Channel/InfoObjects.cpp
+++ b/Source/Processors/Channel/InfoObjects.cpp
@@ -34,6 +34,9 @@ NodeInfoBase::NodeInfoBase(uint16 id) :
 	m_nodeID(id)
 {}
 
+NodeInfoBase::~NodeInfoBase()
+{}
+
 unsigned int NodeInfoBase::getCurrentNodeID() const
 {
 	return m_nodeID;
@@ -50,6 +53,9 @@ String NodeInfoBase::getCurrentNodeName() const
 }
 
 //History Object
+HistoryObject::~HistoryObject()
+{}
+
 String HistoryObject::getHistoricString()
 {
 	return m_historicString;
@@ -73,6 +79,9 @@ SourceProcessorInfo::SourceProcessorInfo(const GenericProcessor* source, uint16
 {
 }
 
+SourceProcessorInfo::~SourceProcessorInfo()
+{}
+
 uint16 SourceProcessorInfo::getSourceNodeID() const
 {
 	return m_sourceNodeID;
@@ -99,6 +108,9 @@ uint16 SourceProcessorInfo::getSourceSubprocessorCount() const
 }
 
 //NamedInfoObject
+NamedInfoObject::~NamedInfoObject()
+{}
+
 void NamedInfoObject::setName(String name)
 {
 	m_name = name;
@@ -139,6 +151,9 @@ InfoObjectCommon::InfoObjectCommon(uint16 idx, uint16 typeidx, float sampleRate,
 {
 }
 
+InfoObjectCommon::~InfoObjectCommon()
+{}
+
 float InfoObjectCommon::getSampleRate() const
 {
 	return m_sampleRate;
@@ -542,6 +557,9 @@ ConfigurationObject::ConfigurationObject(String identifier, GenericProcessor* so
 	setIdentifier(identifier);
 }
 
+ConfigurationObject::~ConfigurationObject()
+{}
+
 void ConfigurationObject::setShouldBeRecorded(bool status)
 {
 	m_shouldBeRecorded = status;
diff --git a/Source/Processors/Channel/InfoObjects.h b/Source/Processors/Channel/InfoObjects.h
index c69b9290521d960443175f88c2fd2d3066cf4724..a3e1679b52941ab288494aa98d7b47c58ca6248b 100644
--- a/Source/Processors/Channel/InfoObjects.h
+++ b/Source/Processors/Channel/InfoObjects.h
@@ -47,6 +47,7 @@ class PLUGIN_API NodeInfoBase
 	//This field should never be changed by anything except GenericProcessor base code
 	friend class GenericProcessor;
 public:
+    virtual ~NodeInfoBase();
 	/** Gets the ID of the processor which currently owns this copy of the info object */
 	unsigned int getCurrentNodeID() const;
 	/** Gets the type of the processor which currently owns this copy of the info object */
@@ -68,6 +69,7 @@ protected:
 	HistoryObject();
 
 public:
+    virtual ~HistoryObject();
 	/** Returns the historic string */
 	String getHistoricString();
 	/** Adds a new entry in the historic string*/
@@ -83,6 +85,7 @@ protected:
 	SourceProcessorInfo(const GenericProcessor* source, uint16 subproc = 0);
 
 public:
+    virtual ~SourceProcessorInfo();
 	/** Gets the ID of the processor which created the channel object */
 	uint16 getSourceNodeID() const;
 
@@ -111,6 +114,7 @@ private:
 class PLUGIN_API NamedInfoObject
 {
 public:
+    virtual ~NamedInfoObject();
 	/** Sets the object's name*/
 	void setName(String name);
 
@@ -145,6 +149,7 @@ protected:
 	InfoObjectCommon(uint16 idx, uint16 typeidx, float sampleRate, const GenericProcessor* source, uint16 subproc = 0);
 
 public:
+    virtual ~InfoObjectCommon();
 	enum InfoObjectType
 	{
 		DATA_CHANNEL,
@@ -201,7 +206,7 @@ public:
 	/** Copy constructor. */
 	DataChannel(const DataChannel& ch);
 
-	~DataChannel();
+	virtual ~DataChannel();
 
 	//--------- DATA GET / SET METHODS --------//
 
@@ -303,7 +308,7 @@ public:
 	*/
 	EventChannel(EventChannelTypes type, unsigned int numChannels, unsigned int dataLength, float sampleRate, GenericProcessor* source, uint16 subproc = 0);
 
-	~EventChannel();
+	virtual ~EventChannel();
 
 	EventChannelTypes getChannelType() const;
 
@@ -368,7 +373,7 @@ public:
 	*/
 	SpikeChannel(ElectrodeTypes type, GenericProcessor* source, const Array<const DataChannel*>& sourceChannels, uint16 subproc = 0);
 
-	~SpikeChannel();
+	virtual ~SpikeChannel();
 
 	ElectrodeTypes getChannelType() const;
 
@@ -431,6 +436,7 @@ public:
 	@param subproc Optional. The source subprocessor index
 	*/
 	ConfigurationObject(String identifier, GenericProcessor* source, uint16 subproc = 0);
+    virtual ~ConfigurationObject();
 
 	/** Sets if the configuration should be recorded or not.
 	Similar to the events, this does not prevent the configuration data to be recorded, but rather states
diff --git a/Source/Processors/Channel/MetaData.cpp b/Source/Processors/Channel/MetaData.cpp
index b1303c710d377dd7125a954bf22c58d40a759407..dc284d62116b9cedb60b0b4023bc0f3863d7023d 100644
--- a/Source/Processors/Channel/MetaData.cpp
+++ b/Source/Processors/Channel/MetaData.cpp
@@ -46,7 +46,7 @@ bool checkMetaDataType(MetaDataDescriptor::MetaDataTypes baseType)
 //MetaDataDescriptor
 
 MetaDataDescriptor::MetaDataDescriptor(MetaDataDescriptor::MetaDataTypes t, unsigned int length, String n, String d, String id)
-	: m_name(n), m_description(d), m_identifier(id), m_type(t), m_length(length)
+	: m_name(n), m_identifier(id), m_description(d), m_type(t), m_length(length)
 {}
 
 MetaDataDescriptor::~MetaDataDescriptor() {};
@@ -277,6 +277,8 @@ void MetaDataValue::setValue(const void* data)
 
 MetaDataInfoObject::MetaDataInfoObject() {}
 
+MetaDataInfoObject::~MetaDataInfoObject() {}
+
 void MetaDataInfoObject::addMetaData(MetaDataDescriptor* desc, MetaDataValue* val)
 {
 	if (desc->getType() != val->getDataType() || desc->getLength() != val->getDataLength())
@@ -335,6 +337,8 @@ int MetaDataInfoObject::findMetaData(MetaDataDescriptor::MetaDataTypes type, uns
 
 MetaDataEventObject::MetaDataEventObject() {}
 
+MetaDataEventObject::~MetaDataEventObject() {}
+
 void MetaDataEventObject::addEventMetaData(MetaDataDescriptor* desc)
 {
 	if (eventMetaDataLock)
@@ -400,6 +404,8 @@ size_t MetaDataEventObject::getMaxEventMetaDataSize() const
 //MetaDataEvent
 MetaDataEvent::MetaDataEvent() {}
 
+MetaDataEvent::~MetaDataEvent() {}
+
 int MetaDataEvent::getMetadataValueCount() const
 {
 	return m_metaDataValues.size();
diff --git a/Source/Processors/Channel/MetaData.h b/Source/Processors/Channel/MetaData.h
index a106e730e7fda2655773cd15b0438e493cad65de..7ecbb0b164667dd86e86ef57eebf310a3cea54f8 100644
--- a/Source/Processors/Channel/MetaData.h
+++ b/Source/Processors/Channel/MetaData.h
@@ -177,6 +177,7 @@ class PLUGIN_API MetaDataInfoObject
 protected:
 	MetaDataInfoObject();
 public:
+    virtual ~MetaDataInfoObject();
 	void addMetaData(MetaDataDescriptor* desc, MetaDataValue* val);
 	void addMetaData(const MetaDataDescriptor& desc, const MetaDataValue& val);
 	const MetaDataDescriptor* getMetaDataDescriptor(int index) const;
@@ -204,6 +205,7 @@ protected:
 class PLUGIN_API MetaDataEventObject : public MetaDataEventLock
 {
 public:
+    virtual ~MetaDataEventObject();
 	//This method will only work when creating the info object, but not for those copied down the chain
 	void addEventMetaData(MetaDataDescriptor* desc);
 	void addEventMetaData(const MetaDataDescriptor& desc);
@@ -224,6 +226,7 @@ protected:
 class PLUGIN_API MetaDataEvent
 {
 public:
+    virtual ~MetaDataEvent();
 	int getMetadataValueCount() const;
 	const MetaDataValue* getMetaDataValue(int index) const;
 protected:
diff --git a/Source/Processors/DataThreads/RhythmNode/RHD2000Thread.cpp b/Source/Processors/DataThreads/RhythmNode/RHD2000Thread.cpp
index 326b8951da778140f22bbddbe88453d332fea041..bbd62617f282afb2b5eeb7659ba1c6d59b568806 100644
--- a/Source/Processors/DataThreads/RhythmNode/RHD2000Thread.cpp
+++ b/Source/Processors/DataThreads/RhythmNode/RHD2000Thread.cpp
@@ -927,6 +927,7 @@ int RHD2000Thread::getNumDataOutputs(DataChannel::DataChannelTypes type, int sub
 			return 0;
 		}
 	}
+    return 0;
 }
 
 String RHD2000Thread::getChannelUnits(int chanIndex) const
diff --git a/Source/Processors/FileReader/FileReader.cpp b/Source/Processors/FileReader/FileReader.cpp
index be4b119e0e24df40d11789743707b45a480fde3b..ad197377efe0792223da6cb1397728da0f39f100 100644
--- a/Source/Processors/FileReader/FileReader.cpp
+++ b/Source/Processors/FileReader/FileReader.cpp
@@ -245,14 +245,14 @@ void FileReader::process (AudioSampleBuffer& buffer)
         {
             samplesToRead = stopSample - currentSample;
             if (samplesToRead > 0)
-                input->readData (readBuffer + samplesRead, samplesToRead);
+                input->readData (readBuffer + samplesRead * currentNumChannels, samplesToRead);
 
             input->seekTo (startSample);
             currentSample = startSample;
         }
         else
         {
-            input->readData (readBuffer + samplesRead, samplesToRead);
+            input->readData (readBuffer + samplesRead * currentNumChannels, samplesToRead);
 
             currentSample += samplesToRead;
         }
diff --git a/Source/Processors/GenericProcessor/GenericProcessor.cpp b/Source/Processors/GenericProcessor/GenericProcessor.cpp
index 65a96044183e1b6063b8acfce3e439cbb463bff6..0e41d7b4da3b03a0d54486a16549f160164a2daa 100755
--- a/Source/Processors/GenericProcessor/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor/GenericProcessor.cpp
@@ -477,7 +477,7 @@ void GenericProcessor::createEventChannels()
 		int nChans = events.size();
 		for (int i = 0; i < nChans; i++)
 		{
-			DefaultEventInfo& info = events[i];
+			const DefaultEventInfo& info = events[i];
 			if (info.type != EventChannel::INVALID && info.nChannels > 0 && info.length > 0)
 			{
 				EventChannel* chan = new EventChannel(info.type, info.nChannels, info.length, info.sampleRate, this, sub);
@@ -1263,7 +1263,7 @@ GenericProcessor::DefaultEventInfo::DefaultEventInfo()
 
 uint32 GenericProcessor::getProcessorFullId(uint16 sid, uint16 subid)
 {
-	return uint32(sid) << 16 + subid;
+	return (uint32(sid) << 16) + subid;
 }
 
 int64 GenericProcessor::getLastProcessedsoftwareTime() const