diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index 2db986c5351a9a85601b27513d2968153817bd2b..62ff8476efe4ab5849a4891217b336837e5e9749 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -21,7 +21,7 @@ ifeq ($(CONFIG),Debug)
   CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O3 -export-dynamic -g -pg -std=c++0x
   CXXFLAGS += $(CFLAGS)
-  LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L/usr/local/include -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5
+  LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -L/usr/local/include -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp
   LDDEPS :=
   RESFLAGS :=  -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
   TARGET := open-ephys
@@ -42,7 +42,7 @@ ifeq ($(CONFIG),Release)
   CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -export-dynamic -g -pg -std=c++0x
   CXXFLAGS += $(CFLAGS)
-  LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5
+  LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt -pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp
   LDDEPS :=
   RESFLAGS :=  -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=0.3.1" -D "JUCE_APP_VERSION_HEX=0x301" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules
   TARGET := open-ephys-release
@@ -73,6 +73,10 @@ OBJECTS := \
   $(OBJDIR)/AudioComponent_521bd9c9.o \
   $(OBJDIR)/SpikeSortBoxes_e42a3d04.o \
   $(OBJDIR)/SpikeSorter_b8ed216c.o \
+  $(OBJDIR)/HDF5FileFormat_5dfd9ead.o \
+  $(OBJDIR)/OriginalRecording_b4d9221b.o \
+  $(OBJDIR)/RecordEngine_80ecff22.o \
+  $(OBJDIR)/HDF5Recording_8016ea1.o \
   $(OBJDIR)/SerialInput_855a46b1.o \
   $(OBJDIR)/FileReader_18023b0e.o \
   $(OBJDIR)/ChannelMappingNode_d9219b9c.o \
@@ -308,6 +312,26 @@ $(OBJDIR)/SpikeSorter_b8ed216c.o: ../../Source/Processors/SpikeSorter.cpp
 	@echo "Compiling SpikeSorter.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/HDF5FileFormat_5dfd9ead.o: ../../Source/Processors/HDF5FileFormat.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling HDF5FileFormat.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/OriginalRecording_b4d9221b.o: ../../Source/Processors/OriginalRecording.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling OriginalRecording.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/RecordEngine_80ecff22.o: ../../Source/Processors/RecordEngine.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling RecordEngine.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/HDF5Recording_8016ea1.o: ../../Source/Processors/HDF5Recording.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling HDF5Recording.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/SerialInput_855a46b1.o: ../../Source/Processors/SerialInput.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling SerialInput.cpp"
diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
index 53047b91eea1de9fbcac27d6176b81f53de1a5d2..1e1c0c5813c9a721665a2a84495a511a90d4f872 100644
--- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
@@ -43,6 +43,10 @@
 		0AE243437B40602D35435C32 = {isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; };
 		A33C92B3D445EBC6C35E7ABA = {isa = PBXBuildFile; fileRef = 813CB9DFF788D612A0750FBF; };
 		51CE31A091584E6CD064C72B = {isa = PBXBuildFile; fileRef = E08826E22402792833879355; };
+		5B382D77C53D97FE3E35DE40 = {isa = PBXBuildFile; fileRef = BD8DA51AC4A1B20D6366A217; };
+		000A90A8BEF748F5E9DA669A = {isa = PBXBuildFile; fileRef = A7EBB338AA821C4682173A92; };
+		A1C35BD441B62D7A85B992DA = {isa = PBXBuildFile; fileRef = 736A9CDCA901E4DCBAB8FAF3; };
+		2AD581FF8BC72A69DB20E66F = {isa = PBXBuildFile; fileRef = 53F07F49B7B778C4000A8E1E; };
 		B89453078EB0A8107F39EDF3 = {isa = PBXBuildFile; fileRef = 86688D712937F3D08918C68B; };
 		F25EC78DCCC9CCEE805AE011 = {isa = PBXBuildFile; fileRef = 9215DC26F511C58DEE009209; };
 		EA6A1BDDF81818D516B93DD6 = {isa = PBXBuildFile; fileRef = 5654BDD4FBFF01AC3F17FA0D; };
@@ -522,6 +526,7 @@
 		5343D594AA7D444A7C6AD924 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; };
 		5379FC603780F30A2F05FE78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; };
 		53C8A2696FE4389E4AB4441C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; };
+		53F07F49B7B778C4000A8E1E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HDF5Recording.cpp; path = ../../Source/Processors/HDF5Recording.cpp; sourceTree = "SOURCE_ROOT"; };
 		54339ADDCB6F8E9E7721A986 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
 		5522973FA48A13C6BED293FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGenerator.cpp; path = ../../Source/Processors/SignalGenerator.cpp; sourceTree = "SOURCE_ROOT"; };
 		555D34D0CD8776EE5996CC3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorGraph.cpp; path = ../../Source/Processors/ProcessorGraph.cpp; sourceTree = "SOURCE_ROOT"; };
@@ -666,6 +671,7 @@
 		72C33BA70B9EE82E39F1EC6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MP3AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		72FCE41894123FC5DB01566B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_win32.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h"; sourceTree = "SOURCE_ROOT"; };
 		7346D1276C3289FD68C8592B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; };
+		736A9CDCA901E4DCBAB8FAF3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordEngine.cpp; path = ../../Source/Processors/RecordEngine.cpp; sourceTree = "SOURCE_ROOT"; };
 		7387114E34496F4606550863 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
 		73ACB7A051EDE5F676E35FFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		73C69D948D33899821536025 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -845,6 +851,7 @@
 		9731D54410B06C1000370316 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; };
 		97431963DB8D535DEDA9AD47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; };
 		97C4F046D88561EEE245BE99 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-05.png"; sourceTree = "SOURCE_ROOT"; };
+		981137AA9BBA8C88F12309E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HDF5FileFormat.h; path = ../../Source/Processors/HDF5FileFormat.h; sourceTree = "SOURCE_ROOT"; };
 		982E1A954C316920557F029C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9845DA251B15F22B355FC618 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; };
 		984BC60C0AFF3EDED692FA01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericEditor.h; path = ../../Source/Processors/Editors/GenericEditor.h; sourceTree = "SOURCE_ROOT"; };
@@ -917,6 +924,7 @@
 		A769611E9CBFC127AF5AFB0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A7875D5F8D2A632C99791002 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; };
 		A7D4C9E3ED3763847C087F46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.cpp; sourceTree = "SOURCE_ROOT"; };
+		A7EBB338AA821C4682173A92 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OriginalRecording.cpp; path = ../../Source/Processors/OriginalRecording.cpp; sourceTree = "SOURCE_ROOT"; };
 		A7FE538FF09AC8A58DE8F1BD = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-02.png"; sourceTree = "SOURCE_ROOT"; };
 		A8B4D80D55E48F50809DC5E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; };
 		A8FCE8FB1D47A14A8C65C35E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPosition.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h"; sourceTree = "SOURCE_ROOT"; };
@@ -934,6 +942,7 @@
 		ABA3FCD5D762336535D56D94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; };
 		AC116E6590D49AB2EF19CB9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLImage.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AC2CFF4DA5CE431FCC628BA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevI.cpp; path = ../../Source/Dsp/ChebyshevI.cpp; sourceTree = "SOURCE_ROOT"; };
+		AC54477CA9DA5FE827F3CB02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HDF5Recording.h; path = ../../Source/Processors/HDF5Recording.h; sourceTree = "SOURCE_ROOT"; };
 		ACA28D2B1FECD2C57F0250A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		ACAE4A2D65AAC6A36DA9DBCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		ACCACAE59079FDECF799BE8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1035,6 +1044,7 @@
 		BCBBF8764A2101CD0E91DB5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; };
 		BD1D02C70CCE095217581A5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
 		BD59A961F87AB628777894DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; };
+		BD8DA51AC4A1B20D6366A217 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HDF5FileFormat.cpp; path = ../../Source/Processors/HDF5FileFormat.cpp; sourceTree = "SOURCE_ROOT"; };
 		BDFF189EC742274DD2629196 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectangleList.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BE506F381B90833512348968 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BEC4B69320BE492526794DFB = {isa = PBXFileReference; lastKnownFileType = image.png; name = wifi.png; path = ../../Resources/Images/Icons/wifi.png; sourceTree = "SOURCE_ROOT"; };
@@ -1176,6 +1186,7 @@
 		DBCA7E2FFCFD1354DD19DDD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
 		DBED17FBB262C4DACEEDA9B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; };
 		DBF1FD9272546EE4C7DD517A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; };
+		DC142E23FA36B913A8560841 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OriginalRecording.h; path = ../../Source/Processors/OriginalRecording.h; sourceTree = "SOURCE_ROOT"; };
 		DC200873B263C55E82B5384D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; };
 		DCA17BBB4FC31AAE9DC34DE9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		DCF6696CA1463CD8557E1FFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V1.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1231,7 +1242,7 @@
 		E817F0471AF514FD075B5DB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SerialInput.h; path = ../../Source/Processors/SerialInput.h; sourceTree = "SOURCE_ROOT"; };
 		E835BEB3C42E4B241804BE13 = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-light-serialized"; path = "../../Resources/Fonts/cpmono-light-serialized"; sourceTree = "SOURCE_ROOT"; };
 		E8480C4ED7F9579F6172F7B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../Source/Dsp/Common.h; sourceTree = "SOURCE_ROOT"; };
-		E8964C0BE264A55753BC6B7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; };
+		E8FC70A6B665B9C1C7477680 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordEngine.h; path = ../../Source/Processors/RecordEngine.h; sourceTree = "SOURCE_ROOT"; };
 		E90FCB43DA2FF766597DA75E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Documentation.cpp; path = ../../Source/Dsp/Documentation.cpp; sourceTree = "SOURCE_ROOT"; };
 		E91923510CB2280C3A3B9E9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; };
 		E91A272EF06892937CB4B9CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1248,45 +1259,46 @@
 		EAB6A66678B122C578B16445 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; };
 		EAC262A83CD2BEA14542AE89 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; };
 		EAC7A64301F0BF2C5E33A1F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; };
-		EAEA49B9394D802B79CA8164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; };
-		EB5F9A50EB53A57D6AE303C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; };
 		EC780F52ABBD7317A5CE2F33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevI.h; path = ../../Source/Dsp/ChebyshevI.h; sourceTree = "SOURCE_ROOT"; };
 		ECA6FDB1366BE7EC30F1539B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNode.cpp; path = ../../Source/Processors/SourceNode.cpp; sourceTree = "SOURCE_ROOT"; };
+		F5A00ACFA3D76168F22F1205 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+		99E1BC08B886CFDD2CCFD462 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		E8964C0BE264A55753BC6B7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; };
+		EAEA49B9394D802B79CA8164 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; };
+		EB5F9A50EB53A57D6AE303C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; };
+		EBD8622EAEF10558809888B7 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; };
+		EC95A2CF4B33EA37DA5FC1AC = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; };
+		ECB5A75A81B90327F58CBD9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = "SOURCE_ROOT"; };
 		ECBEF88BBC974D96ED781C75 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; };
 		ECCE033FF2ACE42188FA4A7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; };
 		ECE3BE71EB6B9CF1CE869BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		ED86166920362E9D2BE2CB26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
+		ED887A521EEB8F3EBA7DDB31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; };
 		EDA209B0E7D124EA581023AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; };
 		EDAC82BD742A54182E8DF2FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; };
 		EE0336B43A39FD585DF638EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EE2C669B127D00C86B1B8CA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EE4DD055D31F7D9DC718DBD8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; };
 		EEA51B7EF1CF19028C6672E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+		EEFC66D2DF5FD66B4D83B22F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; };
 		EF059B26886B32000BCF8CFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; };
 		EF3F9AA8D70E1D4D55F13182 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EF4A6E0E1232071252ACCD7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; };
 		EF610B2A17D9B1C0D24DCE67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; };
 		EF7B66764093D950724EFE70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; };
-		F09FD6D9CA4997216ADBF54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; };
-		F0F3834D46EA8FC8ADB206DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F17DF27524262A21A3EC932D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F1A3975235880CAC1D5757F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F230A4C0186379F9EB0B0F74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; };
-		F28414731D9EE1F75D7B7043 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
-		F5A00ACFA3D76168F22F1205 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
-		99E1BC08B886CFDD2CCFD462 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		EBD8622EAEF10558809888B7 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; };
-		EC95A2CF4B33EA37DA5FC1AC = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; };
-		ECB5A75A81B90327F58CBD9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = "SOURCE_ROOT"; };
-		ED887A521EEB8F3EBA7DDB31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; };
-		EEFC66D2DF5FD66B4D83B22F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; };
 		EF8488936B3D3E9178C9099C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.h; sourceTree = "SOURCE_ROOT"; };
 		EFC21F3CD0EB87D67E044E06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		F09FD6D9CA4997216ADBF54F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; };
 		F0CA3600E09054D7DB3B0067 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SmoothedFilter.h; path = ../../Source/Dsp/SmoothedFilter.h; sourceTree = "SOURCE_ROOT"; };
 		F0D9A28C206D7A8BA7089D29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		F0F3834D46EA8FC8ADB206DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F1099BFF0BC1656A23D62E84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F10FB240E10A5742CE366A91 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; };
+		F17DF27524262A21A3EC932D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		F1A3975235880CAC1D5757F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F1DBAE92084D9D90234AC436 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; };
+		F230A4C0186379F9EB0B0F74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; };
+		F28414731D9EE1F75D7B7043 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		F2A500BA3500C4A9D5792A54 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; };
 		F2EDB88302B8A9356F43B834 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; };
 		F2F11D7C596DAE5579610CCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1573,6 +1585,14 @@
 					77D3770CCBB3EED01A854329,
 					E08826E22402792833879355,
 					63F87A626F56E94A02542174,
+					BD8DA51AC4A1B20D6366A217,
+					981137AA9BBA8C88F12309E3,
+					A7EBB338AA821C4682173A92,
+					DC142E23FA36B913A8560841,
+					736A9CDCA901E4DCBAB8FAF3,
+					E8FC70A6B665B9C1C7477680,
+					53F07F49B7B778C4000A8E1E,
+					AC54477CA9DA5FE827F3CB02,
 					86688D712937F3D08918C68B,
 					E817F0471AF514FD075B5DB7,
 					9215DC26F511C58DEE009209,
@@ -2785,6 +2805,7 @@
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+				OTHER_LDFLAGS = "-lhdf5";
 				SDKROOT_ppc = macosx10.5; }; name = Debug; };
 		7A6F9B742B69F66DC3E29FA8 = {isa = XCBuildConfiguration; buildSettings = {
 				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
@@ -2806,6 +2827,7 @@
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+				OTHER_LDFLAGS = "-lhdf5";
 				SDKROOT_ppc = macosx10.5; }; name = Release; };
 		C8018C9A4DA633CA60663294 = {isa = XCBuildConfiguration; buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
@@ -2870,6 +2892,10 @@
 					0AE243437B40602D35435C32,
 					A33C92B3D445EBC6C35E7ABA,
 					51CE31A091584E6CD064C72B,
+					5B382D77C53D97FE3E35DE40,
+					000A90A8BEF748F5E9DA669A,
+					A1C35BD441B62D7A85B992DA,
+					2AD581FF8BC72A69DB20E66F,
 					B89453078EB0A8107F39EDF3,
 					F25EC78DCCC9CCEE805AE011,
 					EA6A1BDDF81818D516B93DD6,
diff --git a/Builds/VisualStudio2012/copydlls.cmd b/Builds/VisualStudio2012/copydlls.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..384df0803ba9a0476bffa5b9fedbe96d5f61e88e
--- /dev/null
+++ b/Builds/VisualStudio2012/copydlls.cmd
@@ -0,0 +1,10 @@
+@echo off
+copy %2\okFrontPanel.dll %3
+copy %1\hdf5.dll %3
+copy %1\hdf5_cpp.dll %3
+copy %1\szip.dll %3
+copy %1\zlib.dll %3
+
+
+
+copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin
\ No newline at end of file
diff --git a/Builds/VisualStudio2012/open-ephys.sln b/Builds/VisualStudio2012/open-ephys.sln
index 470d172ea1d241cd434561b98343dda06702cf04..61074c0e04aebb4f1d48dd95b47ccd0a86ed9f09 100644
--- a/Builds/VisualStudio2012/open-ephys.sln
+++ b/Builds/VisualStudio2012/open-ephys.sln
@@ -1,31 +1,21 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.30723.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}"
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2012
+Project("{5A05F353-1D63-394C-DFB0-981BB2309002}") = "open-ephys", "open-ephys.vcxproj", "{9C924D66-7DEC-1AEF-B375-DB8666BFB909}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
-		Debug|x64 = Debug|x64
-		Debug64|Win32 = Debug64|Win32
-		Debug64|x64 = Debug64|x64
 		Release|Win32 = Release|Win32
-		Release|x64 = Release|x64
-		Release64|Win32 = Release64|Win32
+		Debug64|x64 = Debug64|x64
 		Release64|x64 = Release64|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.ActiveCfg = Debug|Win32
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|Win32.Build.0 = Debug|Win32
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug|x64.ActiveCfg = Debug|Win32
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|Win32.ActiveCfg = Debug64|x64
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.ActiveCfg = Debug64|x64
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.Build.0 = Debug64|x64
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.ActiveCfg = Release|Win32
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|Win32.Build.0 = Release|Win32
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release|x64.ActiveCfg = Release|Win32
-		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|Win32.ActiveCfg = Release64|x64
+		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.ActiveCfg = Debug64|x64
+		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Debug64|x64.Build.0 = Debug64|x64
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.ActiveCfg = Release64|x64
 		{9C924D66-7DEC-1AEF-B375-DB8666BFB909}.Release64|x64.Build.0 = Release64|x64
 	EndGlobalSection
diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj
index 916ed2f2d4dc85713c1adfe83e0e4d8397af2c98..14ed7842273bd6474165b7952f7e1e28b2ef49a5 100644
--- a/Builds/VisualStudio2012/open-ephys.vcxproj
+++ b/Builds/VisualStudio2012/open-ephys.vcxproj
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<?xml version="1.0" encoding="utf-8"?>
+
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -22,7 +23,7 @@
     <ProjectGuid>{9C924D66-7DEC-1AEF-B375-DB8666BFB909}</ProjectGuid>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
@@ -47,10 +48,11 @@
     <PlatformToolset>v110</PlatformToolset>
     <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings" />
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
+  <ImportGroup Label="ExtensionSettings"/>
   <ImportGroup Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')"
+            Label="LocalAppDataPlatform"/>
   </ImportGroup>
   <PropertyGroup Label="UserMacros">
     <PlatformToolset>v110</PlatformToolset>
@@ -60,20 +62,20 @@
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\bin\</OutDir>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">open-ephys</TargetName>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateManifest>
-    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib</LibraryPath>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\bin\</OutDir>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">open-ephys</TargetName>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>
-    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath);../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath);$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release</LibraryPath>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">.\Debug64\bin\</OutDir>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">open-ephys</TargetName>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">true</GenerateManifest>
-    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">$(LibraryPath);../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug</LibraryPath>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">$(LibraryPath);$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug</LibraryPath>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">.\Release64\bin\</OutDir>
     <TargetName Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">open-ephys</TargetName>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">true</GenerateManifest>
-    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">$(LibraryPath);../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release</LibraryPath>
-    <PlatformToolset>v120</PlatformToolset>
+    <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">$(LibraryPath);$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release</LibraryPath>
+    <PlatformToolset>v110</PlatformToolset>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
@@ -81,16 +83,16 @@
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetEnvironment>Win32</TargetEnvironment>
-      <HeaderFileName />
+      <HeaderFileName/>
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
-      <PrecompiledHeader />
+      <PrecompiledHeader/>
       <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation>
       <ObjectFileName>$(IntDir)\</ObjectFileName>
       <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName>
@@ -110,16 +112,16 @@
       <SubSystem>Windows</SubSystem>
       <TargetMachine>MachineX86</TargetMachine>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
-      <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Debug;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <LargeAddressAware>true</LargeAddressAware>
-      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <Bscmake>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile>
     </Bscmake>
     <PostBuildEvent>
-      <Command>copy ..\..\Resources\DLLs\okFrontPanel.dll .\Debug\bin</Command>
+      <Command>call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;</Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -128,21 +130,21 @@
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetEnvironment>Win32</TargetEnvironment>
-      <HeaderFileName />
+      <HeaderFileName/>
     </Midl>
     <ClCompile>
       <Optimization>Full</Optimization>
-      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
-      <PrecompiledHeader />
+      <PrecompiledHeader/>
       <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation>
       <ObjectFileName>$(IntDir)\</ObjectFileName>
       <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName>
       <WarningLevel>Level4</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
-      <MultiProcessorCompilation>false</MultiProcessorCompilation>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -157,16 +159,16 @@
       <TargetMachine>MachineX86</TargetMachine>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x86;../../Resources/Google Protocols/vsprojects/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <LargeAddressAware>true</LargeAddressAware>
-      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <Bscmake>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile>
     </Bscmake>
     <PostBuildEvent>
-      <Command>copy ..\..\Resources\DLLs\okFrontPanel.dll .\Release\bin</Command>
+      <Command>call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;</Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug64|x64'">
@@ -175,16 +177,16 @@
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetEnvironment>Win32</TargetEnvironment>
-      <HeaderFileName />
+      <HeaderFileName/>
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_WINDOWS;DEBUG;_DEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
-      <PrecompiledHeader />
+      <PrecompiledHeader/>
       <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation>
       <ObjectFileName>$(IntDir)\</ObjectFileName>
       <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName>
@@ -202,16 +204,16 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>$(IntDir)\open-ephys.pdb</ProgramDatabaseFile>
       <SubSystem>Windows</SubSystem>
-      <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <LargeAddressAware>true</LargeAddressAware>
-      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <Bscmake>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile>
     </Bscmake>
     <PostBuildEvent>
-      <Command>copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin</Command>
+      <Command>call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;</Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release64|x64'">
@@ -220,15 +222,15 @@
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TargetEnvironment>Win32</TargetEnvironment>
-      <HeaderFileName />
+      <HeaderFileName/>
     </Midl>
     <ClCompile>
       <Optimization>Full</Optimization>
-      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include;../../Resources/Google Protocols/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;NOMINMAX;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=0.3.1;JUCE_APP_VERSION_HEX=0x301;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
-      <PrecompiledHeader />
+      <PrecompiledHeader/>
       <AssemblerListingLocation>$(IntDir)\</AssemblerListingLocation>
       <ObjectFileName>$(IntDir)\</ObjectFileName>
       <ProgramDataBaseFileName>$(IntDir)\</ProgramDataBaseFileName>
@@ -248,133 +250,137 @@
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalLibraryDirectories>../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib;../../Resources/ZeroMQ/lib_x64;../../Resources/Google Protocols/vsprojects/x64/Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <LargeAddressAware>true</LargeAddressAware>
-      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>setupapi.lib;opengl32.lib;glu32.lib;szip.lib;zlib.lib;hdf5.lib;hdf5_cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <Bscmake>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <OutputFile>$(IntDir)\open-ephys.bsc</OutputFile>
     </Bscmake>
     <PostBuildEvent>
-      <Command>copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Release64\bin</Command>
+      <Command>call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;</Command>
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\Source\AccessClass.cpp" />
-    <ClCompile Include="..\..\Source\Network\PracticalSocket.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Bessel.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Biquad.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Butterworth.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Cascade.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\ChebyshevI.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\ChebyshevII.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Custom.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Design.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Documentation.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Elliptic.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Filter.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Legendre.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\Param.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\PoleFilter.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\RBJ.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp" />
-    <ClCompile Include="..\..\Source\Dsp\State.cpp" />
-    <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SpikeSortBoxes.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SerialInput.cpp" />
-    <ClCompile Include="..\..\Source\Processors\FileReader.cpp" />
-    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp" />
-    <ClCompile Include="..\..\Source\Processors\ReferenceNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\PhaseDetector.cpp" />
-    <ClCompile Include="..\..\Source\Processors\AudioResamplingNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Channel.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Serial\ofArduino.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp" />
-    <ClCompile Include="..\..\Source\Processors\EventDetector.cpp" />
-    <ClCompile Include="..\..\Source\Processors\FPGAOutput.cpp" />
-    <ClCompile Include="..\..\Source\Processors\ArduinoOutput.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Parameter.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\WiFiOutput.cpp" />
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp" />
-    <ClCompile Include="..\..\Source\Processors\AudioNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\EventNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\EcubeEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SpikeSorterEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SerialInputEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ElectrodeButtons.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\FPGAOutputEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ChannelSelector.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ParameterEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\VisualizerEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\MergerEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\ImageIcon.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\WiFiOutputEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\EventNodeEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\LfpDisplayEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SourceNodeEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SplitterEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\AudioEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\FilterEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\Editors\GenericEditor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Thread.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\FileReaderThread.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\FPGAThread.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\DataBuffer.cpp" />
-    <ClCompile Include="..\..\Source\Processors\DataThreads\DataThread.cpp" />
-    <ClCompile Include="..\..\Source\Processors\RecordNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SignalGenerator.cpp" />
-    <ClCompile Include="..\..\Source\Processors\ResamplingNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\FilterNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\SourceNode.cpp" />
-    <ClCompile Include="..\..\Source\Processors\GenericProcessor.cpp" />
-    <ClCompile Include="..\..\Source\Processors\ProcessorGraph.cpp" />
-    <ClCompile Include="..\..\Source\UI\EcubeDialogComponent.cpp" />
-    <ClCompile Include="..\..\Source\UI\CustomArrowButton.cpp" />
-    <ClCompile Include="..\..\Source\UI\GraphViewer.cpp" />
-    <ClCompile Include="..\..\Source\UI\EditorViewportButtons.cpp" />
-    <ClCompile Include="..\..\Source\UI\SignalChainManager.cpp" />
-    <ClCompile Include="..\..\Source\UI\EditorViewport.cpp" />
-    <ClCompile Include="..\..\Source\UI\ProcessorList.cpp" />
-    <ClCompile Include="..\..\Source\UI\CustomLookAndFeel.cpp" />
-    <ClCompile Include="..\..\Source\UI\InfoLabel.cpp" />
-    <ClCompile Include="..\..\Source\UI\DataViewport.cpp" />
-    <ClCompile Include="..\..\Source\UI\MessageCenter.cpp" />
-    <ClCompile Include="..\..\Source\UI\ControlPanel.cpp" />
-    <ClCompile Include="..\..\Source\UI\UIComponent.cpp" />
-    <ClCompile Include="..\..\Source\MainWindow.cpp" />
-    <ClCompile Include="..\..\Source\Main.cpp" />
+    <ClCompile Include="..\..\Source\AccessClass.cpp"/>
+    <ClCompile Include="..\..\Source\Network\PracticalSocket.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Bessel.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Biquad.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Butterworth.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Cascade.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\ChebyshevI.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\ChebyshevII.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Custom.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Design.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Documentation.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Elliptic.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Filter.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Legendre.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\Param.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\PoleFilter.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\RBJ.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/>
+    <ClCompile Include="..\..\Source\Dsp\State.cpp"/>
+    <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSortBoxes.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\HDF5FileFormat.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\OriginalRecording.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\RecordEngine.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\HDF5Recording.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SerialInput.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ReferenceNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PhaseDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\AudioResamplingNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Channel.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Serial\ofArduino.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\EventDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\FPGAOutput.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ArduinoOutput.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Parameter.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\WiFiOutput.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\EcubeEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SpikeSorterEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SerialInputEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ElectrodeButtons.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\FPGAOutputEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ChannelSelector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ParameterEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\VisualizerEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\MergerEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\ImageIcon.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\WiFiOutputEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\EventNodeEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpDisplayEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SourceNodeEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SplitterEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\AudioEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\FilterEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\GenericEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Thread.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\FileReaderThread.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\FPGAThread.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\DataBuffer.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\DataThreads\DataThread.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\RecordNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SignalGenerator.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ResamplingNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\FilterNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SourceNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\GenericProcessor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ProcessorGraph.cpp"/>
+    <ClCompile Include="..\..\Source\UI\EcubeDialogComponent.cpp"/>
+    <ClCompile Include="..\..\Source\UI\CustomArrowButton.cpp"/>
+    <ClCompile Include="..\..\Source\UI\GraphViewer.cpp"/>
+    <ClCompile Include="..\..\Source\UI\EditorViewportButtons.cpp"/>
+    <ClCompile Include="..\..\Source\UI\SignalChainManager.cpp"/>
+    <ClCompile Include="..\..\Source\UI\EditorViewport.cpp"/>
+    <ClCompile Include="..\..\Source\UI\ProcessorList.cpp"/>
+    <ClCompile Include="..\..\Source\UI\CustomLookAndFeel.cpp"/>
+    <ClCompile Include="..\..\Source\UI\InfoLabel.cpp"/>
+    <ClCompile Include="..\..\Source\UI\DataViewport.cpp"/>
+    <ClCompile Include="..\..\Source\UI\MessageCenter.cpp"/>
+    <ClCompile Include="..\..\Source\UI\ControlPanel.cpp"/>
+    <ClCompile Include="..\..\Source\UI\UIComponent.cpp"/>
+    <ClCompile Include="..\..\Source\MainWindow.cpp"/>
+    <ClCompile Include="..\..\Source\Main.cpp"/>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
@@ -1482,677 +1488,681 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_win32_QuickTimeMovieComponent.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp" />
-    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp" />
+    <ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp"/>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp"/>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\Source\AccessClass.h" />
-    <ClInclude Include="..\..\Source\Network\PracticalSocket.h" />
-    <ClInclude Include="..\..\Source\Dsp\Bessel.h" />
-    <ClInclude Include="..\..\Source\Dsp\Biquad.h" />
-    <ClInclude Include="..\..\Source\Dsp\Butterworth.h" />
-    <ClInclude Include="..\..\Source\Dsp\Cascade.h" />
-    <ClInclude Include="..\..\Source\Dsp\ChebyshevI.h" />
-    <ClInclude Include="..\..\Source\Dsp\ChebyshevII.h" />
-    <ClInclude Include="..\..\Source\Dsp\Common.h" />
-    <ClInclude Include="..\..\Source\Dsp\Custom.h" />
-    <ClInclude Include="..\..\Source\Dsp\Design.h" />
-    <ClInclude Include="..\..\Source\Dsp\Dsp.h" />
-    <ClInclude Include="..\..\Source\Dsp\Elliptic.h" />
-    <ClInclude Include="..\..\Source\Dsp\Filter.h" />
-    <ClInclude Include="..\..\Source\Dsp\Layout.h" />
-    <ClInclude Include="..\..\Source\Dsp\Legendre.h" />
-    <ClInclude Include="..\..\Source\Dsp\MathSupplement.h" />
-    <ClInclude Include="..\..\Source\Dsp\Params.h" />
-    <ClInclude Include="..\..\Source\Dsp\PoleFilter.h" />
-    <ClInclude Include="..\..\Source\Dsp\RBJ.h" />
-    <ClInclude Include="..\..\Source\Dsp\RootFinder.h" />
-    <ClInclude Include="..\..\Source\Dsp\SmoothedFilter.h" />
-    <ClInclude Include="..\..\Source\Dsp\State.h" />
-    <ClInclude Include="..\..\Source\Dsp\Types.h" />
-    <ClInclude Include="..\..\Source\Dsp\Utilities.h" />
-    <ClInclude Include="..\..\Source\Audio\AudioComponent.h" />
-    <ClInclude Include="..\..\Source\Processors\SpikeSortBoxes.h" />
-    <ClInclude Include="..\..\Source\Processors\SpikeSorter.h" />
-    <ClInclude Include="..\..\Source\Processors\SerialInput.h" />
-    <ClInclude Include="..\..\Source\Processors\FileReader.h" />
-    <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h" />
-    <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h" />
-    <ClInclude Include="..\..\Source\Processors\ReferenceNode.h" />
-    <ClInclude Include="..\..\Source\Processors\PhaseDetector.h" />
-    <ClInclude Include="..\..\Source\Processors\AudioResamplingNode.h" />
-    <ClInclude Include="..\..\Source\Processors\Channel.h" />
-    <ClInclude Include="..\..\Source\Processors\Serial\PulsePal.h" />
-    <ClInclude Include="..\..\Source\Processors\Serial\ofArduino.h" />
-    <ClInclude Include="..\..\Source\Processors\Serial\ofConstants.h" />
-    <ClInclude Include="..\..\Source\Processors\Serial\ofSerial.h" />
-    <ClInclude Include="..\..\Source\Processors\EventDetector.h" />
-    <ClInclude Include="..\..\Source\Processors\FPGAOutput.h" />
-    <ClInclude Include="..\..\Source\Processors\ArduinoOutput.h" />
-    <ClInclude Include="..\..\Source\Processors\Parameter.h" />
-    <ClInclude Include="..\..\Source\Processors\SpikeDisplayNode.h" />
-    <ClInclude Include="..\..\Source\Processors\WiFiOutput.h" />
-    <ClInclude Include="..\..\Source\Processors\LfpDisplayNode.h" />
-    <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h" />
-    <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h" />
-    <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\DataWindow.h" />
-    <ClInclude Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.h" />
-    <ClInclude Include="..\..\Source\Processors\SpikeDetector.h" />
-    <ClInclude Include="..\..\Source\Processors\AudioNode.h" />
-    <ClInclude Include="..\..\Source\Processors\EventNode.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\EcubeEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SpikeSorterEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SerialInputEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ElectrodeButtons.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\FPGAOutputEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ChannelSelector.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ParameterEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\VisualizerEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\MergerEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\ImageIcon.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\WiFiOutputEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\EventNodeEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\LfpDisplayEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SourceNodeEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SplitterEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\AudioEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\FilterEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\Editors\GenericEditor.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\EcubeThread.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\RHD2000Thread.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\FileReaderThread.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\FPGAThread.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\DataBuffer.h" />
-    <ClInclude Include="..\..\Source\Processors\DataThreads\DataThread.h" />
-    <ClInclude Include="..\..\Source\Processors\RecordNode.h" />
-    <ClInclude Include="..\..\Source\Processors\SignalGenerator.h" />
-    <ClInclude Include="..\..\Source\Processors\ResamplingNode.h" />
-    <ClInclude Include="..\..\Source\Processors\FilterNode.h" />
-    <ClInclude Include="..\..\Source\Processors\SourceNode.h" />
-    <ClInclude Include="..\..\Source\Processors\GenericProcessor.h" />
-    <ClInclude Include="..\..\Source\Processors\ProcessorGraph.h" />
-    <ClInclude Include="..\..\Source\UI\EcubeDialogComponent.h" />
-    <ClInclude Include="..\..\Source\UI\CustomArrowButton.h" />
-    <ClInclude Include="..\..\Source\UI\GraphViewer.h" />
-    <ClInclude Include="..\..\Source\UI\EditorViewportButtons.h" />
-    <ClInclude Include="..\..\Source\UI\SignalChainManager.h" />
-    <ClInclude Include="..\..\Source\UI\EditorViewport.h" />
-    <ClInclude Include="..\..\Source\UI\ProcessorList.h" />
-    <ClInclude Include="..\..\Source\UI\CustomLookAndFeel.h" />
-    <ClInclude Include="..\..\Source\UI\InfoLabel.h" />
-    <ClInclude Include="..\..\Source\UI\DataViewport.h" />
-    <ClInclude Include="..\..\Source\UI\MessageCenter.h" />
-    <ClInclude Include="..\..\Source\UI\ControlPanel.h" />
-    <ClInclude Include="..\..\Source\UI\UIComponent.h" />
-    <ClInclude Include="..\..\Source\MainWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiBuffer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiFile.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiKeyboardState.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessage.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessageSequence.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Decibels.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_IIRFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_LagrangeInterpolator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Reverb.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_AudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_BufferingAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ChannelRemappingAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_IIRFilterAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_MixerAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_PositionableAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ReverbAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioDeviceManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiInput.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiOutput.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioTransportSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDBurner.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDReader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReaderSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatWriter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioSubsectionReader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_BufferingAudioFormatReader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_MemoryMappedAudioFormatReader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_AiffAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_CoreAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_FlacAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_LAMEEncoderAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_MP3AudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_OggVorbisAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_QuickTimeAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WavAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WindowsMediaAudioFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\sampler\juce_Sampler.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPlayHead.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Common.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Headers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_KnownPluginList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginListComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioDeviceSelectorComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnail.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailBase.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharacterFunctions.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_ASCII.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF16.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF32.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF8.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_Identifier.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_LocalisedStrings.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_NewLine.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_String.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringArray.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPairArray.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPool.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringRef.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_TextDiff.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ByteOrder.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ContainerDeletePolicy.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_HeapBlock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_LeakedObjectDetector.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Memory.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_MemoryBlock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_OptionalScopedPointer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ReferenceCountedObject.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ScopedPointer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_SharedResourcePointer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Singleton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_WeakReference.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_AbstractFifo.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Array.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ArrayAllocationBase.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_DynamicObject.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ElementComparator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_HashMap.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_LinkedListPointer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_NamedValueSet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_OwnedArray.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_PropertySet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ReferenceCountedArray.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ScopedValueSetter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SortedSet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SparseSet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Variant.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ChildProcess.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_CriticalSection.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_DynamicLibrary.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_HighResolutionTimer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_InterProcessLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Process.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ReadWriteLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedReadLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedWriteLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_SpinLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Thread.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadLocalValue.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadPool.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_TimeSliceThread.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_WaitableEvent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_PerformanceCounter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_RelativeTime.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_Time.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_DirectoryIterator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_File.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileInputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileOutputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileSearchPath.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_MemoryMappedFile.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_TemporaryFile.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_WildcardFileFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_IPAddress.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_MACAddress.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_NamedPipe.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_Socket.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_URL.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_BufferedInputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_FileInputSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryInputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryOutputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_OutputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_TargetPlatform.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlDocument.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlElement.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_Javascript.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_JSON.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPCompressorOutputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPDecompressorInputStream.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_ZipFile.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\unit_tests\juce_UnitTest.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Result.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Uuid.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_WindowsRegistry.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_android_JNIHelpers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_BasicNativeHeaders.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_osx_ObjCHelpers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_SharedCode.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_win32_ComSmartPtr.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_BlowFish.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_Primes.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_RSAKey.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_MD5.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_SHA256.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_Value.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_ValueTree.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoableAction.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_ApplicationProperties.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_PropertiesFile.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_ApplicationBase.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_CallbackMessage.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_DeletedAtShutdown.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Initialisation.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionBroadcaster.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_AsyncUpdater.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeBroadcaster.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ListenerList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_ConnectedChildProcess.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnection.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_osx_MessageQueue.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ScopedXLock.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_HiddenMessageWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colour.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_ColourGradient.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colours.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_FillType.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_PixelFormats.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_GraphicsContext.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsContext.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_Image.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageCache.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageConvolutionKernel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageFileFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_AffineTransform.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_BorderSize.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_EdgeTable.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Line.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Path.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathIterator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathStrokeType.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Point.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Rectangle.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_RectangleList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_Justification.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_RectanglePlacement.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_AttributedString.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_CustomTypeface.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Font.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_GlyphArrangement.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_TextLayout.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Typeface.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_DropShadowEffect.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_GlowEffect.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_ImageEffectFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_RenderingHelpers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_CachedComponentImage.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Component.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ComponentListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Desktop.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ModalComponentManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_ComponentDragger.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropTarget.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_FileDragAndDropTarget.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_LassoComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseCursor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseEvent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInputSource.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TooltipClient.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_CaretComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyboardFocusTraverser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyPress.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_ModifierKeys.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_SystemClipboard.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextEditorKeyMapper.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextInputTarget.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ComboBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ImageComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Label.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ListBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ProgressBar.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Slider.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableHeaderComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableListBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TextEditor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Toolbar.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemFactory.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemPalette.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TreeView.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_AlertWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_CallOutBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ComponentPeer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DialogWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DocumentWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_NativeMessageBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ResizableWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ThreadWithProgressWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TooltipWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TopLevelWindow.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarModel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_PopupMenu.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPosition.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPositionBehaviours.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentAnimator.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBoundsConstrainer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBuilder.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentMovementWatcher.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ConcertinaPanel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_GroupComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_MultiDocumentPanel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableBorderComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableCornerComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableEdgeComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ScrollBar.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutResizerBar.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableObjectResizer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedButtonBar.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_Viewport.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ArrowButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_Button.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_DrawableButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_HyperlinkButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ImageButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ShapeButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_TextButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToggleButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToolbarButton.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_MarkerList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinate.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinatePositioner.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeParallelogram.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePoint.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePointPath.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeRectangle.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_Drawable.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableComposite.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableImage.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawablePath.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableRectangle.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableShape.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableText.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_BooleanPropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ButtonPropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ChoicePropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyPanel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_SliderPropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_TextPropertyComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V1.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V2.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V3.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsDisplayComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserListener.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooserDialogBox.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileListComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilenameComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilePreviewComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileSearchPathListComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileTreeComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_ImagePreviewComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_WildcardFileFilter.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandID.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandInfo.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandManager.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandTarget.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_KeyPressMappingSet.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_BubbleComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_DropShadower.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Application.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Initialisation.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_MultiTouchMapper.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeDocument.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\documents\juce_FileBasedDocument.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_NSViewComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_UIViewComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\lookandfeel\juce_OldSchoolLookAndFeel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_AppleRemote.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_ColourSelector.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_PreferencesPanel.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SplashScreen.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Draggable3DOrientation.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Matrix3D.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLContext.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLGraphicsContext.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLHelpers.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLImage.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLPixelFormat.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLRenderer.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLShaderProgram.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLTexture.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Quaternion.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Vector3D.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_MissingGLDefinitions.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_android.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_ios.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_linux.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_osx.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_win32.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGLExtensions.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_DirectShowComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_QuickTimeMovieComponent.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\capture\juce_CameraDevice.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h" />
-    <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h" />
+    <ClInclude Include="..\..\Source\AccessClass.h"/>
+    <ClInclude Include="..\..\Source\Network\PracticalSocket.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Bessel.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Biquad.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Butterworth.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Cascade.h"/>
+    <ClInclude Include="..\..\Source\Dsp\ChebyshevI.h"/>
+    <ClInclude Include="..\..\Source\Dsp\ChebyshevII.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Common.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Custom.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Design.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Dsp.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Elliptic.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Filter.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Layout.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Legendre.h"/>
+    <ClInclude Include="..\..\Source\Dsp\MathSupplement.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Params.h"/>
+    <ClInclude Include="..\..\Source\Dsp\PoleFilter.h"/>
+    <ClInclude Include="..\..\Source\Dsp\RBJ.h"/>
+    <ClInclude Include="..\..\Source\Dsp\RootFinder.h"/>
+    <ClInclude Include="..\..\Source\Dsp\SmoothedFilter.h"/>
+    <ClInclude Include="..\..\Source\Dsp\State.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Types.h"/>
+    <ClInclude Include="..\..\Source\Dsp\Utilities.h"/>
+    <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/>
+    <ClInclude Include="..\..\Source\Processors\SpikeSortBoxes.h"/>
+    <ClInclude Include="..\..\Source\Processors\SpikeSorter.h"/>
+    <ClInclude Include="..\..\Source\Processors\HDF5FileFormat.h"/>
+    <ClInclude Include="..\..\Source\Processors\OriginalRecording.h"/>
+    <ClInclude Include="..\..\Source\Processors\RecordEngine.h"/>
+    <ClInclude Include="..\..\Source\Processors\HDF5Recording.h"/>
+    <ClInclude Include="..\..\Source\Processors\SerialInput.h"/>
+    <ClInclude Include="..\..\Source\Processors\FileReader.h"/>
+    <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/>
+    <ClInclude Include="..\..\Source\Processors\ReferenceNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\PhaseDetector.h"/>
+    <ClInclude Include="..\..\Source\Processors\AudioResamplingNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\Channel.h"/>
+    <ClInclude Include="..\..\Source\Processors\Serial\PulsePal.h"/>
+    <ClInclude Include="..\..\Source\Processors\Serial\ofArduino.h"/>
+    <ClInclude Include="..\..\Source\Processors\Serial\ofConstants.h"/>
+    <ClInclude Include="..\..\Source\Processors\Serial\ofSerial.h"/>
+    <ClInclude Include="..\..\Source\Processors\EventDetector.h"/>
+    <ClInclude Include="..\..\Source\Processors\FPGAOutput.h"/>
+    <ClInclude Include="..\..\Source\Processors\ArduinoOutput.h"/>
+    <ClInclude Include="..\..\Source\Processors\Parameter.h"/>
+    <ClInclude Include="..\..\Source\Processors\SpikeDisplayNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\WiFiOutput.h"/>
+    <ClInclude Include="..\..\Source\Processors\LfpDisplayNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/>
+    <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/>
+    <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeSorterCanvas.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\DataWindow.h"/>
+    <ClInclude Include="..\..\Source\Processors\Visualization\LfpDisplayCanvas.h"/>
+    <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/>
+    <ClInclude Include="..\..\Source\Processors\AudioNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\EventNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\EcubeEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SpikeSorterEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SerialInputEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ElectrodeButtons.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\PulsePalOutputEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\FPGAOutputEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ArduinoOutputEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ChannelSelector.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ParameterEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SpikeDisplayEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\VisualizerEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\MergerEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\ImageIcon.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\WiFiOutputEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\EventNodeEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SignalGeneratorEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpDisplayEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SourceNodeEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SplitterEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\SpikeDetectorEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\AudioEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\FilterEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\GenericEditor.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\EcubeThread.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\okFrontPanelDLL.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000datablock.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000evalboard.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\rhythm-api\rhd2000registers.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\RHD2000Thread.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\FileReaderThread.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\FPGAThread.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\DataBuffer.h"/>
+    <ClInclude Include="..\..\Source\Processors\DataThreads\DataThread.h"/>
+    <ClInclude Include="..\..\Source\Processors\RecordNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\SignalGenerator.h"/>
+    <ClInclude Include="..\..\Source\Processors\ResamplingNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\FilterNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\SourceNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\GenericProcessor.h"/>
+    <ClInclude Include="..\..\Source\Processors\ProcessorGraph.h"/>
+    <ClInclude Include="..\..\Source\UI\EcubeDialogComponent.h"/>
+    <ClInclude Include="..\..\Source\UI\CustomArrowButton.h"/>
+    <ClInclude Include="..\..\Source\UI\GraphViewer.h"/>
+    <ClInclude Include="..\..\Source\UI\EditorViewportButtons.h"/>
+    <ClInclude Include="..\..\Source\UI\SignalChainManager.h"/>
+    <ClInclude Include="..\..\Source\UI\EditorViewport.h"/>
+    <ClInclude Include="..\..\Source\UI\ProcessorList.h"/>
+    <ClInclude Include="..\..\Source\UI\CustomLookAndFeel.h"/>
+    <ClInclude Include="..\..\Source\UI\InfoLabel.h"/>
+    <ClInclude Include="..\..\Source\UI\DataViewport.h"/>
+    <ClInclude Include="..\..\Source\UI\MessageCenter.h"/>
+    <ClInclude Include="..\..\Source\UI\ControlPanel.h"/>
+    <ClInclude Include="..\..\Source\UI\UIComponent.h"/>
+    <ClInclude Include="..\..\Source\MainWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioDataConverters.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_AudioSampleBuffer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\buffers\juce_FloatVectorOperations.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiBuffer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiFile.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiKeyboardState.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessage.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\midi\juce_MidiMessageSequence.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Decibels.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_IIRFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_LagrangeInterpolator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\effects\juce_Reverb.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_AudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_BufferingAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ChannelRemappingAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_IIRFilterAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_MixerAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_PositionableAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ReverbAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioDeviceManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiInput.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\midi_io\juce_MidiOutput.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioSourcePlayer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\sources\juce_AudioTransportSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDBurner.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\audio_cd\juce_AudioCDReader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_MidiDataConcatenator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatReaderSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioFormatWriter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_AudioSubsectionReader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_BufferingAudioFormatReader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\format\juce_MemoryMappedAudioFormatReader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_AiffAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_CoreAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_FlacAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_LAMEEncoderAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_MP3AudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_OggVorbisAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_QuickTimeAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WavAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\codecs\juce_WindowsMediaAudioFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPlayHead.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioPluginInstance.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorEditor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_AudioProcessorListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_GenericAudioProcessorEditor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\processors\juce_PluginDescription.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Common.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3Headers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VST3PluginFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTMidiEventList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_VSTPluginFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_KnownPluginList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginDirectoryScanner.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\scanning\juce_PluginListComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioDeviceSelectorComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnail.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailBase.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharacterFunctions.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_ASCII.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF16.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF32.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_CharPointer_UTF8.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_Identifier.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_LocalisedStrings.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_NewLine.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_String.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringArray.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPairArray.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringPool.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_StringRef.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\text\juce_TextDiff.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_BigInteger.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Expression.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_MathsFunctions.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Random.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\maths\juce_Range.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Atomic.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ByteOrder.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ContainerDeletePolicy.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_HeapBlock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_LeakedObjectDetector.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Memory.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_MemoryBlock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_OptionalScopedPointer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ReferenceCountedObject.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_ScopedPointer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_SharedResourcePointer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_Singleton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\memory\juce_WeakReference.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_AbstractFifo.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Array.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ArrayAllocationBase.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_DynamicObject.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ElementComparator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_HashMap.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_LinkedListPointer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_NamedValueSet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_OwnedArray.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_PropertySet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ReferenceCountedArray.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_ScopedValueSetter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SortedSet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_SparseSet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\containers\juce_Variant.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ChildProcess.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_CriticalSection.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_DynamicLibrary.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_HighResolutionTimer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_InterProcessLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Process.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ReadWriteLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedReadLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ScopedWriteLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_SpinLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_Thread.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadLocalValue.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_ThreadPool.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_TimeSliceThread.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\threads\juce_WaitableEvent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_PerformanceCounter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_RelativeTime.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\time\juce_Time.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_DirectoryIterator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_File.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileInputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileOutputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_FileSearchPath.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_MemoryMappedFile.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_TemporaryFile.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\files\juce_WildcardFileFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_IPAddress.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_MACAddress.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_NamedPipe.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_Socket.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\network\juce_URL.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_BufferedInputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_FileInputSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_InputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryInputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_MemoryOutputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_OutputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\streams\juce_SubregionStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_FileLogger.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\logging\juce_Logger.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_PlatformDefs.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_StandardHeader.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_SystemStats.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\system\juce_TargetPlatform.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlDocument.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\xml\juce_XmlElement.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_Javascript.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\javascript\juce_JSON.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPCompressorOutputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_GZIPDecompressorInputStream.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\zip\juce_ZipFile.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\unit_tests\juce_UnitTest.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Result.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_Uuid.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\misc\juce_WindowsRegistry.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_android_JNIHelpers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_BasicNativeHeaders.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_osx_ObjCHelpers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_SharedCode.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_win32_ComSmartPtr.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_core\juce_core.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_BlowFish.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_Primes.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\encryption\juce_RSAKey.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_MD5.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\hashing\juce_SHA256.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_Value.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\values\juce_ValueTree.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoableAction.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\undomanager\juce_UndoManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_ApplicationProperties.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\app_properties\juce_PropertiesFile.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_ApplicationBase.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_CallbackMessage.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_DeletedAtShutdown.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Initialisation.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_Message.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_MessageManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\messages\juce_NotificationType.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_MultiTimer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\timers\juce_Timer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ActionListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_AsyncUpdater.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeBroadcaster.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ChangeListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\broadcasters\juce_ListenerList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_ConnectedChildProcess.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnection.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\interprocess\juce_InterprocessConnectionServer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_osx_MessageQueue.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ScopedXLock.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_HiddenMessageWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_events\juce_events.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colour.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_ColourGradient.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_Colours.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_FillType.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\colour\juce_PixelFormats.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_GraphicsContext.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsContext.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsPostScriptRenderer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\contexts\juce_LowLevelGraphicsSoftwareRenderer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_Image.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageCache.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageConvolutionKernel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\images\juce_ImageFileFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_AffineTransform.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_BorderSize.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_EdgeTable.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Line.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Path.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathIterator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_PathStrokeType.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Point.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_Rectangle.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\geometry\juce_RectangleList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_Justification.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\placement\juce_RectanglePlacement.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_AttributedString.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_CustomTypeface.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Font.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_GlyphArrangement.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_TextLayout.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\fonts\juce_Typeface.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_DropShadowEffect.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_GlowEffect.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Component.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_Desktop.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\components\juce_ModalComponentManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_DragAndDropTarget.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_FileDragAndDropTarget.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_LassoComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseCursor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseEvent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInactivityDetector.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseInputSource.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_MouseListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_SelectedItemSet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TextDragAndDropTarget.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_CaretComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyboardFocusTraverser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_KeyPress.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_ModifierKeys.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_SystemClipboard.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextEditorKeyMapper.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\keyboard\juce_TextInputTarget.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ComboBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ImageComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Label.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ListBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ProgressBar.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Slider.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableHeaderComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TableListBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TextEditor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_Toolbar.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemFactory.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_ToolbarItemPalette.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\widgets\juce_TreeView.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_AlertWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_CallOutBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ComponentPeer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DialogWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_DocumentWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_NativeMessageBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ResizableWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_ThreadWithProgressWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TooltipWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\windows\juce_TopLevelWindow.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_MenuBarModel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPosition.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_AnimatedPositionBehaviours.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentAnimator.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBoundsConstrainer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentBuilder.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ComponentMovementWatcher.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ConcertinaPanel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_GroupComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_MultiDocumentPanel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableBorderComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableCornerComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ResizableEdgeComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_ScrollBar.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableLayoutResizerBar.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_StretchableObjectResizer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedButtonBar.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_TabbedComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\layout\juce_Viewport.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ArrowButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_Button.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_DrawableButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_HyperlinkButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ImageButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ShapeButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_TextButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToggleButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\buttons\juce_ToolbarButton.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_MarkerList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinate.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeCoordinatePositioner.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeParallelogram.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePoint.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativePointPath.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\positioning\juce_RelativeRectangle.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_Drawable.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableComposite.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableImage.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawablePath.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableRectangle.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableShape.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\drawables\juce_DrawableText.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_BooleanPropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ButtonPropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_ChoicePropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_PropertyPanel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_SliderPropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\properties\juce_TextPropertyComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V1.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V2.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\lookandfeel\juce_LookAndFeel_V3.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsDisplayComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_DirectoryContentsList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileBrowserListener.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileChooserDialogBox.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileListComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilenameComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FilePreviewComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileSearchPathListComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_FileTreeComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_ImagePreviewComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\filebrowser\juce_WildcardFileFilter.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandID.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandInfo.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandManager.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_ApplicationCommandTarget.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\commands\juce_KeyPressMappingSet.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\misc\juce_DropShadower.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Application.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\application\juce_Initialisation.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_MultiTouchMapper.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeDocument.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\documents\juce_FileBasedDocument.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_NSViewComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\embedding\juce_UIViewComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\lookandfeel\juce_OldSchoolLookAndFeel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_AppleRemote.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_ColourSelector.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_PreferencesPanel.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SplashScreen.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Draggable3DOrientation.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Matrix3D.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLContext.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLFrameBuffer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLGraphicsContext.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLHelpers.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLImage.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLPixelFormat.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLRenderer.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLShaderProgram.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_OpenGLTexture.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Quaternion.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\opengl\juce_Vector3D.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_MissingGLDefinitions.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_android.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_ios.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_linux.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_osx.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGL_win32.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\native\juce_OpenGLExtensions.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_DirectShowComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\playback\juce_QuickTimeMovieComponent.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\capture\juce_CameraDevice.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\modules\juce_video\juce_video.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\AppConfig.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/>
+    <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\Resources\Fonts\cpmono-black-serialized" />
-    <None Include="..\..\Resources\Fonts\cpmono-bold-serialized" />
-    <None Include="..\..\Resources\Fonts\cpmono-extralight-serialized" />
-    <None Include="..\..\Resources\Fonts\cpmono-light-serialized" />
-    <None Include="..\..\Resources\Fonts\cpmono-plain-serialized" />
-    <None Include="..\..\Resources\Fonts\BebasNeue.otf" />
-    <None Include="..\..\Resources\Fonts\cpmono_bold.otf" />
-    <None Include="..\..\Resources\Fonts\cpmono_extra_light.otf" />
-    <None Include="..\..\Resources\Fonts\cpmono_light.otf" />
-    <None Include="..\..\Resources\Fonts\cpmono_plain.otf" />
-    <None Include="..\..\Resources\Fonts\miso-bold.ttf" />
-    <None Include="..\..\Resources\Fonts\miso-light.ttf" />
-    <None Include="..\..\Resources\Fonts\miso-regular.ttf" />
-    <None Include="..\..\Resources\Fonts\miso-serialized" />
-    <None Include="..\..\Resources\Fonts\nordic.ttf" />
-    <None Include="..\..\Resources\Fonts\ostrich.ttf" />
-    <None Include="..\..\Resources\Fonts\silkscreen-serialized" />
-    <None Include="..\..\Resources\Fonts\silkscreen.ttf" />
-    <None Include="..\..\Resources\Fonts\unibody-8.otf" />
-    <None Include="..\..\Resources\Images\Icons\ArduinoIcon.png" />
-    <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoBlack.png" />
-    <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoGray.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons-01.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons-02.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons-03.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons-04.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons-05.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-01.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-02.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-03.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-04.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-05.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-01.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-02.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-03.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-04.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-05.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-01.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-02.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-03.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-04.png" />
-    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-05.png" />
-    <None Include="..\..\Resources\Images\Icons\noise_wave.png" />
-    <None Include="..\..\Resources\Images\Icons\saw_wave.png" />
-    <None Include="..\..\Resources\Images\Icons\sine_wave.png" />
-    <None Include="..\..\Resources\Images\Icons\square_wave.png" />
-    <None Include="..\..\Resources\Images\Icons\triangle_wave.png" />
-    <None Include="..\..\Resources\Images\Icons\wifi.png" />
-    <None Include="..\..\Resources\Images\Icons\SourceDrop.png" />
-    <None Include="..\..\Resources\Images\Icons\DefaultDataSource.png" />
-    <None Include="..\..\Resources\Images\Icons\FileReaderIcon.png" />
-    <None Include="..\..\Resources\Images\Icons\IntanIcon.png" />
-    <None Include="..\..\Resources\Images\Buttons\muteoff.png" />
-    <None Include="..\..\Resources\Images\Buttons\muteon.png" />
-    <None Include="..\..\Resources\Images\Buttons\MergerA-01.png" />
-    <None Include="..\..\Resources\Images\Buttons\MergerA-02.png" />
-    <None Include="..\..\Resources\Images\Buttons\MergerB-01.png" />
-    <None Include="..\..\Resources\Images\Buttons\MergerB-02.png" />
-    <None Include="..\..\Resources\Images\Buttons\PipelineA-01.png" />
-    <None Include="..\..\Resources\Images\Buttons\PipelineA-02.png" />
-    <None Include="..\..\Resources\Images\Buttons\PipelineB-01.png" />
-    <None Include="..\..\Resources\Images\Buttons\PipelineB-02.png" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_core\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_events\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_module_info" />
-    <None Include="..\..\JuceLibraryCode\modules\juce_video\juce_module_info" />
+    <None Include="..\..\Resources\Fonts\cpmono-black-serialized"/>
+    <None Include="..\..\Resources\Fonts\cpmono-bold-serialized"/>
+    <None Include="..\..\Resources\Fonts\cpmono-extralight-serialized"/>
+    <None Include="..\..\Resources\Fonts\cpmono-light-serialized"/>
+    <None Include="..\..\Resources\Fonts\cpmono-plain-serialized"/>
+    <None Include="..\..\Resources\Fonts\BebasNeue.otf"/>
+    <None Include="..\..\Resources\Fonts\cpmono_bold.otf"/>
+    <None Include="..\..\Resources\Fonts\cpmono_extra_light.otf"/>
+    <None Include="..\..\Resources\Fonts\cpmono_light.otf"/>
+    <None Include="..\..\Resources\Fonts\cpmono_plain.otf"/>
+    <None Include="..\..\Resources\Fonts\miso-bold.ttf"/>
+    <None Include="..\..\Resources\Fonts\miso-light.ttf"/>
+    <None Include="..\..\Resources\Fonts\miso-regular.ttf"/>
+    <None Include="..\..\Resources\Fonts\miso-serialized"/>
+    <None Include="..\..\Resources\Fonts\nordic.ttf"/>
+    <None Include="..\..\Resources\Fonts\ostrich.ttf"/>
+    <None Include="..\..\Resources\Fonts\silkscreen-serialized"/>
+    <None Include="..\..\Resources\Fonts\silkscreen.ttf"/>
+    <None Include="..\..\Resources\Fonts\unibody-8.otf"/>
+    <None Include="..\..\Resources\Images\Icons\ArduinoIcon.png"/>
+    <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoBlack.png"/>
+    <None Include="..\..\Resources\Images\Icons\OpenEphysBoardLogoGray.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons-01.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons-02.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons-03.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons-04.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons-05.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-01.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-02.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-03.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-04.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_neutral-05.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-01.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-02.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-03.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-04.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected-05.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-01.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-02.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-03.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-04.png"/>
+    <None Include="..\..\Resources\Images\Icons\RadioButtons_selected_over-05.png"/>
+    <None Include="..\..\Resources\Images\Icons\noise_wave.png"/>
+    <None Include="..\..\Resources\Images\Icons\saw_wave.png"/>
+    <None Include="..\..\Resources\Images\Icons\sine_wave.png"/>
+    <None Include="..\..\Resources\Images\Icons\square_wave.png"/>
+    <None Include="..\..\Resources\Images\Icons\triangle_wave.png"/>
+    <None Include="..\..\Resources\Images\Icons\wifi.png"/>
+    <None Include="..\..\Resources\Images\Icons\SourceDrop.png"/>
+    <None Include="..\..\Resources\Images\Icons\DefaultDataSource.png"/>
+    <None Include="..\..\Resources\Images\Icons\FileReaderIcon.png"/>
+    <None Include="..\..\Resources\Images\Icons\IntanIcon.png"/>
+    <None Include="..\..\Resources\Images\Buttons\muteoff.png"/>
+    <None Include="..\..\Resources\Images\Buttons\muteon.png"/>
+    <None Include="..\..\Resources\Images\Buttons\MergerA-01.png"/>
+    <None Include="..\..\Resources\Images\Buttons\MergerA-02.png"/>
+    <None Include="..\..\Resources\Images\Buttons\MergerB-01.png"/>
+    <None Include="..\..\Resources\Images\Buttons\MergerB-02.png"/>
+    <None Include="..\..\Resources\Images\Buttons\PipelineA-01.png"/>
+    <None Include="..\..\Resources\Images\Buttons\PipelineA-02.png"/>
+    <None Include="..\..\Resources\Images\Buttons\PipelineB-01.png"/>
+    <None Include="..\..\Resources\Images\Buttons\PipelineB-02.png"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_audio_basics\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_audio_devices\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_audio_formats\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_audio_processors\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_audio_utils\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_core\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_cryptography\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_data_structures\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_events\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_graphics\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_gui_basics\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_gui_extra\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_opengl\juce_module_info"/>
+    <None Include="..\..\JuceLibraryCode\modules\juce_video\juce_module_info"/>
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include=".\resources.rc" />
+    <ResourceCompile Include=".\resources.rc"/>
   </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets" />
-</Project>
\ No newline at end of file
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
+  <ImportGroup Label="ExtensionTargets"/>
+</Project>
diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj.filters b/Builds/VisualStudio2012/open-ephys.vcxproj.filters
index 31ec610d5dd3a7cc44a8a614abed0c54002bd3e1..458bd3a84d405b4950e03de207744c45fbb89ab5 100644
--- a/Builds/VisualStudio2012/open-ephys.vcxproj.filters
+++ b/Builds/VisualStudio2012/open-ephys.vcxproj.filters
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
+
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
     <Filter Include="open-ephys">
@@ -420,6 +421,18 @@
     <ClCompile Include="..\..\Source\Processors\SpikeSorter.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\HDF5FileFormat.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\OriginalRecording.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\RecordEngine.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\HDF5Recording.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\SerialInput.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
@@ -798,6 +811,12 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_linux_Midi.cpp">
       <Filter>Juce Modules\juce_audio_devices\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_AudioCDBurner.mm">
+      <Filter>Juce Modules\juce_audio_devices\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_AudioCDReader.mm">
+      <Filter>Juce Modules\juce_audio_devices\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">
       <Filter>Juce Modules\juce_audio_devices\native</Filter>
     </ClCompile>
@@ -894,6 +913,9 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format\juce_AudioPluginFormatManager.cpp">
       <Filter>Juce Modules\juce_audio_processors\format</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
+      <Filter>Juce Modules\juce_audio_processors\format_types</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
       <Filter>Juce Modules\juce_audio_processors\format_types</Filter>
     </ClCompile>
@@ -1134,6 +1156,21 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_linux_Threads.cpp">
       <Filter>Juce Modules\juce_core\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Files.mm">
+      <Filter>Juce Modules\juce_core\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Network.mm">
+      <Filter>Juce Modules\juce_core\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Strings.mm">
+      <Filter>Juce Modules\juce_core\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_SystemStats.mm">
+      <Filter>Juce Modules\juce_core\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_mac_Threads.mm">
+      <Filter>Juce Modules\juce_core\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_core\native\juce_posix_NamedPipe.cpp">
       <Filter>Juce Modules\juce_core\native</Filter>
     </ClCompile>
@@ -1221,9 +1258,15 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_android_Messaging.cpp">
       <Filter>Juce Modules\juce_events\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_ios_MessageManager.mm">
+      <Filter>Juce Modules\juce_events\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_linux_Messaging.cpp">
       <Filter>Juce Modules\juce_events\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_mac_MessageManager.mm">
+      <Filter>Juce Modules\juce_events\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_events\native\juce_win32_Messaging.cpp">
       <Filter>Juce Modules\juce_events\native</Filter>
     </ClCompile>
@@ -1329,6 +1372,12 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_linux_Fonts.cpp">
       <Filter>Juce Modules\juce_graphics\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm">
+      <Filter>Juce Modules\juce_graphics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_mac_Fonts.mm">
+      <Filter>Juce Modules\juce_graphics\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
       <Filter>Juce Modules\juce_graphics\native</Filter>
     </ClCompile>
@@ -1683,6 +1732,12 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_android_Windowing.cpp">
       <Filter>Juce Modules\juce_gui_basics\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_ios_UIViewComponentPeer.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_ios_Windowing.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_linux_Clipboard.cpp">
       <Filter>Juce Modules\juce_gui_basics\native</Filter>
     </ClCompile>
@@ -1692,6 +1747,21 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_linux_Windowing.cpp">
       <Filter>Juce Modules\juce_gui_basics\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_FileChooser.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_MainMenu.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_MouseCursor.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_NSViewComponentPeer.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_mac_Windowing.mm">
+      <Filter>Juce Modules\juce_gui_basics\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_basics\native\juce_win32_DragAndDrop.cpp">
       <Filter>Juce Modules\juce_gui_basics\native</Filter>
     </ClCompile>
@@ -1749,15 +1819,27 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_android_WebBrowserComponent.cpp">
       <Filter>Juce Modules\juce_gui_extra\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_ios_UIViewComponent.mm">
+      <Filter>Juce Modules\juce_gui_extra\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_linux_SystemTrayIcon.cpp">
       <Filter>Juce Modules\juce_gui_extra\native</Filter>
     </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_linux_WebBrowserComponent.cpp">
       <Filter>Juce Modules\juce_gui_extra\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_AppleRemote.mm">
+      <Filter>Juce Modules\juce_gui_extra\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_NSViewComponent.mm">
+      <Filter>Juce Modules\juce_gui_extra\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_SystemTrayIcon.cpp">
       <Filter>Juce Modules\juce_gui_extra\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_mac_WebBrowserComponent.mm">
+      <Filter>Juce Modules\juce_gui_extra\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_gui_extra\native\juce_win32_ActiveXComponent.cpp">
       <Filter>Juce Modules\juce_gui_extra\native</Filter>
     </ClCompile>
@@ -1794,6 +1876,12 @@
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_android_CameraDevice.cpp">
       <Filter>Juce Modules\juce_video\native</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_mac_CameraDevice.mm">
+      <Filter>Juce Modules\juce_video\native</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_mac_QuickTimeMovieComponent.mm">
+      <Filter>Juce Modules\juce_video\native</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\JuceLibraryCode\modules\juce_video\native\juce_win32_CameraDevice.cpp">
       <Filter>Juce Modules\juce_video\native</Filter>
     </ClCompile>
@@ -1934,6 +2022,18 @@
     <ClInclude Include="..\..\Source\Processors\SpikeSorter.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\HDF5FileFormat.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\OriginalRecording.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\RecordEngine.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\HDF5Recording.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\SerialInput.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
@@ -3802,4 +3902,4 @@
       <Filter>Juce Library Code</Filter>
     </ResourceCompile>
   </ItemGroup>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/Source/Main.cpp b/Source/Main.cpp
index ba1eeb994441f9d076c5b2ea14ecde17d5f5921f..33278c084ef31a25f14c8e7089cdd92932f00f6c 100644
--- a/Source/Main.cpp
+++ b/Source/Main.cpp
@@ -75,6 +75,7 @@ public:
                 std::cout.rdbuf(console_out.rdbuf());
 				std::cerr.rdbuf(console_out.rdbuf());
                 SetConsoleTitle("Debug Console");
+				std::cout << "Debug console..." << std::endl;
             }
         }
 
diff --git a/Source/MainWindow.cpp b/Source/MainWindow.cpp
index ace0b88ec056a01657b93a652ea1096a4e5341d9..6ed5a7bd9e0503452326532b4284d3e5c5539dd4 100644
--- a/Source/MainWindow.cpp
+++ b/Source/MainWindow.cpp
@@ -23,7 +23,6 @@
 
 #include "MainWindow.h"
 #include <stdio.h>
-
 //-----------------------------------------------------------------------
 
 MainWindow::MainWindow()
diff --git a/Source/Processors/Channel.cpp b/Source/Processors/Channel.cpp
index 9288674db5b99166810138a5663a63631d0305a6..11de6fc646b91402210848a5ef2ac374faa5906b 100644
--- a/Source/Processors/Channel.cpp
+++ b/Source/Processors/Channel.cpp
@@ -24,8 +24,8 @@
 #include "Channel.h"
 
 
-Channel::Channel(GenericProcessor* p, int n) : num(n), eventType(0), processor(p), sampleRate(44100.0), bitVolts(1.0f),type(DATA_CHANNEL),isMonitored(false), isEnabled(true), isRecording(false)
-    
+Channel::Channel(GenericProcessor* p, int n) : num(n), eventType(0), processor(p), sampleRate(44100.0), bitVolts(1.0f),
+	isADCchannel(false),isEventChannel(false), isMonitored(false), isEnabled(true), isRecording(false), recordIndex(-1)
 {
     nodeId = p->getNodeId();
 
diff --git a/Source/Processors/Channel.h b/Source/Processors/Channel.h
index eeddd29f3d8116f13c4678c80481d37d6cbee216..c502fffba3327a9bedbd99d03d7f4e53e9d69897 100644
--- a/Source/Processors/Channel.h
+++ b/Source/Processors/Channel.h
@@ -114,11 +114,8 @@ public:
     bool isMonitored;
     bool isEnabled;
 
-    int originalStream;
-    int originalChannel;
-    // file info (for disk writing):
-    String filename;
-    FILE* file;
+    // file info (for disk writing). Meaning depends on RecordEngine
+	int recordIndex;
 
     String name;
 
diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp
index 804b3f80ff9883e2169564dcfb0cd1b48ec1156c..55e8098e324216fd49783b0aba8f80d5691cbb6e 100755
--- a/Source/Processors/DataThreads/FileReaderThread.cpp
+++ b/Source/Processors/DataThreads/FileReaderThread.cpp
@@ -133,6 +133,11 @@ bool FileReaderThread::updateBuffer()
 
         size_t numRead = fread(readBuffer, 2, bufferSize, input);
 
+        if (numRead != bufferSize)
+        {
+            std::cout << "Fewer samples read than were requested." << std::endl;
+        }
+        
         int chan = 0;
 
         for (int n = 0; n < bufferSize; n++)
diff --git a/Source/Processors/Editors/AudioEditor.cpp b/Source/Processors/Editors/AudioEditor.cpp
index a3140e0334d9df3745be414c73d8f19fdbd8522d..184c870c92cce3d5818fe86212fa959f8b40e450 100755
--- a/Source/Processors/Editors/AudioEditor.cpp
+++ b/Source/Processors/Editors/AudioEditor.cpp
@@ -83,7 +83,7 @@ void AudioWindowButton::setText(String text)
 }
 
 AudioEditor::AudioEditor(AudioNode* owner)
-    : AudioProcessorEditor(owner), lastValue(1.0f), acw(0), isEnabled(true)
+    : AudioProcessorEditor(owner), lastValue(1.0f), isEnabled(true), acw(0)
 
 {
 
diff --git a/Source/Processors/Editors/ChannelSelector.cpp b/Source/Processors/Editors/ChannelSelector.cpp
index d860838c3bcf1a4b58af5af56328ce82abed327d..935e2450fda31ff87b81d8979fc3382ef422d2d2 100755
--- a/Source/Processors/Editors/ChannelSelector.cpp
+++ b/Source/Processors/Editors/ChannelSelector.cpp
@@ -33,7 +33,7 @@ ChannelSelector::ChannelSelector(bool createButtons, Font& titleFont_) :
     eventsOnly(false), paramsToggled(true), paramsActive(true),
     radioStatus(false), isNotSink(createButtons), moveRight(false),
     moveLeft(false), offsetLR(0), offsetUD(0), desiredOffset(0),
-    titleFont(titleFont_), acquisitionIsActive(false)
+	titleFont(titleFont_), acquisitionIsActive(false), recActive(true)
 {
 
     // initialize buttons
@@ -341,6 +341,31 @@ void ChannelSelector::activateButtons()
 
 }
 
+void ChannelSelector::inactivateRecButtons()
+{
+
+	recActive = false;
+
+	for (int i = 0; i < recordButtons.size(); i++)
+    {
+        recordButtons[i]->setActive(false);
+        recordButtons[i]->repaint();
+    }
+}
+
+void ChannelSelector::activateRecButtons()
+{
+
+	recActive = true;
+
+    for (int i = 0; i < recordButtons.size(); i++)
+    {
+        recordButtons[i]->setActive(true);
+        recordButtons[i]->repaint();
+    }
+
+}
+
 void ChannelSelector::startAcquisition()
 {
     acquisitionIsActive = true;
diff --git a/Source/Processors/Editors/ChannelSelector.h b/Source/Processors/Editors/ChannelSelector.h
index e71ee2983a0db992fa4c024906832cab79f614d9..1917c4e673a5908a49af0c4f77449f910d8997d5 100755
--- a/Source/Processors/Editors/ChannelSelector.h
+++ b/Source/Processors/Editors/ChannelSelector.h
@@ -115,6 +115,12 @@ public:
     /** Activates all the ChannelSelectorButtons under the "param" tab.*/
     void activateButtons();
 
+	/** Inactivates all the ChannelSelectorButtons under the "rec" tab.*/
+    void inactivateRecButtons();
+
+    /** Activates all the ChannelSelectorButtons under the "rec" tab.*/
+    void activateRecButtons();
+
     /** Refreshes Parameter Colors on change*/
     void refreshParameterColors()
     {
@@ -160,6 +166,7 @@ private:
 
     bool paramsToggled;
     bool paramsActive;
+	bool recActive;
     bool radioStatus;
 
     bool isNotSink;
diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp
index 58b8e9d3cedf030cf7378795b32621a42dc74f3c..01091cb34d1fd9d58298132291a563493206c0a2 100755
--- a/Source/Processors/Editors/GenericEditor.cpp
+++ b/Source/Processors/Editors/GenericEditor.cpp
@@ -280,6 +280,18 @@ void GenericEditor::setEnabledState(bool t)
     isEnabled = p->enabledState();
 }
 
+void GenericEditor::startRecording()
+{
+	if (channelSelector != 0)
+		channelSelector->inactivateRecButtons();
+}
+
+void GenericEditor::stopRecording()
+{
+	if (channelSelector != 0)
+		channelSelector->activateRecButtons();
+}
+
 void GenericEditor::startAcquisition()
 {
 
diff --git a/Source/Processors/Editors/GenericEditor.h b/Source/Processors/Editors/GenericEditor.h
index 71fdef743c10b3ef0cc2e88e1eb6365334fc836f..ed1ce7e3745b064c84b6e01c5c026b5362f1a3b6 100755
--- a/Source/Processors/Editors/GenericEditor.h
+++ b/Source/Processors/Editors/GenericEditor.h
@@ -108,6 +108,12 @@ public:
     /** Used to enable or disable an editor's processor.*/
     void setEnabledState(bool);
 
+	/** Called at the start of a recording **/
+	void startRecording();
+
+	/** Called at the end of a recording **/
+	void stopRecording();
+
     /** Called just prior to the start of acquisition, to allow the editor to prepare.*/
     virtual void startAcquisition();
 
diff --git a/Source/Processors/Editors/RecordControlEditor.cpp b/Source/Processors/Editors/RecordControlEditor.cpp
index e97638e92e7ef4e9c97f9d67a6d9c47c78b12584..6103c046acdf2e3de72b6a963603be52cc10d77e 100644
--- a/Source/Processors/Editors/RecordControlEditor.cpp
+++ b/Source/Processors/Editors/RecordControlEditor.cpp
@@ -58,14 +58,6 @@ RecordControlEditor::RecordControlEditor(GenericProcessor* parentNode, bool useD
         channelName += i + 1;
         availableChans->addItem(channelName,i+2);
     }
-
-    newFileToggleButton = new UtilityButton("SPLIT FILES", Font("Small Text", 13, Font::plain));
-    newFileToggleButton->setRadius(3.0f);
-    newFileToggleButton->setBounds(35, 95, 90, 18);
-    newFileToggleButton->addListener(this);
-    newFileToggleButton->setClickingTogglesState(true);
-    addAndMakeVisible(newFileToggleButton);
-
 }
 
 RecordControlEditor::~RecordControlEditor()
@@ -82,18 +74,6 @@ void RecordControlEditor::comboBoxChanged(ComboBox* comboBox)
         getProcessor()->setParameter(0, -1);
 }
 
-void RecordControlEditor::buttonEvent(Button* button)
-{
-
-    if (button->getToggleState())
-    {
-        getProcessor()->setParameter(1, 1.0f);
-    }
-    else
-    {
-        getProcessor()->setParameter(1, 0.0f);
-    }
-}
 
 void RecordControlEditor::updateSettings()
 {
@@ -110,7 +90,6 @@ void RecordControlEditor::saveCustomParameters(XmlElement* xml)
 
     info->setAttribute("Type", "RecordControlEditor");
     info->setAttribute("Channel",availableChans->getSelectedId());
-    info->setAttribute("FileSaveOption",newFileToggleButton->getToggleState());
 
 }
 
@@ -122,7 +101,6 @@ void RecordControlEditor::loadCustomParameters(XmlElement* xml)
 
         if (xmlNode->hasTagName("PARAMETERS"))
         {
-            newFileToggleButton->setToggleState(xmlNode->getBoolAttribute("FileSaveOption"), sendNotification);
             availableChans->setSelectedId(xmlNode->getIntAttribute("Channel"), sendNotification);
         }
 
diff --git a/Source/Processors/Editors/RecordControlEditor.h b/Source/Processors/Editors/RecordControlEditor.h
index 0976ac133237f0e87964658d41e651269175f39c..4b7bda5128c52f5cb44ba20b1cf7bade34c3a69b 100644
--- a/Source/Processors/Editors/RecordControlEditor.h
+++ b/Source/Processors/Editors/RecordControlEditor.h
@@ -43,16 +43,14 @@ public:
     ~RecordControlEditor();
     void comboBoxChanged(ComboBox* comboBox);
     void updateSettings();
-    void buttonEvent(Button* button);
     void loadCustomParameters(XmlElement*);
     void saveCustomParameters(XmlElement*);
 
 private:
     ScopedPointer<ComboBox> availableChans;
     ScopedPointer<Label> chanSel;
-    ScopedPointer<UtilityButton> newFileToggleButton;
 
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor);
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor);
 
 };
 
diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp
index 9b7fc3b9cb71373650e69142ef33c1318ac74290..a5b0e32352d39372381340eec146bda2b1dacd1f 100755
--- a/Source/Processors/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor.cpp
@@ -412,6 +412,23 @@ void GenericProcessor::setAllChannelsToRecord()
 
 }
 
+void GenericProcessor::setRecording(bool state)
+{
+	GenericEditor* ed = getEditor();
+	if (state)
+	{
+		if (ed != 0)
+			ed->startRecording();
+		startRecording();
+	}
+	else
+	{
+		if (ed != 0)
+			ed->stopRecording();
+		stopRecording();
+	}
+}
+
 void GenericProcessor::enableEditor()
 {
 
diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h
index 181a26ae848798f6edd8abced3da274b5b33d1a8..17878e5e2f73a1c6aa131559ca5060912df92a6f 100755
--- a/Source/Processors/GenericProcessor.h
+++ b/Source/Processors/GenericProcessor.h
@@ -420,11 +420,14 @@ public:
     {
         return true;
     }
+
+	/** Called when recording starts/stops **/
+	void setRecording(bool state);
     
-    /** Called whenever recording has started. */
+    /** Called from setRecording whenever recording has started. */
     virtual void startRecording() { }
-    
-    /** Called whenever recording has stopped. */
+
+    /** Called from setRecording whenever recording has stopped. */
     virtual void stopRecording() { }
 
     /** Informs a processor's editor that data acquisition is about to begin. */
diff --git a/Source/Processors/HDF5FileFormat.cpp b/Source/Processors/HDF5FileFormat.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..003bc2874db5c8deae9705e4babaaa3d18247613
--- /dev/null
+++ b/Source/Processors/HDF5FileFormat.cpp
@@ -0,0 +1,892 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#include <H5Cpp.h>
+#include "HDF5FileFormat.h"
+
+#ifndef CHUNK_XSIZE
+#define CHUNK_XSIZE 256
+#endif
+
+#ifndef EVENT_CHUNK_SIZE
+#define EVENT_CHUNK_SIZE 8
+#endif
+
+#ifndef SPIKE_CHUNK_XSIZE
+#define SPIKE_CHUNK_XSIZE 8
+#endif
+
+#ifndef SPIKE_CHUNK_YSIZE
+#define SPIKE_CHUNK_YSIZE 40
+#endif
+
+#define MAX_TRANSFORM_SIZE 512
+
+#define PROCESS_ERROR std::cerr << error.getCDetailMsg() << std::endl; return -1
+#define CHECK_ERROR(x) if (x) std::cerr << "Error at HDFRecording " << __LINE__ << std::endl;
+
+using namespace H5;
+
+//HDF5FileBase
+
+HDF5FileBase::HDF5FileBase() : opened(false), readyToOpen(false)
+{
+    Exception::dontPrint();
+};
+
+HDF5FileBase::~HDF5FileBase()
+{
+    close();
+}
+
+bool HDF5FileBase::isOpen() const
+{
+    return opened;
+}
+
+int HDF5FileBase::open()
+{
+    if (!readyToOpen) return -1;
+    if (File(getFileName()).existsAsFile())
+        return open(false);
+    else
+        return open(true);
+
+}
+
+int HDF5FileBase::open(bool newfile)
+{
+    int accFlags,ret=0;
+
+    if (opened) return -1;
+
+    try
+    {
+
+        if (newfile) accFlags = H5F_ACC_TRUNC;
+        else accFlags = H5F_ACC_RDWR;
+        file = new H5File(getFileName().toUTF8(),accFlags);
+        opened = true;
+        if (newfile)
+        {
+            ret = createFileStructure();
+        }
+
+        if (ret)
+        {
+            file = nullptr;
+            opened = false;
+            std::cerr << "Error creating file structure" << std::endl;
+        }
+
+
+        return ret;
+    }
+    catch (FileIException error)
+    {
+        PROCESS_ERROR;
+    }
+}
+
+void HDF5FileBase::close()
+{
+    file = nullptr;
+    opened = false;
+}
+
+int HDF5FileBase::setAttribute(DataTypes type, void* data, String path, String name)
+{
+    Group loc;
+    Attribute attr;
+    DataType H5type;
+    DataType origType;
+
+    if (!opened) return -1;
+    try
+    {
+        loc = file->openGroup(path.toUTF8());
+
+        H5type = getH5Type(type);
+        origType = getNativeType(type);
+
+        if (loc.attrExists(name.toUTF8()))
+        {
+            attr = loc.openAttribute(name.toUTF8());
+        }
+        else
+        {
+            DataSpace attr_dataspace(H5S_SCALAR);
+            attr = loc.createAttribute(name.toUTF8(),H5type,attr_dataspace);
+        }
+
+        attr.write(origType,data);
+
+    }
+    catch (GroupIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (AttributeIException error)
+    {
+        PROCESS_ERROR;
+    }
+
+    return 0;
+}
+
+int HDF5FileBase::setAttributeStr(String value, String path, String name)
+{
+    Group loc;
+    Attribute attr;
+
+    if (!opened) return -1;
+
+    StrType type(PredType::C_S1, value.length());
+    try
+    {
+        loc = file->openGroup(path.toUTF8());
+
+        if (loc.attrExists(name.toUTF8()))
+        {
+            //attr = loc.openAttribute(name.toUTF8());
+            return -1; //string attributes cannot change size easily, better not allow overwritting.
+        }
+        else
+        {
+            DataSpace attr_dataspace(H5S_SCALAR);
+            attr = loc.createAttribute(name.toUTF8(), type, attr_dataspace);
+        }
+        attr.write(type,value.toUTF8());
+
+    }
+    catch (GroupIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (AttributeIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (FileIException error)
+    {
+        PROCESS_ERROR;
+    }
+
+    return 0;
+}
+
+int HDF5FileBase::createGroup(String path)
+{
+    if (!opened) return -1;
+    try
+    {
+        file->createGroup(path.toUTF8());
+    }
+    catch (FileIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (GroupIException error)
+    {
+        PROCESS_ERROR;
+    }
+    return 0;
+}
+
+HDF5RecordingData* HDF5FileBase::getDataSet(String path)
+{
+    ScopedPointer<DataSet> data;
+
+    if (!opened) return nullptr;
+
+    try
+    {
+        data = new DataSet(file->openDataSet(path.toUTF8()));
+        return new HDF5RecordingData(data.release());
+    }
+    catch (DataSetIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+    catch (FileIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+    catch (DataSpaceIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+}
+
+HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int chunkX, String path)
+{
+    int chunks[3] = {chunkX, 0, 0};
+    return createDataSet(type,1,&sizeX,chunks,path);
+}
+
+HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path)
+{
+    int size[2];
+    int chunks[3] = {chunkX, 0, 0};
+    size[0] = sizeX;
+    size[1] = sizeY;
+    return createDataSet(type,2,size,chunks,path);
+}
+
+HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path)
+{
+    int size[3];
+    int chunks[3] = {chunkX, 0, 0};
+    size[0] = sizeX;
+    size[1] = sizeY;
+    size[2] = sizeZ;
+    return createDataSet(type,2,size,chunks,path);
+}
+
+HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path)
+{
+    int size[3];
+    int chunks[3] = {chunkX, chunkY, 0};
+    size[0] = sizeX;
+    size[1] = sizeY;
+    size[2] = sizeZ;
+    return createDataSet(type,3,size,chunks,path);
+}
+
+HDF5RecordingData* HDF5FileBase::createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path)
+{
+    ScopedPointer<DataSet> data;
+    DSetCreatPropList prop;
+    if (!opened) return nullptr;
+
+    //Right now this classes don't support datasets with rank > 3.
+    //If it's needed in the future we can extend them to be of generic rank
+    if ((dimension > 3) || (dimension < 1)) return nullptr;
+
+    DataType H5type = getH5Type(type);
+
+    hsize_t dims[3], chunk_dims[3], max_dims[3];
+
+    for (int i=0; i < dimension; i++)
+    {
+        dims[i] = size[i];
+        if (chunking[i] > 0)
+        {
+            chunk_dims[i] = chunking[i];
+            max_dims[i] = H5S_UNLIMITED;
+        }
+        else
+        {
+            chunk_dims[i] = size[i];
+            max_dims[i] = size[i];
+        }
+    }
+
+    try
+    {
+        DataSpace dSpace(dimension,dims,max_dims);
+        prop.setChunk(dimension,chunk_dims);
+
+        data = new DataSet(file->createDataSet(path.toUTF8(),H5type,dSpace,prop));
+        return new HDF5RecordingData(data.release());
+    }
+    catch (DataSetIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+    catch (FileIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+    catch (DataSpaceIException error)
+    {
+        error.printError();
+        return nullptr;
+    }
+
+
+}
+
+H5::DataType HDF5FileBase::getNativeType(DataTypes type)
+{
+    switch (type)
+    {
+        case I8:
+            return PredType::NATIVE_INT8;
+            break;
+        case I16:
+            return PredType::NATIVE_INT16;
+            break;
+        case I32:
+            return PredType::NATIVE_INT32;
+            break;
+        case I64:
+            return PredType::NATIVE_INT64;
+            break;
+        case U8:
+            return PredType::NATIVE_UINT8;
+            break;
+        case U16:
+            return PredType::NATIVE_UINT16;
+            break;
+        case U32:
+            return PredType::NATIVE_UINT32;
+            break;
+        case U64:
+            return PredType::NATIVE_UINT64;
+            break;
+        case F32:
+            return PredType::NATIVE_FLOAT;
+            break;
+    }
+    return PredType::NATIVE_INT32;
+}
+
+H5::DataType HDF5FileBase::getH5Type(DataTypes type)
+{
+    switch (type)
+    {
+        case I8:
+            return PredType::STD_I8LE;
+            break;
+        case I16:
+            return PredType::STD_I16LE;
+            break;
+        case I32:
+            return PredType::STD_I32LE;
+            break;
+        case I64:
+            return PredType::STD_I64LE;
+            break;
+        case U8:
+            return PredType::STD_U8LE;
+            break;
+        case U16:
+            return PredType::STD_U16LE;
+            break;
+        case U32:
+            return PredType::STD_U32LE;
+            break;
+        case U64:
+            return PredType::STD_U64LE;
+            break;
+        case F32:
+            return PredType::IEEE_F32LE;
+            break;
+    }
+    return PredType::STD_I32LE;
+}
+
+HDF5RecordingData::HDF5RecordingData(DataSet* data)
+{
+    DataSpace dSpace;
+    DSetCreatPropList prop;
+    ScopedPointer<DataSet> dataSet = data;
+    hsize_t dims[3], chunk[3];
+
+    dSpace = dataSet->getSpace();
+    prop = dataSet->getCreatePlist();
+
+    dimension = dSpace.getSimpleExtentDims(dims);
+    prop.getChunk(dimension,chunk);
+
+    this->size[0] = dims[0];
+    if (dimension > 1)
+        this->size[1] = dims[1];
+    else
+        this->size[1] = 1;
+    if (dimension > 1)
+        this->size[2] = dims[2];
+    else
+        this->size[2] = 1;
+
+    this->xChunkSize = chunk[0];
+    this->xPos = dims[0];
+    this->dSet = dataSet;
+    this->rowXPos = 0;
+    this->rowDataSize = 0;
+}
+
+HDF5RecordingData::~HDF5RecordingData()
+{
+}
+int HDF5RecordingData::writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, void* data)
+{
+    return writeDataBlock(xDataSize,size[1],type,data);
+}
+
+int HDF5RecordingData::writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, void* data)
+{
+    hsize_t dim[3],offset[3];
+    DataSpace fSpace;
+    DataType nativeType;
+
+    dim[2] = size[2];
+    //only modify y size if new required size is larger than what we had.
+    if (yDataSize > size[1])
+        dim[1] = yDataSize;
+    else
+        dim[1] = size[1];
+    dim[0] = xPos + xDataSize;
+    try
+    {
+        //First be sure that we have enough space
+        dSet->extend(dim);
+
+        fSpace = dSet->getSpace();
+        fSpace.getSimpleExtentDims(dim);
+        size[0]=dim[0];
+        if (dimension > 1)
+            size[1]=dim[1];
+
+        //Create memory space
+        dim[0]=xDataSize;
+        dim[1]=yDataSize;
+        dim[2] = size[2];
+
+        DataSpace mSpace(dimension,dim);
+        //select where to write
+        offset[0]=xPos;
+        offset[1]=0;
+        offset[2]=0;
+        fSpace.selectHyperslab(H5S_SELECT_SET, dim, offset);
+
+        nativeType = HDF5FileBase::getNativeType(type);
+
+        dSet->write(data,nativeType,mSpace,fSpace);
+        xPos += xDataSize;
+    }
+    catch (DataSetIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (DataSpaceIException error)
+    {
+        PROCESS_ERROR;
+    }
+    return 0;
+}
+
+int HDF5RecordingData::prepareDataBlock(int xDataSize)
+{
+    hsize_t dim[3];
+    DataSpace fSpace;
+    if (dimension > 2) return -4; //We're not going to write rows in datasets bigger than 2d.
+
+    dim[2] = size[2];
+    dim[1] = size[1];
+    dim[0] = xPos + xDataSize;
+    try
+    {
+        dSet->extend(dim);
+
+        fSpace = dSet->getSpace();
+        fSpace.getSimpleExtentDims(dim);
+        size[0]=dim[0];
+    }
+    catch (DataSetIException error)
+    {
+        PROCESS_ERROR;
+    }
+    rowXPos = xPos;
+    rowDataSize = xDataSize;
+    xPos += xDataSize;
+    return 0;
+}
+
+int HDF5RecordingData::writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, void* data)
+{
+    hsize_t dim[2],offset[2];
+    DataSpace fSpace;
+    DataType nativeType;
+    if (dimension > 2) return -4; //We're not going to write rows in datasets bigger than 2d.
+    if (xDataSize != rowDataSize) return -2;
+    if ((yPos < 0) || (yPos >= size[1])) return -3;
+
+    try
+    {
+        dim[0] = xDataSize;
+        dim[1] = 1;
+        DataSpace mSpace(dimension,dim);
+
+        fSpace = dSet->getSpace();
+        offset[0] = rowXPos;
+        offset[1] = yPos;
+        fSpace.selectHyperslab(H5S_SELECT_SET, dim, offset);
+
+        nativeType = HDF5FileBase::getNativeType(type);
+
+
+        dSet->write(data,nativeType,mSpace,fSpace);
+    }
+    catch (DataSetIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (DataSpaceIException error)
+    {
+        PROCESS_ERROR;
+    }
+    catch (FileIException error)
+    {
+        PROCESS_ERROR;
+    }
+    return 0;
+}
+
+//KWD File
+
+KWDFile::KWDFile(int processorNumber, String basename) : HDF5FileBase()
+{
+    initFile(processorNumber, basename);
+}
+
+KWDFile::KWDFile() : HDF5FileBase()
+{
+}
+
+KWDFile::~KWDFile() {}
+
+String KWDFile::getFileName()
+{
+    return filename;
+}
+
+void KWDFile::initFile(int processorNumber, String basename)
+{
+    if (isOpen()) return;
+    filename = basename + "_" + String(processorNumber) + ".raw.kwd";
+    readyToOpen=true;
+}
+
+void KWDFile::startNewRecording(int recordingNumber, int nChannels, HDF5RecordingInfo* info)
+{
+    this->recordingNumber = recordingNumber;
+    this->nChannels = nChannels;
+
+    String recordPath = String("/recordings/")+String(recordingNumber);
+    CHECK_ERROR(createGroup(recordPath));
+    CHECK_ERROR(setAttributeStr(info->name,recordPath,String("name")));
+    CHECK_ERROR(setAttribute(U64,&(info->start_time),recordPath,String("start_time")));
+    //	CHECK_ERROR(setAttribute(U32,&(info->start_sample),recordPath,String("start_sample")));
+    CHECK_ERROR(setAttribute(F32,&(info->sample_rate),recordPath,String("sample_rate")));
+    CHECK_ERROR(setAttribute(U32,&(info->bit_depth),recordPath,String("bit_depth")));
+    recdata = createDataSet(I16,0,nChannels,CHUNK_XSIZE,recordPath+"/data");
+    if (!recdata.get())
+        std::cerr << "Error creating data set" << std::endl;
+    curChan = nChannels;
+}
+
+void KWDFile::stopRecording()
+{
+    //ScopedPointer does the deletion and destructors the closings
+    recdata = nullptr;
+}
+
+int KWDFile::createFileStructure()
+{
+    const uint16 ver = 2;
+    if (createGroup("/recordings")) return -1;
+    if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1;
+    return 0;
+}
+
+void KWDFile::writeBlockData(int16* data, int nSamples)
+{
+    CHECK_ERROR(recdata->writeDataBlock(nSamples,I16,data));
+}
+
+void KWDFile::writeRowData(int16* data, int nSamples)
+{
+    if (curChan >= nChannels)
+    {
+        CHECK_ERROR(recdata->prepareDataBlock(nSamples));
+        curChan=0;
+    }
+    CHECK_ERROR(recdata->writeDataRow(curChan,nSamples,I16,data));
+    curChan++;
+}
+
+//KWIK File
+
+KWIKFile::KWIKFile(String basename) : HDF5FileBase()
+{
+    initFile(basename);
+}
+
+KWIKFile::KWIKFile() : HDF5FileBase()
+{
+
+}
+
+KWIKFile::~KWIKFile() {}
+
+String KWIKFile::getFileName()
+{
+    return filename;
+}
+
+void KWIKFile::initFile(String basename)
+{
+    if (isOpen()) return;
+    filename = basename + ".kwik";
+    readyToOpen=true;
+}
+
+int KWIKFile::createFileStructure()
+{
+    const uint16 ver = 2;
+    if (createGroup("/recordings")) return -1;
+    if (createGroup("/event_types")) return -1;
+    for (int i=0; i < eventNames.size(); i++)
+    {
+        ScopedPointer<HDF5RecordingData> dSet;
+        String path = "/event_types/" + eventNames[i];
+        if (createGroup(path)) return -1;
+        path += "/events";
+        if (createGroup(path)) return -1;
+        dSet = createDataSet(U64,0,EVENT_CHUNK_SIZE,path + "/time_samples");
+        if (!dSet) return -1;
+        dSet = createDataSet(U16,0,EVENT_CHUNK_SIZE,path + "/recording");
+        if (!dSet) return -1;
+        path += "/user_data";
+        if (createGroup(path)) return -1;
+        dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/eventID");
+        if (!dSet) return -1;
+        dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/nodeID");
+        if (!dSet) return -1;
+        dSet = createDataSet(U8,0,EVENT_CHUNK_SIZE,path + "/event_channel");
+        if (!dSet) return -1;
+    }
+    if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1;
+    return 0;
+}
+
+void KWIKFile::startNewRecording(int recordingNumber, HDF5RecordingInfo* info)
+{
+    this->recordingNumber = recordingNumber;
+    kwdIndex=0;
+    String recordPath = String("/recordings/")+String(recordingNumber);
+    CHECK_ERROR(createGroup(recordPath));
+    CHECK_ERROR(setAttributeStr(info->name,recordPath,String("name")));
+    CHECK_ERROR(setAttribute(U64,&(info->start_time),recordPath,String("start_time")));
+    //	CHECK_ERROR(setAttribute(U32,&(info->start_sample),recordPath,String("start_sample")));
+    CHECK_ERROR(setAttribute(F32,&(info->sample_rate),recordPath,String("sample_rate")));
+    CHECK_ERROR(setAttribute(U32,&(info->bit_depth),recordPath,String("bit_depth")));
+    CHECK_ERROR(createGroup(recordPath + "/raw"));
+    CHECK_ERROR(createGroup(recordPath + "/raw/hdf5_paths"));
+
+    for (int i = 0; i < eventNames.size(); i++)
+    {
+        HDF5RecordingData* dSet;
+        String path = "/event_types/" + eventNames[i] + "/events";
+        dSet = getDataSet(path + "/time_samples");
+        if (!dSet)
+            std::cerr << "Error loading event timestamps dataset for type " << i << std::endl;
+        timeStamps.add(dSet);
+        dSet = getDataSet(path + "/recording");
+        if (!dSet)
+            std::cerr << "Error loading event recordings dataset for type " << i << std::endl;
+        recordings.add(dSet);
+        dSet = getDataSet(path + "/user_data/eventID");
+        if (!dSet)
+            std::cerr << "Error loading event ID dataset for type " << i << std::endl;
+        eventID.add(dSet);
+        dSet = getDataSet(path + "/user_data/nodeID");
+        if (!dSet)
+            std::cerr << "Error loading event node ID dataset for type " << i << std::endl;
+        nodeID.add(dSet);
+        dSet = getDataSet(path + "/user_data/event_channel");
+        if (!dSet)
+            std::cerr << "Error loading event channel dataset for type " << i << std::endl;
+        channelID.add(dSet);
+    }
+}
+
+void KWIKFile::stopRecording()
+{
+    timeStamps.clear();
+    recordings.clear();
+    eventID.clear();
+	nodeID.clear();
+	channelID.clear();
+}
+
+void KWIKFile::writeEvent(int type, uint8 id, uint8 processor, uint8 channel, uint64 timestamp)
+{
+    if (type > eventNames.size() || type < 0)
+    {
+        std::cerr << "HDF5::writeEvent Invalid event type " << type << std::endl;
+        return;
+    }
+    CHECK_ERROR(timeStamps[type]->writeDataBlock(1,U64,&timestamp));
+    CHECK_ERROR(recordings[type]->writeDataBlock(1,I32,&recordingNumber));
+    CHECK_ERROR(eventID[type]->writeDataBlock(1,U8,&id));
+    CHECK_ERROR(nodeID[type]->writeDataBlock(1,U8,&processor));
+    CHECK_ERROR(channelID[type]->writeDataBlock(1,U8,&channel));
+}
+
+void KWIKFile::addKwdFile(String filename)
+{
+    CHECK_ERROR(setAttributeStr(filename + "/recordings/" + String(recordingNumber),"/recordings/" + String(recordingNumber) +
+                                "/raw/hdf5_paths",String(kwdIndex)));
+    kwdIndex++;
+}
+
+void KWIKFile::addEventType(String name)
+{
+    eventNames.add(name);
+}
+
+//KWX File
+
+KWXFile::KWXFile(String basename) : HDF5FileBase()
+{
+    initFile(basename);
+    numElectrodes=0;
+    transformVector = new int16[MAX_TRANSFORM_SIZE];
+}
+
+KWXFile::KWXFile() : HDF5FileBase()
+{
+    numElectrodes=0;
+    transformVector = new int16[MAX_TRANSFORM_SIZE];
+}
+
+KWXFile::~KWXFile()
+{
+    delete transformVector;
+}
+
+String KWXFile::getFileName()
+{
+    return filename;
+}
+
+void KWXFile::initFile(String basename)
+{
+    if (isOpen()) return;
+    filename = basename + ".kwx";
+    readyToOpen=true;
+}
+
+int KWXFile::createFileStructure()
+{
+    const uint16 ver = 2;
+    if (createGroup("/channel_groups")) return -1;
+    if (setAttribute(U16,(void*)&ver,"/","kwik_version")) return -1;
+    for (int i=0; i < channelArray.size(); i++)
+    {
+        int res = createChannelGroup(i);
+        if (res) return -1;
+    }
+    return 0;
+}
+
+void KWXFile::addChannelGroup(int nChannels)
+{
+    channelArray.add(nChannels);
+    numElectrodes++;
+}
+
+int KWXFile::createChannelGroup(int index)
+{
+    ScopedPointer<HDF5RecordingData> dSet;
+    int nChannels = channelArray[index];
+    String path("/channel_groups/"+String(index));
+    CHECK_ERROR(createGroup(path));
+    dSet = createDataSet(I16,0,0,nChannels,SPIKE_CHUNK_XSIZE,SPIKE_CHUNK_YSIZE,path+"/waveforms_filtered");
+    if (!dSet) return -1;
+    dSet = createDataSet(U64,0,SPIKE_CHUNK_XSIZE,path+"/time_samples");
+    if (!dSet) return -1;
+    dSet = createDataSet(U16,0,SPIKE_CHUNK_XSIZE,path+"/recordings");
+    if (!dSet) return -1;
+    return 0;
+}
+
+void KWXFile::startNewRecording(int recordingNumber)
+{
+    HDF5RecordingData* dSet;
+    String path;
+    this->recordingNumber = recordingNumber;
+
+    for (int i=0; i < channelArray.size(); i++)
+    {
+        path = "/channel_groups/"+String(i);
+        dSet=getDataSet(path+"/waveforms_filtered");
+        if (!dSet)
+            std::cerr << "Error loading spikes dataset for group " << i << std::endl;
+        spikeArray.add(dSet);
+        dSet=getDataSet(path+"/time_samples");
+        if (!dSet)
+            std::cerr << "Error loading spike timestamp dataset for group " << i << std::endl;
+        timeStamps.add(dSet);
+        dSet=getDataSet(path+"/recordings");
+        if (!dSet)
+            std::cerr << "Error loading spike recordings dataset for group " << i << std::endl;
+        recordingArray.add(dSet);
+    }
+}
+
+void KWXFile::stopRecording()
+{
+    spikeArray.clear();
+    timeStamps.clear();
+    recordingArray.clear();
+}
+
+void KWXFile::resetChannels()
+{
+    stopRecording(); //Just in case
+    channelArray.clear();
+}
+
+void KWXFile::writeSpike(int groupIndex, int nSamples, const uint16* data, uint64 timestamp)
+{
+    if ((groupIndex < 0) || (groupIndex >= numElectrodes))
+    {
+        std::cerr << "HDF5::writeSpike Electrode index out of bounds " << groupIndex << std::endl;
+        return;
+    }
+    int nChans= channelArray[groupIndex];
+    int16* dst=transformVector;
+
+    //Given the way we store spike data, we need to transpose it to store in
+    //N x NSAMPLES x NCHANNELS as well as convert from u16 to i16
+    for (int i = 0; i < nSamples; i++)
+    {
+        for (int j = 0; j < nChans; j++)
+        {
+            *(dst++) = *(data+j*nSamples+i)-32768;
+        }
+    }
+
+    CHECK_ERROR(spikeArray[groupIndex]->writeDataBlock(1,nSamples,I16,transformVector));
+    CHECK_ERROR(recordingArray[groupIndex]->writeDataBlock(1,I32,&recordingNumber));
+    CHECK_ERROR(timeStamps[groupIndex]->writeDataBlock(1,U64,&timestamp));
+}
diff --git a/Source/Processors/HDF5FileFormat.h b/Source/Processors/HDF5FileFormat.h
new file mode 100644
index 0000000000000000000000000000000000000000..d2f8116c5fbc5ed5a4e18dc16053e56d1341b061
--- /dev/null
+++ b/Source/Processors/HDF5FileFormat.h
@@ -0,0 +1,201 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#ifndef HDF5FILEFORMAT_H_INCLUDED
+#define HDF5FILEFORMAT_H_INCLUDED
+
+#include "../../JuceLibraryCode/JuceHeader.h"
+
+class HDF5RecordingData;
+namespace H5
+{
+class DataSet;
+class H5File;
+class DataType;
+}
+
+struct HDF5RecordingInfo
+{
+    String name;
+    int64 start_time;
+    uint32 start_sample;
+    float sample_rate;
+    uint32 bit_depth;
+};
+
+class HDF5FileBase
+{
+public:
+    HDF5FileBase();
+    ~HDF5FileBase();
+
+    int open();
+    void close();
+    virtual String getFileName() = 0;
+    bool isOpen() const;
+    typedef enum DataTypes { U8, U16, U32, U64, I8, I16, I32, I64, F32} DataTypes;
+
+    static H5::DataType getNativeType(DataTypes type);
+    static H5::DataType getH5Type(DataTypes type);
+
+protected:
+
+    virtual int createFileStructure() = 0;
+
+    int setAttribute(DataTypes type, void* data, String path, String name);
+    int setAttributeStr(String value, String path, String name);
+    int createGroup(String path);
+
+    HDF5RecordingData* getDataSet(String path);
+
+    //aliases for createDataSet
+    HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int chunkX, String path);
+    HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int chunkX, String path);
+    HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, String path);
+    HDF5RecordingData* createDataSet(DataTypes type, int sizeX, int sizeY, int sizeZ, int chunkX, int chunkY, String path);
+
+    bool readyToOpen;
+
+private:
+    //create an extendable dataset
+    HDF5RecordingData* createDataSet(DataTypes type, int dimension, int* size, int* chunking, String path);
+    int open(bool newfile);
+    ScopedPointer<H5::H5File> file;
+    bool opened;
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5FileBase);
+};
+
+class HDF5RecordingData
+{
+public:
+    HDF5RecordingData(H5::DataSet* data);
+    ~HDF5RecordingData();
+
+    int writeDataBlock(int xDataSize, HDF5FileBase::DataTypes type, void* data);
+    int writeDataBlock(int xDataSize, int yDataSize, HDF5FileBase::DataTypes type, void* data);
+
+    int prepareDataBlock(int xDataSize);
+    int writeDataRow(int yPos, int xDataSize, HDF5FileBase::DataTypes type, void* data);
+
+private:
+    int xPos;
+    int xChunkSize;
+    int size[3];
+    int dimension;
+    int rowXPos;
+    int rowDataSize;
+    ScopedPointer<H5::DataSet> dSet;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5RecordingData);
+};
+
+class KWDFile : public HDF5FileBase
+{
+public:
+    KWDFile(int processorNumber, String basename);
+    KWDFile();
+    ~KWDFile();
+    void initFile(int processorNumber, String basename);
+    void startNewRecording(int recordingNumber, int nChannels, HDF5RecordingInfo* info);
+    void stopRecording();
+    void writeBlockData(int16* data, int nSamples);
+    void writeRowData(int16* data, int nSamples);
+    String getFileName();
+
+protected:
+    int createFileStructure();
+
+private:
+    int recordingNumber;
+    int nChannels;
+    int curChan;
+    String filename;
+    ScopedPointer<HDF5RecordingData> recdata;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWDFile);
+};
+
+class KWIKFile : public HDF5FileBase
+{
+public:
+    KWIKFile(String basename);
+    KWIKFile();
+    ~KWIKFile();
+    void initFile(String basename);
+    void startNewRecording(int recordingNumber, HDF5RecordingInfo* info);
+    void stopRecording();
+    void writeEvent(int type, uint8 id, uint8 processor, uint8 channel, uint64 timestamp);
+    void addKwdFile(String filename);
+    void addEventType(String name);
+    String getFileName();
+
+protected:
+    int createFileStructure();
+
+private:
+    int recordingNumber;
+    String filename;
+    OwnedArray<HDF5RecordingData> timeStamps;
+    OwnedArray<HDF5RecordingData> recordings;
+    OwnedArray<HDF5RecordingData> eventID;
+    OwnedArray<HDF5RecordingData> nodeID;
+    OwnedArray<HDF5RecordingData> channelID;
+    Array<String> eventNames;
+    int kwdIndex;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWIKFile);
+};
+
+class KWXFile : public HDF5FileBase
+{
+public:
+    KWXFile(String basename);
+    KWXFile();
+    ~KWXFile();
+    void initFile(String basename);
+    void startNewRecording(int recordingNumber);
+    void stopRecording();
+    void addChannelGroup(int nChannels);
+    void resetChannels();
+    void writeSpike(int groupIndex, int nSamples, const uint16* data, uint64 timestamp);
+    String getFileName();
+
+protected:
+    int createFileStructure();
+
+private:
+    int createChannelGroup(int index);
+    int recordingNumber;
+    String filename;
+    OwnedArray<HDF5RecordingData> spikeArray;
+    OwnedArray<HDF5RecordingData> recordingArray;
+    OwnedArray<HDF5RecordingData> timeStamps;
+    Array<int> channelArray;
+    int numElectrodes;
+    int16* transformVector;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(KWXFile);
+};
+
+#endif  // HDF5FILEFORMAT_H_INCLUDED
diff --git a/Source/Processors/HDF5Recording.cpp b/Source/Processors/HDF5Recording.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f9b89c5d98af6406e4c49930b5555a35fae75c29
--- /dev/null
+++ b/Source/Processors/HDF5Recording.cpp
@@ -0,0 +1,171 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#include "HDF5Recording.h"
+#define MAX_BUFFER_SIZE 10000
+
+HDF5Recording::HDF5Recording() : processorIndex(-1)
+{
+    timestamp = 0;
+    scaledBuffer = new float[MAX_BUFFER_SIZE];
+    intBuffer = new int16[MAX_BUFFER_SIZE];
+}
+
+HDF5Recording::~HDF5Recording()
+{
+    delete scaledBuffer;
+    delete intBuffer;
+}
+
+void HDF5Recording::updateTimeStamp(int64 timestamp)
+{
+    this->timestamp = timestamp;
+}
+
+void HDF5Recording::registerProcessor(GenericProcessor* proc)
+{
+    HDF5RecordingInfo* info = new HDF5RecordingInfo();
+    info->sample_rate = proc->getSampleRate();
+    info->bit_depth = 16;
+    infoArray.add(info);
+    fileArray.add(new KWDFile());
+    activeChannelCount.add(0);
+    processorIndex++;
+}
+
+void HDF5Recording::resetChannels()
+{
+    processorIndex = -1;
+    fileArray.clear();
+    activeChannelCount.clear();
+    processorMap.clear();
+    infoArray.clear();
+    if (spikesFile)
+        spikesFile->resetChannels();
+}
+
+void HDF5Recording::addChannel(int index, Channel* chan)
+{
+    processorMap.add(processorIndex);
+}
+
+void HDF5Recording::openFiles(File rootFolder,  int experimentNumber, int recordingNumber)
+{
+    String basepath = rootFolder.getFullPathName() + rootFolder.separatorString + "experiment" + String(experimentNumber);
+    //KWIK file
+    mainFile->initFile(basepath);
+    mainFile->open();
+
+    //KWX file
+    spikesFile->initFile(basepath);
+    spikesFile->open();
+    spikesFile->startNewRecording(recordingNumber);
+
+    //Let's just put the first processor (usually the source node) on the KWIK for now
+    infoArray[0]->name = String("Open-Ephys Recording #") + String(recordingNumber);
+    infoArray[0]->start_time = timestamp;
+    infoArray[0]->start_sample = 0;
+    mainFile->startNewRecording(recordingNumber,infoArray[0]);
+
+    //KWD files
+    for (int i = 0; i < processorMap.size(); i++)
+    {
+        int index = processorMap[i];
+        if (getChannel(i)->getRecordState())
+        {
+            if (!fileArray[index]->isOpen())
+            {
+                fileArray[index]->initFile(getChannel(i)->nodeId,basepath);
+                fileArray[index]->open();
+            }
+            activeChannelCount.set(index,activeChannelCount[index]+1);
+        }
+    }
+    for (int i = 0; i < fileArray.size(); i++)
+    {
+        if (fileArray[i]->isOpen())
+        {
+            File f(fileArray[i]->getFileName());
+            mainFile->addKwdFile(f.getFileName());
+
+            infoArray[i]->name = String("Open-Ephys Recording #") + String(recordingNumber);
+            infoArray[i]->start_time = timestamp;
+            infoArray[i]->start_sample = 0;
+            fileArray[i]->startNewRecording(recordingNumber,activeChannelCount[i],infoArray[i]);
+        }
+    }
+}
+
+void HDF5Recording::closeFiles()
+{
+    mainFile->stopRecording();
+    mainFile->close();
+    spikesFile->stopRecording();
+    spikesFile->close();
+    for (int i = 0; i < fileArray.size(); i++)
+    {
+        fileArray[i]->stopRecording();
+        fileArray[i]->close();
+        activeChannelCount.set(i,0);
+    }
+}
+
+void HDF5Recording::writeData(AudioSampleBuffer& buffer, int nSamples)
+{
+    int index;
+    for (int i = 0; i < buffer.getNumChannels(); i++)
+    {
+        if (getChannel(i)->getRecordState())
+        {
+            double multFactor = 1/(float(0x7fff) * getChannel(i)->bitVolts);
+            int index = processorMap[getChannel(i)->recordIndex];
+            FloatVectorOperations::copyWithMultiply(scaledBuffer,buffer.getReadPointer(i,0),multFactor,nSamples);
+            AudioDataConverters::convertFloatToInt16LE(scaledBuffer,intBuffer,nSamples);
+            fileArray[index]->writeRowData(intBuffer,nSamples);
+        }
+    }
+}
+
+void HDF5Recording::writeEvent(int eventType, MidiMessage& event, int samplePosition)
+{
+    const uint8* dataptr = event.getRawData();
+    //right now only written events are TTL, so type = 0
+    mainFile->writeEvent(0,*(dataptr+2),*(dataptr+1),*(dataptr+3),timestamp+samplePosition);
+}
+
+void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
+{
+    spikesFile->addChannelGroup(elec->numChannels);
+}
+void HDF5Recording::writeSpike(const SpikeObject& spike, int electrodeIndex)
+{
+    spikesFile->writeSpike(electrodeIndex,spike.nSamples,spike.data,spike.timestamp);
+}
+
+void HDF5Recording::startAcquisition()
+{
+    mainFile = new KWIKFile();
+    mainFile->addEventType("TTL");
+    spikesFile = new KWXFile();
+}
+
diff --git a/Source/Processors/HDF5Recording.h b/Source/Processors/HDF5Recording.h
new file mode 100644
index 0000000000000000000000000000000000000000..525c3ca6b047c43468f86e6c4a3604339384e795
--- /dev/null
+++ b/Source/Processors/HDF5Recording.h
@@ -0,0 +1,65 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#ifndef HDF5RECORDING_H_INCLUDED
+#define HDF5RECORDING_H_INCLUDED
+
+#include "RecordEngine.h"
+#include "HDF5FileFormat.h"
+
+class HDF5Recording : public RecordEngine
+{
+public:
+    HDF5Recording();
+    ~HDF5Recording();
+    void openFiles(File rootFolder, int experimentNumber, int recordingNumber);
+    void closeFiles();
+    void writeData(AudioSampleBuffer& buffer, int nSamples);
+    void writeEvent(int eventType, MidiMessage& event, int samplePosition);
+    void addChannel(int index, Channel* chan);
+    void addSpikeElectrode(int index, SpikeRecordInfo* elec);
+    void writeSpike(const SpikeObject& spike, int electrodeIndex);
+    void registerProcessor(GenericProcessor* processor);
+    void resetChannels();
+    void updateTimeStamp(int64 timestamp);
+    void startAcquisition();
+
+private:
+
+    int processorIndex;
+
+    Array<int> processorMap;
+    Array<int> activeChannelCount;
+    OwnedArray<KWDFile> fileArray;
+    OwnedArray<HDF5RecordingInfo> infoArray;
+    ScopedPointer<KWIKFile> mainFile;
+    ScopedPointer<KWXFile> spikesFile;
+    float* scaledBuffer;
+    int16* intBuffer;
+    int64 timestamp;
+
+	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(HDF5Recording);
+};
+
+
+#endif  // HDF5RECORDING_H_INCLUDED
diff --git a/Source/Processors/OriginalRecording.cpp b/Source/Processors/OriginalRecording.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c858c793894aeaef6c337f4fdf5429ba3ba5b93f
--- /dev/null
+++ b/Source/Processors/OriginalRecording.cpp
@@ -0,0 +1,538 @@
+/*
+------------------------------------------------------------------
+
+This file is part of the Open Ephys GUI
+Copyright (C) 2013 Florian Franzen
+
+------------------------------------------------------------------
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "OriginalRecording.h"
+#include "../Audio/AudioComponent.h"
+
+OriginalRecording::OriginalRecording() : separateFiles(true), eventFile(nullptr),
+    recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0)
+{
+    continuousDataIntegerBuffer = new int16[10000];
+    continuousDataFloatBuffer = new float[10000];
+
+    recordMarker = new char[10];
+    for (int i = 0; i < 9; i++)
+    {
+        recordMarker[i] = i;
+    }
+    recordMarker[9] = 255;
+
+    zeroBuffer.clear();
+}
+
+OriginalRecording::~OriginalRecording()
+{
+    //Cleanup just in case
+    for (int i=0; i < fileArray.size(); i++)
+    {
+        if (fileArray[i] != nullptr) fclose(fileArray[i]);
+    }
+    for (int i=0; i < spikeFileArray.size(); i++)
+    {
+        if (spikeFileArray[i] != nullptr) fclose(spikeFileArray[i]);
+    }
+    delete continuousDataFloatBuffer;
+    delete continuousDataIntegerBuffer;
+    delete recordMarker;
+}
+
+void OriginalRecording::addChannel(int index, Channel* chan)
+{
+    //Just populate the file array with null so we can address it by index afterwards
+    fileArray.add(nullptr);
+}
+
+void OriginalRecording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
+{
+    spikeFileArray.add(nullptr);
+}
+
+void OriginalRecording::resetChannels()
+{
+    fileArray.clear();
+    spikeFileArray.clear();
+}
+
+void OriginalRecording::openFiles(File rootFolder, int experimentNumber, int recordingNumber)
+{
+    this->recordingNumber = recordingNumber;
+    this->experimentNumber = experimentNumber;
+    openFile(rootFolder,nullptr);
+    for (int i = 0; i < fileArray.size(); i++)
+    {
+        if (getChannel(i)->getRecordState())
+        {
+            openFile(rootFolder,getChannel(i));
+        }
+    }
+    for (int i = 0; i < spikeFileArray.size(); i++)
+    {
+        openSpikeFile(rootFolder,getSpikeElectrode(i));
+    }
+    blockIndex = 0;
+}
+
+void OriginalRecording::openFile(File rootFolder, Channel* ch)
+{
+    FILE* chFile;
+    bool isEvent;
+    String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString);
+
+    std::cout << "OPENING FILE: " << fullPath << std::endl;
+
+    isEvent = (ch == nullptr) ? true : false;
+    if (isEvent)
+        fullPath += "experiment" + String(experimentNumber) + "_all_channels.events";
+    else
+        fullPath += getFileName(ch);
+
+    File f = File(fullPath);
+
+    bool fileExists = f.exists();
+
+    diskWriteLock.enter();
+
+    chFile = fopen(fullPath.toUTF8(), "ab");
+
+    if (!fileExists)
+    {
+        // create and write header
+        std::cout << "Writing header." << std::endl;
+        String header = generateHeader(ch);
+        //std::cout << header << std::endl;
+        std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl;
+
+
+        fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile);
+
+        std::cout << "Wrote header." << std::endl;
+
+        std::cout << "Block index: " << blockIndex << std::endl;
+
+    }
+    else
+    {
+        std::cout << "File already exists, just opening." << std::endl;
+    }
+
+    diskWriteLock.exit();
+
+    if (isEvent)
+        eventFile = chFile;
+    else
+        fileArray.set(ch->recordIndex,chFile);
+
+}
+
+void OriginalRecording::openSpikeFile(File rootFolder, SpikeRecordInfo* elec)
+{
+
+    FILE* spFile;
+    String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString);
+    fullPath += "experiment" + String(experimentNumber) + "_";
+    fullPath += elec->name.removeCharacters(" ");
+    fullPath += ".spikes";
+
+    std::cout << "OPENING FILE: " << fullPath << std::endl;
+
+    File f = File(fullPath);
+
+    bool fileExists = f.exists();
+
+    diskWriteLock.enter();
+
+    spFile = fopen(fullPath.toUTF8(),"ab");
+
+    if (!fileExists)
+    {
+        String header = generateSpikeHeader(elec);
+        fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), spFile);
+    }
+    diskWriteLock.exit();
+    spikeFileArray.set(elec->recordIndex,spFile);
+
+}
+
+String OriginalRecording::getFileName(Channel* ch)
+{
+    String filename;
+
+    filename += "experiment" + String(experimentNumber) + "_";
+    filename += ch->nodeId;
+    filename += "_";
+    filename += ch->name;
+
+    if (separateFiles)
+    {
+        filename += "_";
+        filename += recordingNumber;
+    }
+    filename += ".continuous";
+
+    return filename;
+}
+
+String OriginalRecording::generateHeader(Channel* ch)
+{
+
+    String header = "header.format = 'Open Ephys Data Format'; \n";
+
+    header += "header.version = 0.2;";
+    header += "header.header_bytes = ";
+    header += String(HEADER_SIZE);
+    header += ";\n";
+
+    if (ch == nullptr)
+    {
+        header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, one uint8 event channel, and one uint16 recordingNumber'; \n";
+
+    }
+    else
+    {
+        header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), 1 uint16 recordingNumber, N 16-bit samples, and one 10-byte record marker (0 1 2 3 4 5 6 7 8 255)'; \n";
+    }
+
+
+    header += "header.date_created = '";
+    header += generateDateString();
+    header += "';\n";
+
+    header += "header.channel = '";
+    header += (ch != nullptr) ? ch->name : "Events";
+    header += "';\n";
+
+    if (ch == nullptr)
+    {
+
+        header += "header.channelType = 'Event';\n";
+    }
+    else
+    {
+        header += "header.channelType = 'Continuous';\n";
+    }
+
+    header += "header.sampleRate = ";
+    // all channels need to have the same sample rate under the current scheme
+    header += String(getChannel(0)->sampleRate);
+    header += ";\n";
+    header += "header.blockLength = ";
+    header += BLOCK_LENGTH;
+    header += ";\n";
+    header += "header.bufferSize = ";
+    header += getAudioComponent()->getBufferSize();
+    header += ";\n";
+    header += "header.bitVolts = ";
+    header += (ch != nullptr) ? String(ch->bitVolts) : "1";
+    header += ";\n";
+
+    header = header.paddedRight(' ', HEADER_SIZE);
+
+    //std::cout << header << std::endl;
+
+    return header;
+
+}
+
+String OriginalRecording::generateSpikeHeader(SpikeRecordInfo* elec)
+{
+    String header = "header.format = 'Open Ephys Data Format'; \n";
+    header += "header.version = 0.2;";
+    header += "header.header_bytes = ";
+    header += String(HEADER_SIZE);
+    header += ";\n";
+
+    header += "header.description = 'Each record contains 1 uint8 eventType, 1 uint64 timestamp, 1 uint16 electrodeID, 1 uint16 numChannels (n), 1 uint16 numSamples (m), n*m uint16 samples, n uint16 channelGains, n uint16 thresholds, and 1 uint16 recordingNumber'; \n";
+
+    header += "header.date_created = '";
+    header += generateDateString();
+    header += "';\n";
+
+    header += "header.electrode = '";
+    header += elec->name;
+    header += "';\n";
+
+    header += "header.num_channels = ";
+    header += elec->numChannels;
+    header += ";\n";
+
+    header += "header.sampleRate = ";
+    header += String(elec->sampleRate);
+    header += ";\n";
+
+    header = header.paddedRight(' ', HEADER_SIZE);
+
+    //std::cout << header << std::endl;
+
+    return header;
+}
+
+void OriginalRecording::writeEvent(int eventType, MidiMessage& event, int samplePosition)
+{
+    // find file and write samples to disk
+    // std::cout << "Received event!" << std::endl;
+
+    if (eventFile == nullptr)
+        return;
+
+    const uint8* dataptr = event.getRawData();
+
+
+    uint64 samplePos = (uint64) samplePosition;
+
+    int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp
+
+    diskWriteLock.enter();
+
+    fwrite(&eventTimestamp,					// ptr
+           8,   							// size of each element
+           1, 		  						// count
+           eventFile);   			// ptr to FILE object
+
+    fwrite(&samplePos,							// ptr
+           2,   							// size of each element
+           1, 		  						// count
+           eventFile);   			// ptr to FILE object
+
+    // write 1st four bytes of event (type, nodeId, eventId, eventChannel)
+    fwrite(dataptr, 1, 4, eventFile);
+
+    // write recording number
+    fwrite(&recordingNumber,                     // ptr
+           2,                               // size of each element
+           1,                               // count
+           eventFile);             // ptr to FILE object
+
+    diskWriteLock.exit();
+}
+
+void OriginalRecording::writeData(AudioSampleBuffer& buffer, int nSamples)
+{
+    int samplesWritten = 0;
+
+    while (samplesWritten < nSamples) // there are still unwritten samples in the buffer
+    {
+
+        int numSamplesToWrite = nSamples - samplesWritten; // samples remaining in the buffer
+
+        if (blockIndex + numSamplesToWrite < BLOCK_LENGTH) // we still have space in this block
+        {
+            for (int i = 0; i < buffer.getNumChannels(); i++)
+            {
+
+                if (getChannel(i)->getRecordState())
+                {
+                    // write buffer to disk!
+                    writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten),
+                                          numSamplesToWrite,
+                                          i);
+
+
+                }
+            }
+
+            // update our variables
+            samplesWritten += numSamplesToWrite;
+            timestamp += numSamplesToWrite;
+            blockIndex += numSamplesToWrite;
+
+        }
+        else // there's not enough space left in this block for all remaining samples
+        {
+
+            numSamplesToWrite = BLOCK_LENGTH - blockIndex;
+
+            for (int i = 0; i < buffer.getNumChannels(); i++)
+            {
+
+                if (getChannel(i)->getRecordState())
+                {
+                    // write buffer to disk!
+                    writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten),
+                                          numSamplesToWrite,
+                                          i);
+
+                    //std::cout << "Record channel " << i << std::endl;
+                }
+            }
+
+            // update our variables
+            samplesWritten += numSamplesToWrite;
+            timestamp += numSamplesToWrite;
+            blockIndex = 0; // back to the beginning of the block
+
+        }
+    }
+}
+
+void OriginalRecording::writeContinuousBuffer(const float* data, int nSamples, int channel)
+{
+    // check to see if the file exists
+    if (fileArray[channel] == nullptr)
+        return;
+
+    // scale the data back into the range of int16
+    float scaleFactor =  float(0x7fff) * getChannel(channel)->bitVolts;
+    for (int n = 0; n < nSamples; n++)
+    {
+        *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor;
+    }
+    AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples);
+
+    if (blockIndex == 0)
+    {
+        writeTimestampAndSampleCount(fileArray[channel]);
+    }
+
+    diskWriteLock.enter();
+
+    size_t count = fwrite(continuousDataIntegerBuffer, // ptr
+                          2,                               // size of each element
+                          nSamples,                        // count
+                          fileArray[channel]); // ptr to FILE object
+
+    jassert(count == nSamples); // make sure all the data was written
+
+    diskWriteLock.exit();
+
+    if (blockIndex + nSamples == BLOCK_LENGTH)
+    {
+        writeRecordMarker(fileArray[channel]);
+    }
+}
+
+void OriginalRecording::writeTimestampAndSampleCount(FILE* file)
+{
+    diskWriteLock.enter();
+
+    uint16 samps = BLOCK_LENGTH;
+
+    fwrite(&timestamp,                       // ptr
+           8,                               // size of each element
+           1,                               // count
+           file); // ptr to FILE object
+
+    fwrite(&samps,                           // ptr
+           2,                               // size of each element
+           1,                               // count
+           file); // ptr to FILE object
+
+    fwrite(&recordingNumber,                         // ptr
+           2,                               // size of each element
+           1,                               // count
+           file); // ptr to FILE object
+
+    diskWriteLock.exit();
+}
+
+void OriginalRecording::writeRecordMarker(FILE* file)
+{
+    // write a 10-byte marker indicating the end of a record
+
+    diskWriteLock.enter();
+    fwrite(recordMarker,        // ptr
+           1,                   // size of each element
+           10,                  // count
+           file);               // ptr to FILE object
+
+    diskWriteLock.exit();
+}
+
+void OriginalRecording::closeFiles()
+{
+    for (int i = 0; i < fileArray.size(); i++)
+    {
+        if (fileArray[i] != nullptr)
+        {
+            if (blockIndex < BLOCK_LENGTH)
+            {
+                // fill out the rest of the current buffer
+                writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, i);
+                diskWriteLock.enter();
+                fclose(fileArray[i]);
+                fileArray.set(i,nullptr);
+                diskWriteLock.exit();
+            }
+        }
+    }
+    for (int i = 0; i < spikeFileArray.size(); i++)
+    {
+        if (spikeFileArray[i] != nullptr)
+        {
+            diskWriteLock.enter();
+            fclose(spikeFileArray[i]);
+            spikeFileArray.set(i,nullptr);
+            diskWriteLock.exit();
+        }
+    }
+    if (eventFile != nullptr)
+    {
+        diskWriteLock.enter();
+        fclose(eventFile);
+        eventFile = nullptr;
+        diskWriteLock.exit();
+    }
+    blockIndex = 0;
+}
+
+void OriginalRecording::updateTimeStamp(int64 timestamp)
+{
+    this->timestamp = timestamp;
+}
+
+void OriginalRecording::writeSpike(const SpikeObject& spike, int electrodeIndex)
+{
+    uint8_t spikeBuffer[MAX_SPIKE_BUFFER_LEN];
+
+    if (spikeFileArray[electrodeIndex] == nullptr)
+        return;
+
+    packSpike(&spike, spikeBuffer, MAX_SPIKE_BUFFER_LEN);
+
+    int totalBytes = spike.nSamples * spike.nChannels * 2 + // account for samples
+                     spike.nChannels * 4 +            // acount for threshold and gain
+                     15;                        // 15 bytes in every SpikeObject
+
+
+    // format:
+    // 1 byte of event type (always = 4 for spikes)
+    // 8 bytes for 64-bit timestamp
+    // 2 bytes for 16-bit electrode ID
+    // 2 bytes for 16-bit number of channels (n)
+    // 2 bytes for 16-bit number of samples (m)
+    // 2*n*m bytes for 16-bit samples
+    // 2*n bytes for 16-bit gains
+    // 2*n bytes for 16-bit thresholds
+
+    // const MessageManagerLock mmLock;
+
+    diskWriteLock.enter();
+
+    fwrite(spikeBuffer, 1, totalBytes, spikeFileArray[electrodeIndex]);
+
+    fwrite(&recordingNumber,                         // ptr
+           2,                               // size of each element
+           1,                               // count
+           spikeFileArray[electrodeIndex]); // ptr to FILE object
+
+    diskWriteLock.exit();
+}
\ No newline at end of file
diff --git a/Source/Processors/OriginalRecording.h b/Source/Processors/OriginalRecording.h
new file mode 100644
index 0000000000000000000000000000000000000000..99c6f0a716965fd712e3037ccb9d254663130008
--- /dev/null
+++ b/Source/Processors/OriginalRecording.h
@@ -0,0 +1,91 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#ifndef ORIGINALRECORDING_H_INCLUDED
+#define ORIGINALRECORDING_H_INCLUDED
+
+#include "../../JuceLibraryCode/JuceHeader.h"
+
+#include "RecordEngine.h"
+#include <stdio.h>
+
+#define HEADER_SIZE 1024
+#define BLOCK_LENGTH 1024
+
+class OriginalRecording : public RecordEngine
+{
+public:
+    OriginalRecording();
+    ~OriginalRecording();
+
+    void openFiles(File rootFolder, int experimentNumber, int recordingNumber);
+    void closeFiles();
+    void writeData(AudioSampleBuffer& buffer, int nSamples);
+    void writeEvent(int eventType, MidiMessage& event, int samplePosition);
+    void addChannel(int index, Channel* chan);
+    void resetChannels();
+    void updateTimeStamp(int64 timestamp);
+    void addSpikeElectrode(int index, SpikeRecordInfo* elec);
+    void writeSpike(const SpikeObject& spike, int electrodeIndex);
+
+private:
+    String getFileName(Channel* ch);
+    void openFile(File rootFolder, Channel* ch);
+    String generateHeader(Channel* ch);
+    void writeContinuousBuffer(const float* data, int nSamples, int channel);
+    void writeTimestampAndSampleCount(FILE* file);
+    void writeRecordMarker(FILE* file);
+
+    void openSpikeFile(File rootFolder, SpikeRecordInfo* elec);
+    String generateSpikeHeader(SpikeRecordInfo* elec);
+
+    bool separateFiles;
+    int blockIndex;
+    int recordingNumber;
+    int experimentNumber;
+
+    /** Holds data that has been converted from float to int16 before
+        saving.
+    */
+    int16* continuousDataIntegerBuffer;
+
+    /** Holds data that has been converted from float to int16 before
+        saving.
+    */
+    float* continuousDataFloatBuffer;
+
+    /** Used to indicate the end of each record */
+    char* recordMarker;
+
+    AudioSampleBuffer zeroBuffer;
+    int64 timestamp;
+
+    FILE* eventFile;
+    Array<FILE*> fileArray;
+    Array<FILE*> spikeFileArray;
+    CriticalSection diskWriteLock;
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(OriginalRecording);
+};
+
+#endif  // ORIGINALRECORDING_H_INCLUDED
diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp
index b57ee2d7946530ef29ec103f91ecdcd7875a59c2..332429f776c414d30d35894affb9a1c9a5245541 100644
--- a/Source/Processors/ProcessorGraph.cpp
+++ b/Source/Processors/ProcessorGraph.cpp
@@ -98,7 +98,6 @@ void ProcessorGraph::createDefaultNodes()
     addNode(recn, RECORD_NODE_ID);
     addNode(an, AUDIO_NODE_ID);
     addNode(arn, RESAMPLING_NODE_ID);
-
 }
 
 void ProcessorGraph::updatePointers()
@@ -436,6 +435,7 @@ void ProcessorGraph::connectProcessorToAudioAndRecordNodes(GenericProcessor* sou
     if (source == nullptr)
         return;
 
+	getRecordNode()->registerProcessor(source);
     for (int chan = 0; chan < source->getNumOutputs(); chan++)
     {
 
@@ -782,11 +782,7 @@ void ProcessorGraph::setRecordState(bool isRecording)
         {
             GenericProcessor* p = (GenericProcessor*) node->getProcessor();
 
-            if (isRecording)
-                p->startRecording();
-            else
-                p->stopRecording();
-
+			p->setRecording(isRecording);
         }
     }
 
diff --git a/Source/Processors/RecordEngine.cpp b/Source/Processors/RecordEngine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6a9496bc6588c229ecf4bd1fa41c9021e4e57c10
--- /dev/null
+++ b/Source/Processors/RecordEngine.cpp
@@ -0,0 +1,57 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#include "RecordEngine.h"
+#include "RecordNode.h"
+#include "ProcessorGraph.h"
+
+RecordEngine::RecordEngine() {}
+
+RecordEngine::~RecordEngine() {}
+
+void RecordEngine::resetChannels() {}
+
+void RecordEngine::registerProcessor(GenericProcessor* processor) {}
+
+Channel* RecordEngine::getChannel(int index)
+{
+    return getProcessorGraph()->getRecordNode()->getDataChannel(index);
+}
+
+String RecordEngine::generateDateString()
+{
+    return getProcessorGraph()->getRecordNode()->generateDateString();
+}
+
+SpikeRecordInfo* RecordEngine::getSpikeElectrode(int index)
+{
+    return getProcessorGraph()->getRecordNode()->getSpikeElectrode(index);
+}
+
+void RecordEngine::updateTimeStamp(int64 timestamp) {}
+
+void RecordEngine::registerSpikeSource(GenericProcessor* processor) {}
+
+void RecordEngine::startAcquisition() {}
+
+void RecordEngine::directoryChanged() {}
\ No newline at end of file
diff --git a/Source/Processors/RecordEngine.h b/Source/Processors/RecordEngine.h
new file mode 100644
index 0000000000000000000000000000000000000000..ec677a13a9aaae13861182837f3758c1be6e6048
--- /dev/null
+++ b/Source/Processors/RecordEngine.h
@@ -0,0 +1,143 @@
+/*
+ ------------------------------------------------------------------
+
+ This file is part of the Open Ephys GUI
+ Copyright (C) 2013 Florian Franzen
+
+ ------------------------------------------------------------------
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#ifndef RECORDENGINE_H_INCLUDED
+#define RECORDENGINE_H_INCLUDED
+
+#include "../../JuceLibraryCode/JuceHeader.h"
+#include "Channel.h"
+#include "GenericProcessor.h"
+#include "Visualization/SpikeObject.h"
+
+struct SpikeRecordInfo
+{
+    String name;
+    int numChannels;
+    int sampleRate;
+
+    int recordIndex;
+};
+
+class RecordNode;
+
+class RecordEngine : public AccessClass
+{
+public:
+    RecordEngine();
+    ~RecordEngine();
+	/** All the public methods are called by RecordNode:
+	When acquisition starts (in the specified order):
+		1-resetChannels
+		2-registerProcessor, addChannel, registerSpikeSource, addspikeelectrode
+		3-startAcquisition
+	When recording starts (in the specified order):
+		1-directoryChanged (if needed)
+		2-openFiles
+	During recording:
+		writeData, writeEvent, writeSpike, updateTimeStamp
+	When recording stops:
+		closeFiles
+	*/
+
+	/** Called when recording starts to open all needed files
+	*/
+    virtual void openFiles(File rootFolder, int experimentNumber, int recordingNumber) = 0;
+	
+	/** Called when recording stops to close all files
+		and do all the necessary cleanups
+	*/
+    virtual void closeFiles() = 0;
+
+	/** Write continuous data.
+		This method gets the full data buffer, it must query getRecordState for
+		each registered channel to determine which channels to actually write to disk
+	*/
+    virtual void writeData(AudioSampleBuffer& buffer, int nSamples) = 0;
+
+	/** Write a single event to disk.
+	*/
+    virtual void writeEvent(int eventType, MidiMessage& event, int samplePosition) = 0;
+	
+	/** Called when acquisition starts once for each processor that might record continuous data
+	*/
+	virtual void registerProcessor(GenericProcessor* processor);
+
+	/** Called after registerProcessor, once for each output
+		channel of the processor
+	*/
+	virtual void addChannel(int index, Channel* chan) = 0;
+
+	/** Called when acquisition starts once for each processor that might record spikes
+	*/
+	virtual void registerSpikeSource(GenericProcessor* processor);
+
+	/** Called after registerSpikesource, once for each channel group
+	*/
+    virtual void addSpikeElectrode(int index, SpikeRecordInfo* elec) = 0;
+
+	/** Write a spike to disk
+	*/
+    virtual void writeSpike(const SpikeObject& spike, int electrodeIndex) = 0;
+
+	/** Called when a new acquisition starts, to clean all channel data 
+		before registering the processors
+	*/
+    virtual void resetChannels();
+
+	/** Called every time a new timestamp event is received
+	*/
+    virtual void updateTimeStamp(int64 timestamp);
+
+	/** Called after all channels and spike groups have been registered, 
+		just before acquisition starts
+	*/
+    virtual void startAcquisition();
+
+	/** Called when the recording directory changes during an acquisition
+	*/
+    virtual void directoryChanged();
+
+protected:
+	/** Functions to access RecordNode arrays and utilities
+	*/
+
+	/** Gets the specified channel from the channel array stored in RecordNode
+	*/
+    Channel* getChannel(int index);
+
+	/** Gets the specified channel group info structure from the array stored in RecordNode
+	*/
+    SpikeRecordInfo* getSpikeElectrode(int index);
+
+	/** Generate a Matlab-compatible datestring 
+	*/
+    String generateDateString();
+
+private:
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordEngine);
+};
+
+
+
+#endif  // RECORDENGINE_H_INCLUDED
diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp
index ac5efeb50095417cd632b4e5917c3ab718bd2ebb..249475f1ce0e2f0e8f9f9b20e8a1f4e71eeb3ae4 100755
--- a/Source/Processors/RecordNode.cpp
+++ b/Source/Processors/RecordNode.cpp
@@ -1,23 +1,23 @@
 /*
-    ------------------------------------------------------------------
+------------------------------------------------------------------
 
-    This file is part of the Open Ephys GUI
-    Copyright (C) 2013 Open Ephys
+This file is part of the Open Ephys GUI
+Copyright (C) 2013 Open Ephys
 
-    ------------------------------------------------------------------
+------------------------------------------------------------------
 
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
@@ -26,22 +26,22 @@
 #include "../UI/EditorViewport.h"
 #include "../UI/ControlPanel.h"
 
+#define EVERY_ENGINE for(int eng = 0; eng < engineArray.size(); eng++) engineArray[eng]
+
+
+
 #include "Channel.h"
 
 RecordNode::RecordNode()
     : GenericProcessor("Record Node"),
-      newDirectoryNeeded(true),  zeroBuffer(1, 50000),  timestamp(0),
-      appendTrialNum(false), trialNum(0)
+      newDirectoryNeeded(true),  timestamp(0)
 {
 
     isProcessing = false;
     isRecording = false;
     allFilesOpened = false;
-    blockIndex = 0;
     signalFilesShouldClose = false;
 
-    continuousDataIntegerBuffer = new int16[10000];
-    continuousDataFloatBuffer = new float[10000];
     signalFilesShouldClose = false;
 
     settings.numInputs = 2048;
@@ -49,21 +49,17 @@ RecordNode::RecordNode()
 
     eventChannel = new Channel(this, 0);
     eventChannel->setType(EVENT_CHANNEL);
+    recordingNumber = 0;
 
-    recordMarker = new char[10];
-    for (int i = 0; i < 9; i++)
-    {
-        recordMarker[i] = i;
-    }
-    recordMarker[9] = 255;
 
-    recordingNumber = 0;
+    spikeElectrodeIndex = 0;
+
+    experimentNumber = 0;
+    hasRecorded = false;
 
     // 128 inputs, 0 outputs
     setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128);
 
-    zeroBuffer.clear();
-
 }
 
 
@@ -118,11 +114,13 @@ void RecordNode::resetConnections()
     //std::cout << "Resetting connections" << std::endl;
     nextAvailableChannel = 0;
     wasConnected = false;
+    spikeElectrodeIndex = 0;
 
     channelPointers.clear();
     eventChannelPointers.clear();
+    spikeElectrodePointers.clear();
 
-
+    EVERY_ENGINE->resetChannels();
 
 }
 
@@ -188,29 +186,14 @@ void RecordNode::addInputChannel(GenericProcessor* sourceNode, int chan)
 
         int channelIndex = getNextChannel(false);
 
-        setPlayConfigDetails(channelIndex+1,0,44100.0,128);
-
         channelPointers.add(sourceNode->channels[chan]);
+        setPlayConfigDetails(channelIndex+1,0,44100.0,128);
 
         //   std::cout << channelIndex << std::endl;
 
-        updateFileName(channelPointers[channelIndex]);
-
-
-
-        //if (channelPointers[channelIndex]->isRecording)
-        //	std::cout << "  This channel will be recorded." << std::endl;
-        //else
-        //	std::cout << "  This channel will NOT be recorded." << std::endl;
-
-        //std::cout << "adding channel " << getNextChannel(false) << std::endl;
-
-        //std::pair<int, Channel> newPair (getNextChannel(false), newChannel);
-
-        //std::cout << "adding channel " << getNextChannel(false) << std::endl;
-
-        //continuouschannelPointers.insert(newPair);
+        channelPointers[channelIndex]->recordIndex = channelIndex;
 
+        EVERY_ENGINE->addChannel(channelIndex,channelPointers[channelIndex]);
 
     }
     else
@@ -270,31 +253,14 @@ void RecordNode::appendTrialNumber(bool t)
     appendTrialNum = t;
 }
 
+
 void RecordNode::createNewDirectory()
 {
     std::cout << "Creating new directory." << std::endl;
 
     rootFolder = File(dataDirectory.getFullPathName() + File::separator + generateDirectoryName());
-
-    updateFileName(eventChannel);
-
-    for (int i = 0; i < channelPointers.size(); i++)
-    {
-        updateFileName(channelPointers[i]);
-    }
-
     newDirectoryNeeded = false;
 
-    trialNum = 0;
-
-}
-
-void RecordNode::createNewFiles()
-{
-    for (int i = 0; i < channelPointers.size(); i++)
-    {
-        updateFileName(channelPointers[i]);
-    }
 
 }
 
@@ -383,12 +349,15 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
     {
 
         isRecording = true;
+        hasRecorded = true;
         // std::cout << "START RECORDING." << std::endl;
 
         if (newDirectoryNeeded)
         {
             createNewDirectory();
             recordingNumber = 0;
+            experimentNumber = 1;
+            EVERY_ENGINE->directoryChanged();
         }
         else
         {
@@ -402,23 +371,7 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
             getEditorViewport()->saveState(File(settingsFileName));
         }
 
-        createNewFiles();
-
-        openFile(eventChannel);
-
-        blockIndex = 0; // reset index
-
-
-        // create / open necessary files
-        for (int i = 0; i < channelPointers.size(); i++)
-        {
-            // std::cout << "Checking channel " << i << std::endl;
-
-            if (channelPointers[i]->getRecordState())
-            {
-                openFile(channelPointers[i]);
-            }
-        }
+        EVERY_ENGINE->openFiles(rootFolder, experimentNumber, recordingNumber);
 
         allFilesOpened = true;
 
@@ -449,189 +402,47 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
 
             std::cout << "Toggling channel " << currentChannel << std::endl;
 
+            if (isRecording)
+            {
+                //Toggling channels while recording isn't allowed. Code shouldn't reach here.
+                //In case it does, display an error and exit.
+                sendActionMessage("Toggling record channels while recording is not allowed");
+                std::cout << "ERROR: Wrong code section reached\n Toggling record channels while recording is not allowed." << std::endl;
+                return;
+            }
+
             if (newValue == 0.0f)
             {
                 channelPointers[currentChannel]->setRecordState(false);
-
-                if (isRecording)
-                {
-
-                    if (blockIndex < BLOCK_LENGTH)
-                    {
-                        // fill out the rest of the current buffer
-                        writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, currentChannel);
-                    }
-
-                    closeFile(channelPointers[currentChannel]);
-                }
-
             }
             else
             {
                 channelPointers[currentChannel]->setRecordState(true);
-
-                if (isRecording)
-                {
-
-                    openFile(channelPointers[currentChannel]);
-
-                    if (blockIndex > 0)
-                    {
-                        writeTimestampAndSampleCount(channelPointers[currentChannel]->file);
-                        // fill up the first data block up to sample count
-                        writeContinuousBuffer(zeroBuffer.getReadPointer(0), blockIndex, currentChannel);
-                    }
-
-                }
             }
         }
     }
 }
 
-void RecordNode::openFile(Channel* ch)
-{
-    std::cout << "OPENING FILE: " << ch->filename << std::endl;
-
-    File f = File(ch->filename);
-    FILE* chFile;
-
-    bool fileExists = f.exists();
-
-    diskWriteLock.enter();
-
-    chFile = fopen(ch->filename.toUTF8(), "ab");
-
-    if (!fileExists)
-    {
-        // create and write header
-        std::cout << "Writing header." << std::endl;
-        String header = generateHeader(ch);
-        //std::cout << header << std::endl;
-        std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl;
-
-
-        fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile);
-
-        std::cout << "Wrote header." << std::endl;
-
-        std::cout << "Block index: " << blockIndex << std::endl;
-
-    }
-    else
-    {
-        std::cout << "File already exists, just opening." << std::endl;
-    }
-
-    diskWriteLock.exit();
-
-    //To avoid a race condition resulting on data written before the header,
-    //do not assign the channel pointer until the header has been written
-    ch->file = chFile;
-
-
-}
-
-void RecordNode::closeFile(Channel* ch)
-{
-
-    diskWriteLock.enter();
-
-    std::cout << "CLOSING FILE: " << ch->filename << std::endl;
-    if (ch->file != NULL)
-        fclose(ch->file);
-
-    diskWriteLock.exit();
-}
-
-String RecordNode::generateHeader(Channel* ch)
-{
-
-    String header = "header.format = 'Open Ephys Data Format'; \n";
-
-    header += "header.version = 0.2;";
-    header += "header.header_bytes = ";
-    header += String(HEADER_SIZE);
-    header += ";\n";
-
-    if (ch->getType() == EVENT_CHANNEL)
-    {
-        header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, one uint8 event channel, and one uint16 recordingNumber'; \n";
-
-    }
-    else
-    {
-        header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), 1 uint16 recordingNumber, N 16-bit samples, and one 10-byte record marker (0 1 2 3 4 5 6 7 8 255)'; \n";
-    }
-
-
-    header += "header.date_created = '";
-    header += generateDateString();
-    header += "';\n";
-
-    header += "header.channel = '";
-    header += ch->name;
-    header += "';\n";
-
-    if (ch->getType() == EVENT_CHANNEL)
-    {
-
-        header += "header.channelType = 'Event';\n";
-    }
-    else
-    {
-        header += "header.channelType = 'Continuous';\n";
-    }
-
-    header += "header.sampleRate = ";
-    // all channels need to have the same sample rate under the current scheme
-    header += String(channelPointers[0]->sampleRate);
-    header += ";\n";
-    header += "header.blockLength = ";
-    header += BLOCK_LENGTH;
-    header += ";\n";
-    header += "header.bufferSize = ";
-    header += getAudioComponent()->getBufferSize();
-    header += ";\n";
-    header += "header.bitVolts = ";
-    header += String(ch->bitVolts);
-    header += ";\n";
-
-    header = header.paddedRight(' ', HEADER_SIZE);
-
-    //std::cout << header << std::endl;
-
-    return header;
-
-}
-
 void RecordNode::closeAllFiles()
 {
     if (allFilesOpened)
     {
-        for (int i = 0; i < channelPointers.size(); i++)
-        {
-            if (channelPointers[i]->getRecordState())
-            {
-
-                if (blockIndex < BLOCK_LENGTH)
-                {
-                    // fill out the rest of the current buffer
-                    writeContinuousBuffer(zeroBuffer.getReadPointer(0), BLOCK_LENGTH - blockIndex, i);
-                }
-
-                closeFile(channelPointers[i]);
-            }
-        }
-
-        closeFile(eventChannel);
-        blockIndex = 0; // back to the beginning of the block
+        EVERY_ENGINE->closeFiles();
         allFilesOpened = false;
     }
 }
 
 bool RecordNode::enable()
 {
+    if (hasRecorded)
+    {
+        hasRecorded = false;
+        experimentNumber++;
+    }
 
+    //When starting a recording, if a new directory is needed it gets rewritten. Else is incremented by one.
+    recordingNumber = -1;
+    EVERY_ENGINE->startAcquisition();
     isProcessing = true;
     return true;
 }
@@ -655,132 +466,15 @@ float RecordNode::getFreeSpace()
     return 1.0f - float(dataDirectory.getBytesFreeOnVolume())/float(dataDirectory.getVolumeTotalSize());
 }
 
-void RecordNode::writeContinuousBuffer(const float* data, int nSamples, int channel)
-{
-
-    // check to see if the file exists
-    if (channelPointers[channel]->file == NULL)
-        return;
-
-    // scale the data back into the range of int16
-    float scaleFactor =  float(0x7fff) * channelPointers[channel]->bitVolts;
-    for (int n = 0; n < nSamples; n++)
-    {
-        *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor;
-    }
-    AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples);
-
-    if (blockIndex == 0)
-    {
-        writeTimestampAndSampleCount(channelPointers[channel]->file);
-    }
-
-    diskWriteLock.enter();
-
-    size_t count = fwrite(continuousDataIntegerBuffer, // ptr
-                          2,                               // size of each element
-                          nSamples,                        // count
-                          channelPointers[channel]->file); // ptr to FILE object
-
-    jassert(count == nSamples); // make sure all the data was written
-
-    diskWriteLock.exit();
-
-    if (blockIndex + nSamples == BLOCK_LENGTH)
-    {
-        writeRecordMarker(channelPointers[channel]->file);
-    }
-
-}
-
-void RecordNode::writeTimestampAndSampleCount(FILE* file)
-{
-
-
-    diskWriteLock.enter();
-
-    uint16 samps = BLOCK_LENGTH;
-
-    fwrite(&timestamp,                       // ptr
-           8,                               // size of each element
-           1,                               // count
-           file); // ptr to FILE object
-
-    fwrite(&samps,                           // ptr
-           2,                               // size of each element
-           1,                               // count
-           file); // ptr to FILE object
-
-    fwrite(&recordingNumber,                         // ptr
-           2,                               // size of each element
-           1,                               // count
-           file); // ptr to FILE object
-
-    diskWriteLock.exit();
-
-}
-
-void RecordNode::writeRecordMarker(FILE* file)
-{
-    // write a 10-byte marker indicating the end of a record
-
-    diskWriteLock.enter();
-    fwrite(recordMarker,        // ptr
-           1,                   // size of each element
-           10,                  // count
-           file);               // ptr to FILE object
-
-    diskWriteLock.exit();
-
-}
-
-void RecordNode::writeEventBuffer(MidiMessage& event, int samplePosition) //, int node, int channel)
-{
-    // find file and write samples to disk
-    // std::cout << "Received event!" << std::endl;
-
-    if (eventChannel->file == NULL)
-        return;
-
-    const uint8* dataptr = event.getRawData();
-
-    if (event.getNoteNumber() > 0) // processor ID > 0
-    {
-        uint64 samplePos = (uint64) samplePosition;
-
-        int64 eventTimestamp = timestamp + samplePos; // add the sample position to the buffer timestamp
-
-        diskWriteLock.enter();
-
-        fwrite(&eventTimestamp,					// ptr
-               8,   							// size of each element
-               1, 		  						// count
-               eventChannel->file);   			// ptr to FILE object
-
-        fwrite(&samplePos,							// ptr
-               2,   							// size of each element
-               1, 		  						// count
-               eventChannel->file);   			// ptr to FILE object
-
-        // write 1st four bytes of event (type, nodeId, eventId, eventChannel)
-        fwrite(dataptr, 1, 4, eventChannel->file);
-
-        // write recording number
-        fwrite(&recordingNumber,                     // ptr
-               2,                               // size of each element
-               1,                               // count
-               eventChannel->file);             // ptr to FILE object
-
-        diskWriteLock.exit();
-    }
-
-}
 
 void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePosition)
 {
     if (eventType == TTL)
     {
-        writeEventBuffer(event, samplePosition);
+        if (event.getNoteNumber() > 0) // processor ID > 0
+        {
+            EVERY_ENGINE->writeEvent(eventType, event, samplePosition);
+        }
     }
     else if (eventType == TIMESTAMP)
     {
@@ -797,6 +491,7 @@ void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePositi
         //             (int) *(dataptr + 4) << std::endl;
 
         memcpy(&timestamp, dataptr + 4, 8); // remember to skip first four bytes
+        EVERY_ENGINE->updateTimeStamp(timestamp);
     }
 
 }
@@ -806,81 +501,16 @@ void RecordNode::process(AudioSampleBuffer& buffer,
                          int& nSamples)
 {
 
-    // TERMINOLOGY:
-    // buffer -- incoming data stored in AudioSampleBuffer (nSamples long)
-    // block -- 1024-sample sequence for disk writing (BLOCK_LENGTH long)
-    // samplesWritten -- number of samples written from the current buffer
-    // blockIndex -- index within the current block (used outside this function)
-    // numSamplesToWrite -- number of unwritten samples from the buffer
-
-    // CONSTRAINTS:
-    // samplesWritten must equal nSamples by the end of the process() method
-
     if (isRecording && allFilesOpened)
     {
 
         // FIRST: cycle through events -- extract the TTLs and the timestamps
         checkForEvents(events);
 
-        // SECOND: cycle through buffer channels
-        int samplesWritten = 0;
-
+        // SECOND: write channel data
         if (channelPointers.size() > 0)
         {
-
-            while (samplesWritten < nSamples) // there are still unwritten samples in the buffer
-            {
-
-                int numSamplesToWrite = nSamples - samplesWritten; // samples remaining in the buffer
-
-                if (blockIndex + numSamplesToWrite < BLOCK_LENGTH) // we still have space in this block
-                {
-
-                    for (int i = 0; i < buffer.getNumChannels(); i++)
-                    {
-
-                        if (channelPointers[i]->getRecordState())
-                        {
-                            // write buffer to disk!
-                            writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten),
-                                                  numSamplesToWrite,
-                                                  i);
-
-                        }
-                    }
-
-                    // update our variables
-                    samplesWritten += numSamplesToWrite;
-                    timestamp += numSamplesToWrite;
-                    blockIndex += numSamplesToWrite;
-
-                }
-                else // there's not enough space left in this block for all remaining samples
-                {
-
-                    numSamplesToWrite = BLOCK_LENGTH - blockIndex;
-
-                    for (int i = 0; i < buffer.getNumChannels(); i++)
-                    {
-
-                        if (channelPointers[i]->getRecordState())
-                        {
-                            // write buffer to disk!
-                            writeContinuousBuffer(buffer.getReadPointer(i,samplesWritten),
-                                                  numSamplesToWrite,
-                                                  i);
-
-                            //std::cout << "Record channel " << i << std::endl;
-                        }
-                    }
-
-                    // update our variables
-                    samplesWritten += numSamplesToWrite;
-                    timestamp += numSamplesToWrite;
-                    blockIndex = 0; // back to the beginning of the block
-
-                }
-            }
+            EVERY_ENGINE->writeData(buffer,nSamples);
         }
 
         //  std::cout << nSamples << " " << samplesWritten << " " << blockIndex << std::endl;
@@ -898,3 +528,46 @@ void RecordNode::process(AudioSampleBuffer& buffer,
     }
 
 }
+
+void RecordNode::registerProcessor(GenericProcessor* sourceNode)
+{
+    EVERY_ENGINE->registerProcessor(sourceNode);
+}
+
+Channel* RecordNode::getDataChannel(int index)
+{
+    return channelPointers[index];
+}
+
+void RecordNode::registerRecordEngine(RecordEngine* engine)
+{
+    engineArray.add(engine);
+}
+
+void RecordNode::registerSpikeSource(GenericProcessor* processor)
+{
+    EVERY_ENGINE->registerSpikeSource(processor);
+}
+
+int RecordNode::addSpikeElectrode(SpikeRecordInfo* elec)
+{
+    elec->recordIndex=spikeElectrodeIndex;
+    spikeElectrodePointers.add(elec);
+    EVERY_ENGINE->addSpikeElectrode(spikeElectrodeIndex,elec);
+    return spikeElectrodeIndex++;
+}
+
+void RecordNode::writeSpike(SpikeObject& spike, int electrodeIndex)
+{
+    EVERY_ENGINE->writeSpike(spike,electrodeIndex);
+}
+
+SpikeRecordInfo* RecordNode::getSpikeElectrode(int index)
+{
+    return spikeElectrodePointers[index];
+}
+
+void RecordNode::clearRecordEngines()
+{
+	engineArray.clear();
+}
diff --git a/Source/Processors/RecordNode.h b/Source/Processors/RecordNode.h
index 5748690290ea80974ff543e7b743fb67d5ba59a9..ab8b3c7a39715bb81d54682b69fd3f3ef5a87a2d 100755
--- a/Source/Processors/RecordNode.h
+++ b/Source/Processors/RecordNode.h
@@ -23,8 +23,6 @@
 
 #ifndef __RECORDNODE_H_FB9B1CA7__
 #define __RECORDNODE_H_FB9B1CA7__
-
-
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include <stdio.h>
 #include <map>
@@ -32,6 +30,9 @@
 
 #include "GenericProcessor.h"
 #include "Channel.h"
+#include "RecordEngine.h"
+
+
 
 #define HEADER_SIZE 1024
 #define BLOCK_LENGTH 1024
@@ -71,6 +72,11 @@ public:
     */
     void setParameter(int parameterIndex, float newValue);
 
+	/** Called by the processor graph for each processor that could record data
+	*/
+    void registerProcessor(GenericProcessor* sourceNode);
+	/** Called by the processor graph for each recordable channel
+	*/
     void addInputChannel(GenericProcessor* sourceNode, int chan);
 
     bool enable();
@@ -82,6 +88,10 @@ public:
     /** update channel name */
     void updateChannelName(int channelIndex, String newname);
 
+	/** Get channel stored in channelPointers array
+	*/
+    Channel* getDataChannel(int index);
+
     /** Called by the ControlPanel to determine the amount of space
         left in the current dataDirectory.
     */
@@ -109,21 +119,36 @@ public:
     */
     void createNewDirectory();
 
-    /** Creates a new data file for each channel.
-     */
-    void createNewFiles();
-
-    /** Creates a new data file for each channel.
-     */
-    void appendTrialNumber(bool);
-
-    void updateTrialNumber();
 
     File getDataDirectory()
     {
         return rootFolder;
     }
 
+	/** Adds a Record Engine to use
+	*/
+    void registerRecordEngine(RecordEngine* engine);
+
+	/** Clears the list of active Record Engines
+	*/
+	void clearRecordEngines();
+
+	/** Must be called by a spike recording source on the "enable" method
+	*/
+    void registerSpikeSource(GenericProcessor* processor);
+
+	/** Registers an electrode group for spike recording
+	Must be called by a spike recording source on the "enable" method
+	after the call to registerSpikeSource 
+	*/
+    int addSpikeElectrode(SpikeRecordInfo* elec);
+
+	/** Called by a spike recording source to write a spike to file
+	*/
+    void writeSpike(SpikeObject& spike, int electrodeIndex);
+
+    SpikeRecordInfo* getSpikeElectrode(int index);
+
     /** Signals when to create a new data directory when recording starts.*/
     bool newDirectoryNeeded;
 
@@ -133,12 +158,6 @@ public:
     /** Generate a Matlab-compatible datestring */
     String generateDateString();
 
-    CriticalSection* getLock()
-    {
-        return &diskWriteLock;
-    }
-
-
 private:
 
     /** Keep the RecordNode informed of acquisition and record states.
@@ -154,25 +173,11 @@ private:
     */
     File rootFolder;
 
-    /** Holds data that has been converted from float to int16 before
-        saving.
-    */
-    int16* continuousDataIntegerBuffer;
-
-    /** Holds data that has been converted from float to int16 before
-        saving.
-    */
-    float* continuousDataFloatBuffer;
-
-    AudioSampleBuffer zeroBuffer;
 
     /** Integer timestamp saved for each buffer.
     */
     int64 timestamp;
 
-    /** Integer to keep track of the number samples written in each block */
-    int blockIndex;
-
     /** Integer to keep track of number of recording sessions in the same file */
     uint16 recordingNumber;
 
@@ -180,12 +185,6 @@ private:
     */
     Time timer;
 
-    /** Opens a single file */
-    void openFile(Channel* ch);
-
-    /** Closes a single file */
-    void closeFile(Channel* ch);
-
     /** Closes all open files after recording has finished.
     */
     void closeAllFiles();
@@ -196,16 +195,17 @@ private:
     /** Pointers to all event channels */
     Array<Channel*> eventChannelPointers;
 
-    /** Generates a header for a given channel */
-    String generateHeader(Channel* ch);
+    OwnedArray<SpikeRecordInfo> spikeElectrodePointers;
+
+    int spikeElectrodeIndex;
+
+    int experimentNumber;
+    bool hasRecorded;
 
     /** Generates a default directory name, based on the current date and time */
     String generateDirectoryName();
 
 
-    /** Generate filename for a given channel */
-    void updateFileName(Channel* ch);
-
     /** Cycle through the event buffer, looking for data to save */
     void handleEvent(int eventType, MidiMessage& event, int samplePos);
 
@@ -234,6 +234,10 @@ private:
     bool appendTrialNum;
     int trialNum;
 
+    /**RecordEngines loaded**/
+    OwnedArray<RecordEngine> engineArray;
+
+
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordNode);
 
 };
diff --git a/Source/Processors/SpikeDisplayNode.cpp b/Source/Processors/SpikeDisplayNode.cpp
index acad76c45a52e01186c98a093ee21bfd7d7bbecd..6de204f29a1f19fdd831b20a323727375b141d5a 100755
--- a/Source/Processors/SpikeDisplayNode.cpp
+++ b/Source/Processors/SpikeDisplayNode.cpp
@@ -30,15 +30,11 @@
 
 
 SpikeDisplayNode::SpikeDisplayNode()
-    : GenericProcessor("Spike Viewer"), displayBufferSize(5),  redrawRequested(false), isRecording(false),
-      signalFilesShouldClose(false)
+    : GenericProcessor("Spike Viewer"), displayBufferSize(5),  redrawRequested(false),
+	isRecording(false)
 {
 
 
-    spikeBuffer = new uint8_t[MAX_SPIKE_BUFFER_LEN]; // MAX_SPIKE_BUFFER_LEN defined in SpikeObject.h
-
-    recordingNumber = -1;
-
 }
 
 SpikeDisplayNode::~SpikeDisplayNode()
@@ -60,7 +56,6 @@ void SpikeDisplayNode::updateSettings()
     //std::cout << "Setting num inputs on SpikeDisplayNode to " << getNumInputs() << std::endl;
 
     electrodes.clear();
-
     for (int i = 0; i < eventChannels.size(); i++)
     {
         if ((eventChannels[i]->eventType < 999) && (eventChannels[i]->eventType > SPIKE_BASE_CODE))
@@ -79,12 +74,10 @@ void SpikeDisplayNode::updateSettings()
             }
 
             electrodes.add(elec);
+
         }
     }
 
-    recordNode = getProcessorGraph()->getRecordNode();
-    diskWriteLock = recordNode->getLock();
-
 }
 
 // void SpikeDisplayNode::updateVisualizer()
@@ -96,6 +89,18 @@ bool SpikeDisplayNode::enable()
 {
     std::cout << "SpikeDisplayNode::enable()" << std::endl;
     SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor();
+
+	getProcessorGraph()->getRecordNode()->registerSpikeSource(this);
+	for (int i = 0; i < electrodes.size(); i ++)
+	{
+		Electrode& elec = electrodes.getReference(i);
+		SpikeRecordInfo *recElec = new SpikeRecordInfo();
+		recElec->name = elec.name;
+		recElec->numChannels = elec.numChannels;
+		recElec->sampleRate = settings.sampleRate;
+		elec.recordIndex = getProcessorGraph()->getRecordNode()->addSpikeElectrode(recElec);
+	}
+
     editor->enable();
     return true;
 
@@ -175,28 +180,12 @@ void SpikeDisplayNode::setParameter(int param, float val)
     if (param == 0) // stop recording
     {
         isRecording = false;
-        signalFilesShouldClose = true;
 
     }
     else if (param == 1)   // start recording
     {
         isRecording = true;
 
-        dataDirectory = recordNode->getDataDirectory();
-
-        if (dataDirectory.getFullPathName().length() == 0)
-        {
-            // temporary fix in case nothing is returned by the record node.
-            dataDirectory = File::getSpecialLocation(File::userHomeDirectory);
-        }
-
-        baseDirectory = dataDirectory.getFullPathName();
-
-        for (int i = 0; i < getNumElectrodes(); i++)
-        {
-            openFile(i);
-        }
-
     }
     else if (param == 2)   // redraw
     {
@@ -213,16 +202,6 @@ void SpikeDisplayNode::process(AudioSampleBuffer& buffer, MidiBuffer& events, in
 
     checkForEvents(events); // automatically calls 'handleEvent
 
-    if (signalFilesShouldClose)
-    {
-        for (int i = 0; i < getNumElectrodes(); i++)
-        {
-            closeFile(i);
-        }
-
-        signalFilesShouldClose = false;
-    }
-
     if (redrawRequested)
     {
         // update incoming thresholds
@@ -304,7 +283,7 @@ void SpikeDisplayNode::handleEvent(int eventType, MidiMessage& event, int sample
                     // save spike
                     if (isRecording)
                     {
-                        writeSpike(newSpike, electrodeNum);
+						getProcessorGraph()->getRecordNode()->writeSpike(newSpike,e.recordIndex);
                     }
                 }
 
@@ -333,139 +312,3 @@ bool SpikeDisplayNode::checkThreshold(int chan, float thresh, SpikeObject& s)
 
     return false;
 }
-
-void SpikeDisplayNode::openFile(int i)
-{
-
-    String filename = baseDirectory;
-    filename += File::separator;
-    filename += getNameForElectrode(i).removeCharacters(" ");
-    filename += ".spikes";
-
-    std::cout << "OPENING FILE: " << filename << std::endl;
-
-    File fileToUse = File(filename);
-
-    diskWriteLock->enter();
-    //const MessageManagerLock mmLock;
-
-    Electrode& e = electrodes.getReference(i);
-
-    FILE* file;
-
-    if (!fileToUse.exists())
-    {
-        // open it and write header
-
-        if (i == 0)
-        {
-            recordingNumber = 0;
-        }
-
-        file = fopen(filename.toUTF8(), "ab");
-        String header = generateHeader(i);
-        fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), file);
-
-    }
-    else
-    {
-        // append it
-        if (i == 0)
-        {
-            recordingNumber++;
-        }
-
-        file = fopen(filename.toUTF8(), "ab");
-    }
-
-    diskWriteLock->exit();
-
-    e.file = file;
-}
-
-void SpikeDisplayNode::closeFile(int i)
-{
-
-    Electrode& e = electrodes.getReference(i);
-
-    std::cout << "CLOSING FILE for " << e.name << std::endl;
-
-    diskWriteLock->enter();
-
-    if (e.file != NULL)
-    {
-        fclose(e.file);
-    }
-
-    diskWriteLock->exit();
-
-}
-
-void SpikeDisplayNode::writeSpike(const SpikeObject& s, int i)
-{
-
-    packSpike(&s, spikeBuffer, MAX_SPIKE_BUFFER_LEN);
-
-    int totalBytes = s.nSamples * s.nChannels * 2 + // account for samples
-                     s.nChannels * 4 +            // acount for threshold and gain
-                     15;                        // 15 bytes in every SpikeObject
-
-
-    // format:
-    // 1 byte of event type (always = 4 for spikes)
-    // 8 bytes for 64-bit timestamp
-    // 2 bytes for 16-bit electrode ID
-    // 2 bytes for 16-bit number of channels (n)
-    // 2 bytes for 16-bit number of samples (m)
-    // 2*n*m bytes for 16-bit samples
-    // 2*n bytes for 16-bit gains
-    // 2*n bytes for 16-bit thresholds
-
-    // const MessageManagerLock mmLock;
-
-    diskWriteLock->enter();
-
-    fwrite(spikeBuffer, 1, totalBytes, electrodes[i].file);
-
-    fwrite(&recordingNumber,                         // ptr
-           2,                               // size of each element
-           1,                               // count
-           electrodes[i].file); // ptr to FILE object
-
-    diskWriteLock->exit();
-
-
-}
-
-String SpikeDisplayNode::generateHeader(int electrodeNum)
-{
-    String header = "header.format = 'Open Ephys Data Format'; \n";
-    header += "header.version = 0.2;";
-    header += "header.header_bytes = ";
-    header += String(HEADER_SIZE);
-    header += ";\n";
-
-    header += "header.description = 'Each record contains 1 uint8 eventType, 1 uint64 timestamp, 1 uint16 electrodeID, 1 uint16 numChannels (n), 1 uint16 numSamples (m), n*m uint16 samples, n uint16 channelGains, n uint16 thresholds, and 1 uint16 recordingNumber'; \n";
-
-    header += "header.date_created = '";
-    header += recordNode->generateDateString();
-    header += "';\n";
-
-    header += "header.electrode = '";
-    header += electrodes[electrodeNum].name;
-    header += "';\n";
-
-    header += "header.num_channels = ";
-    header += electrodes[electrodeNum].numChannels;
-    header += ";\n";
-
-    header += "header.sampleRate = ";
-    header += String(settings.sampleRate);
-    header += ";\n";
-
-    header = header.paddedRight(' ', HEADER_SIZE);
-
-    //std::cout << header << std::endl;
-
-    return header;
-}
\ No newline at end of file
diff --git a/Source/Processors/SpikeDisplayNode.h b/Source/Processors/SpikeDisplayNode.h
index cbd08ce92b51b858b2662286e46806c1a6251b06..159dc69fddd75c33a280b7b2333f187743a49ce1 100755
--- a/Source/Processors/SpikeDisplayNode.h
+++ b/Source/Processors/SpikeDisplayNode.h
@@ -95,7 +95,7 @@ private:
 
         SpikePlot* spikePlot;
 
-        FILE* file;
+        int recordIndex;
 
     };
 
@@ -104,24 +104,18 @@ private:
     int displayBufferSize;
     bool redrawRequested;
 
-    // methods for recording:
-    void openFile(int index);
-    void closeFile(int index);
-    void writeSpike(const SpikeObject& s, int index);
-    String generateHeader(int index);
-
     // members for recording
     bool isRecording;
-    bool signalFilesShouldClose;
-    RecordNode* recordNode;
-    String baseDirectory;
-    File dataDirectory;
-    uint8_t* spikeBuffer;
-    SpikeObject currentSpike;
+ //   bool signalFilesShouldClose;
+ //   RecordNode* recordNode;
+ //   String baseDirectory;
+ //   File dataDirectory;
+ //   uint8_t* spikeBuffer;
+ //   SpikeObject currentSpike;
 
-    uint16 recordingNumber;
+ //   uint16 recordingNumber;
 
-    CriticalSection* diskWriteLock;
+//    CriticalSection* diskWriteLock;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDisplayNode);
 
diff --git a/Source/Processors/Utilities/RecordControl.cpp b/Source/Processors/Utilities/RecordControl.cpp
index 8a440fd09f126569ae0ce5d3a63e6181b62129cf..b3ca5b019e3f32dc6a7252f140ed5f01a241a1ba 100644
--- a/Source/Processors/Utilities/RecordControl.cpp
+++ b/Source/Processors/Utilities/RecordControl.cpp
@@ -28,7 +28,7 @@
 
 RecordControl::RecordControl()
     : GenericProcessor("Record Control"),
-      createNewFilesOnTrigger(false), triggerChannel(0), recordNode(0)
+     triggerChannel(0), recordNode(0)
 {
 
 }
@@ -50,21 +50,6 @@ void RecordControl::setParameter(int parameterIndex, float newValue)
     {
         updateTriggerChannel((int) newValue);
     }
-    else
-    {
-
-        if (newValue == 0.0)
-        {
-            createNewFilesOnTrigger = false;
-
-
-        }
-        else
-        {
-            createNewFilesOnTrigger = true;
-        }
-        //recordNode->appendTrialNumber(createNewFilesOnTrigger);
-    }
 }
 
 void RecordControl::updateTriggerChannel(int newChannel)
@@ -77,7 +62,7 @@ bool RecordControl::enable()
     if (recordNode == 0)
         recordNode = getProcessorGraph()->getRecordNode();
 
-    recordNode->appendTrialNumber(createNewFilesOnTrigger);
+    //recordNode->appendTrialNumber(createNewFilesOnTrigger);
 
     return true;
 }
@@ -108,10 +93,6 @@ void RecordControl::handleEvent(int eventType, MidiMessage& event, int)
 
         if (eventId == 1)
         {
-            if (createNewFilesOnTrigger)
-            {
-                recordNode->updateTrialNumber();
-            }
             getControlPanel()->setRecordState(true);
         }
         else
diff --git a/Source/Processors/Utilities/RecordControl.h b/Source/Processors/Utilities/RecordControl.h
index 594c8d04acb2eb421c592da49f0278de3f89d072..abd7b8a9c33d39133dc56b4161dc70f6ec8e4251 100644
--- a/Source/Processors/Utilities/RecordControl.h
+++ b/Source/Processors/Utilities/RecordControl.h
@@ -49,8 +49,6 @@ public:
     void handleEvent(int eventType, MidiMessage& event, int);
     bool enable();
 
-    bool createNewFilesOnTrigger;
-
     bool isUtility()
     {
         return true;
diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp
index 5034b7d898d4ce13e6aa1bb32ba98e905cb78881..b1ec75f41b235c3cddf3f2765515e0656e03077e 100755
--- a/Source/UI/ControlPanel.cpp
+++ b/Source/UI/ControlPanel.cpp
@@ -1,23 +1,23 @@
 /*
-    ------------------------------------------------------------------
+------------------------------------------------------------------
 
-    This file is part of the Open Ephys GUI
-    Copyright (C) 2013 Open Ephys
+This file is part of the Open Ephys GUI
+Copyright (C) 2013 Open Ephys
 
-    ------------------------------------------------------------------
+------------------------------------------------------------------
 
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
@@ -25,33 +25,35 @@
 #include "UIComponent.h"
 #include <stdio.h>
 #include <math.h>
+#include "../Processors/OriginalRecording.h"
+#include "../Processors/HDF5Recording.h"
 
 PlayButton::PlayButton()
-    : DrawableButton("PlayButton", DrawableButton::ImageFitted)
+	: DrawableButton("PlayButton", DrawableButton::ImageFitted)
 {
 
-    DrawablePath normal, over, down;
+	DrawablePath normal, over, down;
 
-    Path p;
-    p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f);
-    normal.setPath(p);
-    normal.setFill(Colours::lightgrey);
-    normal.setStrokeThickness(0.0f);
+	Path p;
+	p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f);
+	normal.setPath(p);
+	normal.setFill(Colours::lightgrey);
+	normal.setStrokeThickness(0.0f);
 
-    over.setPath(p);
-    over.setFill(Colours::black);
-    over.setStrokeFill(Colours::black);
-    over.setStrokeThickness(5.0f);
+	over.setPath(p);
+	over.setFill(Colours::black);
+	over.setStrokeFill(Colours::black);
+	over.setStrokeThickness(5.0f);
 
-    down.setPath(p);
-    down.setFill(Colours::pink);
-    down.setStrokeFill(Colours::pink);
-    down.setStrokeThickness(5.0f);
+	down.setPath(p);
+	down.setFill(Colours::pink);
+	down.setStrokeFill(Colours::pink);
+	down.setStrokeThickness(5.0f);
 
-    setImages(&normal, &over, &over);
-    // setBackgroundColours(Colours::darkgrey, Colours::yellow);
-    setClickingTogglesState(true);
-    setTooltip("Start/stop acquisition");
+	setImages(&normal, &over, &over);
+	// setBackgroundColours(Colours::darkgrey, Colours::yellow);
+	setClickingTogglesState(true);
+	setTooltip("Start/stop acquisition");
 
 
 }
@@ -61,26 +63,26 @@ PlayButton::~PlayButton()
 }
 
 RecordButton::RecordButton()
-    : DrawableButton("RecordButton", DrawableButton::ImageFitted)
+	: DrawableButton("RecordButton", DrawableButton::ImageFitted)
 {
 
-    DrawablePath normal, over, down;
+	DrawablePath normal, over, down;
 
-    Path p;
-    p.addEllipse(0.0,0.0,20.0,20.0);
-    normal.setPath(p);
-    normal.setFill(Colours::lightgrey);
-    normal.setStrokeThickness(0.0f);
+	Path p;
+	p.addEllipse(0.0,0.0,20.0,20.0);
+	normal.setPath(p);
+	normal.setFill(Colours::lightgrey);
+	normal.setStrokeThickness(0.0f);
 
-    over.setPath(p);
-    over.setFill(Colours::black);
-    over.setStrokeFill(Colours::black);
-    over.setStrokeThickness(5.0f);
+	over.setPath(p);
+	over.setFill(Colours::black);
+	over.setStrokeFill(Colours::black);
+	over.setStrokeThickness(5.0f);
 
-    setImages(&normal, &over, &over);
-    //setBackgroundColours(Colours::darkgrey, Colours::red);
-    setClickingTogglesState(true);
-    setTooltip("Start/stop writing to disk");
+	setImages(&normal, &over, &over);
+	//setBackgroundColours(Colours::darkgrey, Colours::red);
+	setClickingTogglesState(true);
+	setTooltip("Start/stop writing to disk");
 }
 
 RecordButton::~RecordButton()
@@ -91,14 +93,14 @@ RecordButton::~RecordButton()
 CPUMeter::CPUMeter() : Label("CPU Meter","0.0"), cpu(0.0f), lastCpu(0.0f)
 {
 
-    font = Font("Small Text", 12, Font::plain);
+	font = Font("Small Text", 12, Font::plain);
 
-    // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false);
-    // Typeface::Ptr typeface = new CustomTypeface(mis);
-    // font = Font(typeface);
-    // font.setHeight(12);
+	// MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false);
+	// Typeface::Ptr typeface = new CustomTypeface(mis);
+	// font = Font(typeface);
+	// font.setHeight(12);
 
-    setTooltip("CPU usage");
+	setTooltip("CPU usage");
 }
 
 CPUMeter::~CPUMeter()
@@ -107,22 +109,22 @@ CPUMeter::~CPUMeter()
 
 void CPUMeter::updateCPU(float usage)
 {
-    lastCpu = cpu;
-    cpu = usage;
+	lastCpu = cpu;
+	cpu = usage;
 }
 
 void CPUMeter::paint(Graphics& g)
 {
-    g.fillAll(Colours::grey);
+	g.fillAll(Colours::grey);
 
-    g.setColour(Colours::yellow);
-    g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight()));
+	g.setColour(Colours::yellow);
+	g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight()));
 
-    g.setColour(Colours::black);
-    g.drawRect(0,0,getWidth(),getHeight(),1);
+	g.setColour(Colours::black);
+	g.drawRect(0,0,getWidth(),getHeight(),1);
 
-    g.setFont(font);
-    g.drawSingleLineText("CPU",65,12);
+	g.setFont(font);
+	g.drawSingleLineText("CPU",65,12);
 
 }
 
@@ -131,14 +133,14 @@ DiskSpaceMeter::DiskSpaceMeter()
 
 {
 
-    font = Font("Small Text", 12, Font::plain);
+	font = Font("Small Text", 12, Font::plain);
 
-    // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false);
-    // Typeface::Ptr typeface = new CustomTypeface(mis);
-    // font = Font(typeface);
-    // font.setHeight(12);
+	// MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false);
+	// Typeface::Ptr typeface = new CustomTypeface(mis);
+	// font = Font(typeface);
+	// font.setHeight(12);
 
-    setTooltip("Disk space available");
+	setTooltip("Disk space available");
 }
 
 
@@ -148,38 +150,38 @@ DiskSpaceMeter::~DiskSpaceMeter()
 
 void DiskSpaceMeter::updateDiskSpace(float percent)
 {
-    diskFree = percent;
+	diskFree = percent;
 }
 
 void DiskSpaceMeter::paint(Graphics& g)
 {
 
-    g.fillAll(Colours::grey);
+	g.fillAll(Colours::grey);
 
-    g.setColour(Colours::lightgrey);
-    if (diskFree > 0)
-        g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight()));
+	g.setColour(Colours::lightgrey);
+	if (diskFree > 0)
+		g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight()));
 
-    g.setColour(Colours::black);
-    g.drawRect(0,0,getWidth(),getHeight(),1);
+	g.setColour(Colours::black);
+	g.drawRect(0,0,getWidth(),getHeight(),1);
 
-    g.setFont(font);
-    g.drawSingleLineText("DF",75,12);
+	g.setFont(font);
+	g.drawSingleLineText("DF",75,12);
 
 }
 
 Clock::Clock() : isRunning(false), isRecording(false)
 {
 
-    clockFont = Font("Default Light", 30, Font::plain);
+	clockFont = Font("Default Light", 30, Font::plain);
 
-    // MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false);
-    // Typeface::Ptr typeface = new CustomTypeface(mis);
-    // clockFont = Font(typeface);
-    // clockFont.setHeight(30);
+	// MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false);
+	// Typeface::Ptr typeface = new CustomTypeface(mis);
+	// clockFont = Font(typeface);
+	// clockFont.setHeight(30);
 
-    totalTime = 0;
-    totalRecordTime = 0;
+	totalTime = 0;
+	totalRecordTime = 0;
 
 }
 
@@ -190,117 +192,117 @@ Clock::~Clock()
 
 void Clock::paint(Graphics& g)
 {
-    if (isRecording)
-    {
-        g.fillAll(Colour(255,0,0));
-    }
-    else
-    {
-        g.fillAll(Colour(58,58,58));
-    }
+	if (isRecording)
+	{
+		g.fillAll(Colour(255,0,0));
+	}
+	else
+	{
+		g.fillAll(Colour(58,58,58));
+	}
 
-    drawTime(g);
+	drawTime(g);
 }
 
 void Clock::drawTime(Graphics& g)
 {
 
-    if (isRunning)
-    {
-        int64 now = Time::currentTimeMillis();
-        int64 diff = now - lastTime;
-        totalTime += diff;
+	if (isRunning)
+	{
+		int64 now = Time::currentTimeMillis();
+		int64 diff = now - lastTime;
+		totalTime += diff;
 
-        if (isRecording)
-        {
-            totalRecordTime += diff;
-        }
+		if (isRecording)
+		{
+			totalRecordTime += diff;
+		}
 
-        lastTime = Time::currentTimeMillis();
-    }
+		lastTime = Time::currentTimeMillis();
+	}
 
-    int m;
-    int s;
+	int m;
+	int s;
 
-    if (isRecording)
-    {
-        g.setColour(Colours::black);
-        m = floor(totalRecordTime/60000.0);
-        s = floor((totalRecordTime - m*60000.0)/1000.0);
+	if (isRecording)
+	{
+		g.setColour(Colours::black);
+		m = floor(totalRecordTime/60000.0);
+		s = floor((totalRecordTime - m*60000.0)/1000.0);
 
-    }
-    else
-    {
+	}
+	else
+	{
 
-        if (isRunning)
-            g.setColour(Colours::yellow);
-        else
-            g.setColour(Colours::white);
+		if (isRunning)
+			g.setColour(Colours::yellow);
+		else
+			g.setColour(Colours::white);
 
-        m = floor(totalTime/60000.0);
-        s = floor((totalTime - m*60000.0)/1000.0);
-    }
+		m = floor(totalTime/60000.0);
+		s = floor((totalTime - m*60000.0)/1000.0);
+	}
 
-    String timeString = "";
+	String timeString = "";
 
-    timeString += m;
-    timeString += " min ";
-    timeString += s;
-    timeString += " s";
+	timeString += m;
+	timeString += " min ";
+	timeString += s;
+	timeString += " s";
 
-    g.setFont(clockFont);
-    //g.setFont(30);
-    g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false);
+	g.setFont(clockFont);
+	//g.setFont(30);
+	g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false);
 
 }
 
 void Clock::start()
 {
-    if (!isRunning)
-    {
-        isRunning = true;
-        lastTime = Time::currentTimeMillis();
-    }
+	if (!isRunning)
+	{
+		isRunning = true;
+		lastTime = Time::currentTimeMillis();
+	}
 }
 
 void Clock::resetRecordTime()
 {
-    totalRecordTime = 0;
+	totalRecordTime = 0;
 }
 
 void Clock::startRecording()
 {
-    if (!isRecording)
-    {
-        isRecording = true;
-        start();
-    }
+	if (!isRecording)
+	{
+		isRecording = true;
+		start();
+	}
 }
 
 void Clock::stop()
 {
-    if (isRunning)
-    {
-        isRunning = false;
-        isRecording = false;
-    }
+	if (isRunning)
+	{
+		isRunning = false;
+		isRecording = false;
+	}
 }
 
 void Clock::stopRecording()
 {
-    if (isRecording)
-    {
-        isRecording = false;
-    }
+	if (isRecording)
+	{
+		isRecording = false;
+	}
 
 }
 
 
 ControlPanelButton::ControlPanelButton(ControlPanel* cp_) : cp(cp_)
 {
-    open = false;
+	open = false;
 
-    setTooltip("Show/hide recording options");
+	setTooltip("Show/hide recording options");
 }
 
 ControlPanelButton::~ControlPanelButton()
@@ -310,150 +312,156 @@ ControlPanelButton::~ControlPanelButton()
 
 void ControlPanelButton::paint(Graphics& g)
 {
-    //g.fillAll(Colour(58,58,58));
+	//g.fillAll(Colour(58,58,58));
 
-    g.setColour(Colours::white);
+	g.setColour(Colours::white);
 
-    Path p;
+	Path p;
 
-    float h = getHeight();
-    float w = getWidth();
+	float h = getHeight();
+	float w = getWidth();
 
-    if (open)
-    {
-        p.addTriangle(0.5f*w, 0.8f*h,
-                      0.2f*w, 0.2f*h,
-                      0.8f*w, 0.2f*h);
-    }
-    else
-    {
-        p.addTriangle(0.8f*w, 0.8f*h,
-                      0.2f*w, 0.5f*h,
-                      0.8f*w, 0.2f*h);
-    }
+	if (open)
+	{
+		p.addTriangle(0.5f*w, 0.8f*h,
+			0.2f*w, 0.2f*h,
+			0.8f*w, 0.2f*h);
+	}
+	else
+	{
+		p.addTriangle(0.8f*w, 0.8f*h,
+			0.2f*w, 0.5f*h,
+			0.8f*w, 0.2f*h);
+	}
 
-    PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded);
+	PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded);
 
-    g.strokePath(p, pst);
+	g.strokePath(p, pst);
 
 }
 
 
 void ControlPanelButton::mouseDown(const MouseEvent& e)
 {
-    open = !open;
-    cp->openState(open);
-    repaint();
+	open = !open;
+	cp->openState(open);
+	repaint();
 
 }
 
 void ControlPanelButton::toggleState()
 {
-    open = !open;
-    repaint();
+	open = !open;
+	repaint();
 }
 
 void ControlPanelButton::setState(bool b)
 {
-    open = b;
-    repaint();
+	open = b;
+	repaint();
 }
 
 
 
 
 ControlPanel::ControlPanel(ProcessorGraph* graph_, AudioComponent* audio_)
-    : graph(graph_), audio(audio_), initialize(true), open(false)
+	: graph(graph_), audio(audio_), initialize(true), open(false)
 {
 
-    if (1)
-    {
+	if (1)
+	{
 
-        font = Font("Paragraph", 13, Font::plain);
+		font = Font("Paragraph", 13, Font::plain);
 
-        // MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false);
-        // Typeface::Ptr typeface = new CustomTypeface(mis);
-        // font = Font(typeface);
-        // font.setHeight(15);
-    }
+		// MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false);
+		// Typeface::Ptr typeface = new CustomTypeface(mis);
+		// font = Font(typeface);
+		// font.setHeight(15);
+	}
 
-    audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor();
-    addAndMakeVisible(audioEditor);
+	audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor();
+	addAndMakeVisible(audioEditor);
 
-    playButton = new PlayButton();
-    playButton->addListener(this);
-    addAndMakeVisible(playButton);
+	playButton = new PlayButton();
+	playButton->addListener(this);
+	addAndMakeVisible(playButton);
 
-    recordButton = new RecordButton();
-    recordButton->addListener(this);
-    addAndMakeVisible(recordButton);
+	recordButton = new RecordButton();
+	recordButton->addListener(this);
+	addAndMakeVisible(recordButton);
 
-    masterClock = new Clock();
-    addAndMakeVisible(masterClock);
+	masterClock = new Clock();
+	addAndMakeVisible(masterClock);
 
-    cpuMeter = new CPUMeter();
-    addAndMakeVisible(cpuMeter);
+	cpuMeter = new CPUMeter();
+	addAndMakeVisible(cpuMeter);
 
-    diskMeter = new DiskSpaceMeter();
-    addAndMakeVisible(diskMeter);
+	diskMeter = new DiskSpaceMeter();
+	addAndMakeVisible(diskMeter);
 
-    cpb = new ControlPanelButton(this);
-    addAndMakeVisible(cpb);
+	cpb = new ControlPanelButton(this);
+	addAndMakeVisible(cpb);
 
-    newDirectoryButton = new UtilityButton("+", Font("Small Text", 15, Font::plain));
-    newDirectoryButton->setEnabledState(false);
-    newDirectoryButton->addListener(this);
-    newDirectoryButton->setTooltip("Start a new data directory");
-    addChildComponent(newDirectoryButton);
+	recordSelector = new ComboBox();
+	recordSelector->addListener(this);
+	recordSelector->addItem("OpenEphys",1);
+	recordSelector->addItem("HDF5",2);
+	addChildComponent(recordSelector);
 
+	newDirectoryButton = new UtilityButton("+", Font("Small Text", 15, Font::plain));
+	newDirectoryButton->setEnabledState(false);
+	newDirectoryButton->addListener(this);
+	newDirectoryButton->setTooltip("Start a new data directory");
+	addChildComponent(newDirectoryButton);
 
-    File executable = File::getSpecialLocation(File::currentExecutableFile);
+
+	File executable = File::getSpecialLocation(File::currentExecutableFile);
 
 #if defined(__APPLE__)
-    const String executableDirectory =
-        executable.getParentDirectory().getParentDirectory().getParentDirectory().getParentDirectory().getFullPathName();
+	const String executableDirectory =
+		executable.getParentDirectory().getParentDirectory().getParentDirectory().getParentDirectory().getFullPathName();
 #else
-    const String executableDirectory = executable.getParentDirectory().getFullPathName();
+	const String executableDirectory = executable.getParentDirectory().getFullPathName();
 #endif
 
-    filenameComponent = new FilenameComponent("folder selector",
-                                              executableDirectory,
-                                              true,
-                                              true,
-                                              true,
-                                              "*",
-                                              "",
-                                              "");
-    addChildComponent(filenameComponent);
+	filenameComponent = new FilenameComponent("folder selector",
+		executableDirectory,
+		true,
+		true,
+		true,
+		"*",
+		"",
+		"");
+	addChildComponent(filenameComponent);
 
-    prependText = new Label("Prepend","");
-    prependText->setEditable(true);
-    prependText->addListener(this);
-    prependText->setColour(Label::backgroundColourId, Colours::lightgrey);
-    prependText->setTooltip("Prepend to name of data directory");
+	prependText = new Label("Prepend","");
+	prependText->setEditable(true);
+	prependText->addListener(this);
+	prependText->setColour(Label::backgroundColourId, Colours::lightgrey);
+	prependText->setTooltip("Prepend to name of data directory");
 
-    addChildComponent(prependText);
+	addChildComponent(prependText);
 
-    dateText = new Label("Date","YYYY-MM-DD_HH-MM-SS");
-    dateText->setColour(Label::backgroundColourId, Colours::lightgrey);
-    dateText->setColour(Label::textColourId, Colours::grey);
-    addChildComponent(dateText);
+	dateText = new Label("Date","YYYY-MM-DD_HH-MM-SS");
+	dateText->setColour(Label::backgroundColourId, Colours::lightgrey);
+	dateText->setColour(Label::textColourId, Colours::grey);
+	addChildComponent(dateText);
 
-    appendText = new Label("Append","");
-    appendText->setEditable(true);
-    appendText->addListener(this);
-    appendText->setColour(Label::backgroundColourId, Colours::lightgrey);
-    addChildComponent(appendText);
-    appendText->setTooltip("Append to name of data directory");
+	appendText = new Label("Append","");
+	appendText->setEditable(true);
+	appendText->addListener(this);
+	appendText->setColour(Label::backgroundColourId, Colours::lightgrey);
+	addChildComponent(appendText);
+	appendText->setTooltip("Append to name of data directory");
 
-    //diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace());
-    //diskMeter->repaint();
-    //refreshMeters();
-    startTimer(10);
+	//diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace());
+	//diskMeter->repaint();
+	//refreshMeters();
+	startTimer(10);
 
-    setWantsKeyboardFocus(true);
+	setWantsKeyboardFocus(true);
 
-    backgroundColour = Colour(58,58,58);
+	backgroundColour = Colour(58,58,58);
 
 }
 
@@ -465,336 +473,376 @@ ControlPanel::~ControlPanel()
 void ControlPanel::setRecordState(bool t)
 {
 
-    //MessageManager* mm = MessageManager::getInstance();
+	//MessageManager* mm = MessageManager::getInstance();
 
-    recordButton->setToggleState(t, sendNotification);
+	recordButton->setToggleState(t, sendNotification);
 
 }
 
 void ControlPanel::updateChildComponents()
 {
 
-    filenameComponent->addListener(getProcessorGraph()->getRecordNode());
-    getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent);
+	filenameComponent->addListener(getProcessorGraph()->getRecordNode());
+	getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent);
+	recordSelector->setSelectedId(1,sendNotificationSync);
 
 }
 
 void ControlPanel::createPaths()
 {
-    int w = getWidth() - 325;
-    if (w > 150)
-        w = 150;
+	/*  int w = getWidth() - 325;
+	if (w > 150)
+	w = 150;*/
+
+	int w = getWidth() - 435;
+	if (w > 40)
+		w = 40;
 
-    int h1 = getHeight()-32;
-    int h2 = getHeight();
-    int indent = 5;
+	int h1 = getHeight()-32;
+	int h2 = getHeight();
+	int indent = 5;
 
-    p1.clear();
-    p1.startNewSubPath(0, h1);
-    p1.lineTo(w, h1);
-    p1.lineTo(w + indent, h1 + indent);
-    p1.lineTo(w + indent, h2 - indent);
-    p1.lineTo(w + indent*2, h2);
-    p1.lineTo(0, h2);
-    p1.closeSubPath();
+	p1.clear();
+	p1.startNewSubPath(0, h1);
+	p1.lineTo(w, h1);
+	p1.lineTo(w + indent, h1 + indent);
+	p1.lineTo(w + indent, h2 - indent);
+	p1.lineTo(w + indent*2, h2);
+	p1.lineTo(0, h2);
+	p1.closeSubPath();
 
-    p2.clear();
-    p2.startNewSubPath(getWidth(), h2-indent);
-    p2.lineTo(getWidth(), h2);
-    p2.lineTo(getWidth()-indent, h2);
-    p2.closeSubPath();
+	p2.clear();
+	p2.startNewSubPath(getWidth(), h2-indent);
+	p2.lineTo(getWidth(), h2);
+	p2.lineTo(getWidth()-indent, h2);
+	p2.closeSubPath();
 
 }
 
 void ControlPanel::paint(Graphics& g)
 {
-    g.setColour(backgroundColour);
-    g.fillRect(0,0,getWidth(),getHeight());
+	g.setColour(backgroundColour);
+	g.fillRect(0,0,getWidth(),getHeight());
 
-    if (open)
-    {
-        createPaths();
-        g.setColour(Colours::black);
-        g.fillPath(p1);
-        g.fillPath(p2);
-    }
+	if (open)
+	{
+		createPaths();
+		g.setColour(Colours::black);
+		g.fillPath(p1);
+		g.fillPath(p2);
+	}
 
 }
 
 void ControlPanel::resized()
 {
-    int w = getWidth();
-    int h = 32; //getHeight();
-
-    if (playButton != 0)
-    {
-        if (w > 330)
-            playButton->setBounds(w-h*10,5,h-5,h-10);
-        \
-        else
-            playButton->setBounds(5,5,h-5,h-10);
-        \
-    }
-
-    if (recordButton != 0)
-    {
-        if (w > 330)
-            recordButton->setBounds(w-h*9,5,h-5,h-10);
-        else
-            recordButton->setBounds(5+h,5,h-5,h-10);
-    }
-
-    if (masterClock != 0)
-    {
-        if (w > 330)
-            masterClock->setBounds(w-h*7-15,0,h*7-15,h);
-        else
-            masterClock->setBounds(5+h*2+15,0,h*7-15,h);
-    }
-
-    int offset1 = 750 - getWidth();
-    if (offset1 > h)
-        offset1 = h;
-
-    int offset2 = 570 - getWidth();
-    if (offset2 > h)
-        offset2 = h;
-
-    if (cpuMeter != 0)
-    {
-
-        if (getWidth() < 750 && getWidth() >= 570)
-            cpuMeter->setBounds(8,h/4+offset1,h*3,h/2);
-        else if (getWidth() < 570)
-            cpuMeter->setBounds(8,h/4+offset1+offset2,h*3,h/2);
-        else
-            cpuMeter->setBounds(8,h/4,h*3,h/2);
-    }
-
-    if (diskMeter != 0)
-    {
-        if (getWidth() < 750 && getWidth() >= 570)
-            diskMeter->setBounds(16+h*3,h/4+offset1,h*3,h/2);
-        else if (getWidth() < 570)
-            diskMeter->setBounds(16+h*3,h/4+offset1+offset2,h*3,h/2);
-        else
-            diskMeter->setBounds(16+h*3,h/4,h*3,h/2);
-
-    }
-
-    if (audioEditor != 0)
-    {
-        if (getWidth() < 750 && getWidth() >= 570)
-            audioEditor->setBounds(w-526,0,h*8,h);
-        else if (getWidth() < 570)
-            audioEditor->setBounds(8,0+offset2,h*8,h);
-        else
-            audioEditor->setBounds(h*7,0,h*8,h);
-    }
-
-
-    if (cpb != 0)
-    {
-        if (open)
-            cpb->setBounds(w-28,getHeight()-5-h*2+10,h-10,h-10);
-        else
-            cpb->setBounds(w-28,getHeight()-5-h+10,h-10,h-10);
-    }
-
-    createPaths();
-
-    if (open)
-    {
-        int topBound = getHeight()-h+10-5;
-
-        filenameComponent->setBounds(165, topBound, w-500, h-10);
-        filenameComponent->setVisible(true);
-
-        newDirectoryButton->setBounds(w-h+4, topBound, h-10, h-10);
-        newDirectoryButton->setVisible(true);
-
-        prependText->setBounds(165+w-490, topBound, 50, h-10);
-        prependText->setVisible(true);
-
-        dateText->setBounds(165+w-435, topBound, 175, h-10);
-        dateText->setVisible(true);
-
-        appendText->setBounds(165+w-255, topBound, 50, h-10);
-        appendText->setVisible(true);
-
-    }
-    else
-    {
-        filenameComponent->setVisible(false);
-        newDirectoryButton->setVisible(false);
-        prependText->setVisible(false);
-        dateText->setVisible(false);
-        appendText->setVisible(false);
-    }
-
-    repaint();
+	int w = getWidth();
+	int h = 32; //getHeight();
+
+	if (playButton != 0)
+	{
+		if (w > 330)
+			playButton->setBounds(w-h*10,5,h-5,h-10);
+		\
+		else
+		playButton->setBounds(5,5,h-5,h-10);
+		\
+	}
+
+	if (recordButton != 0)
+	{
+		if (w > 330)
+			recordButton->setBounds(w-h*9,5,h-5,h-10);
+		else
+			recordButton->setBounds(5+h,5,h-5,h-10);
+	}
+
+	if (masterClock != 0)
+	{
+		if (w > 330)
+			masterClock->setBounds(w-h*7-15,0,h*7-15,h);
+		else
+			masterClock->setBounds(5+h*2+15,0,h*7-15,h);
+	}
+
+	int offset1 = 750 - getWidth();
+	if (offset1 > h)
+		offset1 = h;
+
+	int offset2 = 570 - getWidth();
+	if (offset2 > h)
+		offset2 = h;
+
+	if (cpuMeter != 0)
+	{
+
+		if (getWidth() < 750 && getWidth() >= 570)
+			cpuMeter->setBounds(8,h/4+offset1,h*3,h/2);
+		else if (getWidth() < 570)
+			cpuMeter->setBounds(8,h/4+offset1+offset2,h*3,h/2);
+		else
+			cpuMeter->setBounds(8,h/4,h*3,h/2);
+	}
+
+	if (diskMeter != 0)
+	{
+		if (getWidth() < 750 && getWidth() >= 570)
+			diskMeter->setBounds(16+h*3,h/4+offset1,h*3,h/2);
+		else if (getWidth() < 570)
+			diskMeter->setBounds(16+h*3,h/4+offset1+offset2,h*3,h/2);
+		else
+			diskMeter->setBounds(16+h*3,h/4,h*3,h/2);
+
+	}
+
+	if (audioEditor != 0)
+	{
+		if (getWidth() < 750 && getWidth() >= 570)
+			audioEditor->setBounds(w-526,0,h*8,h);
+		else if (getWidth() < 570)
+			audioEditor->setBounds(8,0+offset2,h*8,h);
+		else
+			audioEditor->setBounds(h*7,0,h*8,h);
+	}
+
+
+	if (cpb != 0)
+	{
+		if (open)
+			cpb->setBounds(w-28,getHeight()-5-h*2+10,h-10,h-10);
+		else
+			cpb->setBounds(w-28,getHeight()-5-h+10,h-10,h-10);
+	}
+
+	createPaths();
+
+	if (open)
+	{
+		int topBound = getHeight()-h+10-5;
+
+		recordSelector->setBounds((w - 435) > 40 ? 55 : w-430, topBound, 100, h-10);
+		recordSelector->setVisible(true);
+
+		filenameComponent->setBounds(165, topBound, w-500, h-10);
+		filenameComponent->setVisible(true);
+
+		newDirectoryButton->setBounds(w-h+4, topBound, h-10, h-10);
+		newDirectoryButton->setVisible(true);
+
+		prependText->setBounds(165+w-490, topBound, 50, h-10);
+		prependText->setVisible(true);
+
+		dateText->setBounds(165+w-435, topBound, 175, h-10);
+		dateText->setVisible(true);
+
+		appendText->setBounds(165+w-255, topBound, 50, h-10);
+		appendText->setVisible(true);
+
+	}
+	else
+	{
+		filenameComponent->setVisible(false);
+		newDirectoryButton->setVisible(false);
+		prependText->setVisible(false);
+		dateText->setVisible(false);
+		appendText->setVisible(false);
+		recordSelector->setVisible(false);
+	}
+
+	repaint();
 
 
 }
 
 void ControlPanel::openState(bool os)
 {
-    open = os;
+	open = os;
 
-    cpb->setState(os);
+	cpb->setState(os);
 
-    getUIComponent()->childComponentChanged();
+	getUIComponent()->childComponentChanged();
 }
 
 void ControlPanel::labelTextChanged(Label* label)
 {
-    graph->getRecordNode()->newDirectoryNeeded = true;
-    newDirectoryButton->setEnabledState(false);
-    masterClock->resetRecordTime();
+	graph->getRecordNode()->newDirectoryNeeded = true;
+	newDirectoryButton->setEnabledState(false);
+	masterClock->resetRecordTime();
 
-    dateText->setColour(Label::textColourId, Colours::grey);
+	dateText->setColour(Label::textColourId, Colours::grey);
 }
 
 void ControlPanel::startRecording()
 {
 
-    masterClock->startRecording(); // turn on recording
-    backgroundColour = Colour(255,0,0);
-    prependText->setEditable(false);
-    appendText->setEditable(false);
-    dateText->setColour(Label::textColourId, Colours::black);
+	masterClock->startRecording(); // turn on recording
+	backgroundColour = Colour(255,0,0);
+	prependText->setEditable(false);
+	appendText->setEditable(false);
+	dateText->setColour(Label::textColourId, Colours::black);
 
-    graph->setRecordState(true);
+	graph->setRecordState(true);
 
-    repaint();
+	repaint();
 }
 
 void ControlPanel::stopRecording()
 {
-    graph->setRecordState(false); // turn off recording in processor graph
+	graph->setRecordState(false); // turn off recording in processor graph
 
-    masterClock->stopRecording();
-    newDirectoryButton->setEnabledState(true);
-    backgroundColour = Colour(58,58,58);
+	masterClock->stopRecording();
+	newDirectoryButton->setEnabledState(true);
+	backgroundColour = Colour(58,58,58);
 
-    prependText->setEditable(true);
-    appendText->setEditable(true);
+	prependText->setEditable(true);
+	appendText->setEditable(true);
 
-    recordButton->setToggleState(false, dontSendNotification);
+	recordButton->setToggleState(false, dontSendNotification);
 
-    repaint();
+	repaint();
 }
 
 void ControlPanel::buttonClicked(Button* button)
 
 {
 
-    if (button == newDirectoryButton && newDirectoryButton->getEnabledState())
-    {
-        graph->getRecordNode()->newDirectoryNeeded = true;
-        newDirectoryButton->setEnabledState(false);
-        masterClock->resetRecordTime();
-
-        dateText->setColour(Label::textColourId, Colours::grey);
-
-        return;
-
-    }
-
-    if (button == playButton)
-    {
-        if (playButton->getToggleState())
-        {
-
-            if (graph->enableProcessors()) // start the processor graph
-            {
-                audio->beginCallbacks();
-                masterClock->start();
-                audioEditor->disable();
-
-                stopTimer();
-                startTimer(250); // refresh every 250 ms
-
-            }
-        }
-        else
-        {
-
-            if (recordButton->getToggleState())
-            {
-                stopRecording();
-            }
-
-            audio->endCallbacks();
-            graph->disableProcessors();
-            refreshMeters();
-            masterClock->stop();
-            stopTimer();
-            startTimer(60000); // back to refresh every minute
-            audioEditor->enable();
-
-        }
-
-        return;
-    }
-
-    if (button == recordButton)
-    {
-        if (recordButton->getToggleState())
-        {
-            if (playButton->getToggleState())
-            {
-                startRecording();
-            }
-            else
-            {
-                if (graph->enableProcessors()) // start the processor graph
-                {
-                    audio->beginCallbacks();
-                    masterClock->start();
-                    audioEditor->disable();
-
-                    stopTimer();
-                    startTimer(250); // refresh every 250 ms
-
-                    startRecording();
-
-                    playButton->setToggleState(true, dontSendNotification);
-
-                }
-            }
-        }
-        else
-        {
-            stopRecording();
-        }
-    }
-
+	if (button == newDirectoryButton && newDirectoryButton->getEnabledState())
+	{
+		graph->getRecordNode()->newDirectoryNeeded = true;
+		newDirectoryButton->setEnabledState(false);
+		masterClock->resetRecordTime();
+
+		dateText->setColour(Label::textColourId, Colours::grey);
+
+		return;
+
+	}
+
+	if (button == playButton)
+	{
+		if (playButton->getToggleState())
+		{
+
+			if (graph->enableProcessors()) // start the processor graph
+			{
+				audio->beginCallbacks();
+				masterClock->start();
+				audioEditor->disable();
+
+				stopTimer();
+				startTimer(250); // refresh every 250 ms
+
+			}
+			recordSelector->setEnabled(false);
+		}
+		else
+		{
+
+			if (recordButton->getToggleState())
+			{
+				stopRecording();
+			}
+
+			audio->endCallbacks();
+			graph->disableProcessors();
+			refreshMeters();
+			masterClock->stop();
+			stopTimer();
+			startTimer(60000); // back to refresh every minute
+			audioEditor->enable();
+			recordSelector->setEnabled(true);
+
+		}
+
+		return;
+	}
+
+	if (button == recordButton)
+	{
+		if (recordButton->getToggleState())
+		{
+			if (playButton->getToggleState())
+			{
+				startRecording();
+			}
+			else
+			{
+				if (graph->enableProcessors()) // start the processor graph
+				{
+					audio->beginCallbacks();
+					masterClock->start();
+					audioEditor->disable();
+
+					stopTimer();
+					startTimer(250); // refresh every 250 ms
+
+					startRecording();
+
+					playButton->setToggleState(true, dontSendNotification);
+
+				}
+				recordSelector->setEnabled(false);
+			}
+		}
+		else
+		{
+			stopRecording();
+		}
+	}
+
+}
+
+void ControlPanel::comboBoxChanged(ComboBox* combo)
+{
+	RecordEngine* re;
+	getProcessorGraph()->getRecordNode()->clearRecordEngines();
+	switch (combo->getSelectedId())
+	{
+	case 1:
+		re = static_cast<RecordEngine*>(new OriginalRecording());
+		break;
+	case 2:
+		re = static_cast<RecordEngine*>(new HDF5Recording());
+		break;
+	default:
+		std::cout << "Engine ComboBox: Bad ID" << std::endl;
+		combo->setSelectedId(1,dontSendNotification);
+		re = static_cast<RecordEngine*>(new OriginalRecording());
+		break;
+	}
+	re->setUIComponent(getUIComponent());
+	getProcessorGraph()->getRecordNode()->registerRecordEngine(re);
+
+	graph->getRecordNode()->newDirectoryNeeded = true;
+	newDirectoryButton->setEnabledState(false);
+	masterClock->resetRecordTime();
+
+	dateText->setColour(Label::textColourId, Colours::grey);
 }
 
 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;
-        refreshMeters();
-        stopTimer();
-        startTimer(60000); // back to refresh every 10 seconds
+	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;
+		refreshMeters();
+		stopTimer();
+		startTimer(60000); // back to refresh every 10 seconds
 
-    playButton->setToggleState(false, dontSendNotification);
-    recordButton->setToggleState(false, dontSendNotification);
-    masterClock->stopRecording();
-    masterClock->stop();
+	}
 
+	playButton->setToggleState(false, dontSendNotification);
+	recordButton->setToggleState(false, dontSendNotification);
+	recordSelector->setEnabled(true);
+	masterClock->stopRecording();
+	masterClock->stop();
 
 }
 
@@ -815,128 +863,130 @@ void ControlPanel::disableCallbacks()
 
 void ControlPanel::timerCallback()
 {
-    //std::cout << "Message Received." << std::endl;
-    refreshMeters();
+	//std::cout << "Message Received." << std::endl;
+	refreshMeters();
 
 }
 
 void ControlPanel::refreshMeters()
 {
-    if (playButton->getToggleState())
-    {
-        cpuMeter->updateCPU(audio->deviceManager.getCpuUsage());
-    }
-    else
-    {
-        cpuMeter->updateCPU(0.0f);
-    }
+	if (playButton->getToggleState())
+	{
+		cpuMeter->updateCPU(audio->deviceManager.getCpuUsage());
+	}
+	else
+	{
+		cpuMeter->updateCPU(0.0f);
+	}
 
-    cpuMeter->repaint();
+	cpuMeter->repaint();
 
-    masterClock->repaint();
+	masterClock->repaint();
 
-    diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace());
-    diskMeter->repaint();
+	diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace());
+	diskMeter->repaint();
 
-    if (initialize)
-    {
-        stopTimer();
-        startTimer(60000); // check for disk updates every minute
-        initialize = false;
-    }
+	if (initialize)
+	{
+		stopTimer();
+		startTimer(60000); // check for disk updates every minute
+		initialize = false;
+	}
 }
 
 bool ControlPanel::keyPressed(const KeyPress& key)
 {
-    std::cout << "Control panel received" << key.getKeyCode() << std::endl;
+	std::cout << "Control panel received" << key.getKeyCode() << std::endl;
 
-    return false;
+	return false;
 
 }
 
 void ControlPanel::toggleState()
 {
-    open = !open;
+	open = !open;
 
-    cpb->toggleState();
-    getUIComponent()->childComponentChanged();
+	cpb->toggleState();
+	getUIComponent()->childComponentChanged();
 }
 
 String ControlPanel::getTextToAppend()
 {
-    String t = appendText->getText();
+	String t = appendText->getText();
 
-    if (t.length() > 0)
-    {
-        return "_" + t;
-    }
-    else
-    {
-        return t;
-    }
+	if (t.length() > 0)
+	{
+		return "_" + t;
+	}
+	else
+	{
+		return t;
+	}
 }
 
 String ControlPanel::getTextToPrepend()
 {
-    String t = prependText->getText();
+	String t = prependText->getText();
 
-    if (t.length() > 0)
-    {
-        return t + "_";
-    }
-    else
-    {
-        return t;
-    }
+	if (t.length() > 0)
+	{
+		return t + "_";
+	}
+	else
+	{
+		return t;
+	}
 }
 
 void ControlPanel::setDateText(String t)
 {
-    dateText->setText(t, dontSendNotification);
+	dateText->setText(t, dontSendNotification);
 }
 
 
 void ControlPanel::saveStateToXml(XmlElement* xml)
 {
 
-    XmlElement* controlPanelState = xml->createNewChildElement("CONTROLPANEL");
-    controlPanelState->setAttribute("isOpen",open);
-    controlPanelState->setAttribute("prependText",prependText->getText());
-    controlPanelState->setAttribute("appendText",appendText->getText());
+	XmlElement* controlPanelState = xml->createNewChildElement("CONTROLPANEL");
+	controlPanelState->setAttribute("isOpen",open);
+	controlPanelState->setAttribute("prependText",prependText->getText());
+	controlPanelState->setAttribute("appendText",appendText->getText());
+	controlPanelState->setAttribute("recordEngine",recordSelector->getSelectedId());
 
-    audioEditor->saveStateToXml(xml);
+	audioEditor->saveStateToXml(xml);
 
 }
 
 void ControlPanel::loadStateFromXml(XmlElement* xml)
 {
 
-    forEachXmlChildElement(*xml, xmlNode)
-    {
-        if (xmlNode->hasTagName("CONTROLPANEL"))
-        {
+	forEachXmlChildElement(*xml, xmlNode)
+	{
+		if (xmlNode->hasTagName("CONTROLPANEL"))
+		{
 
-            appendText->setText(xmlNode->getStringAttribute("appendText", ""), dontSendNotification);
-            prependText->setText(xmlNode->getStringAttribute("prependText", ""), dontSendNotification);
+			appendText->setText(xmlNode->getStringAttribute("appendText", ""), dontSendNotification);
+			prependText->setText(xmlNode->getStringAttribute("prependText", ""), dontSendNotification);
+			recordSelector->setSelectedId(xmlNode->getIntAttribute("recordEngine",1), sendNotificationSync);
 
-            bool isOpen = xmlNode->getBoolAttribute("isOpen");
-            openState(isOpen);
+			bool isOpen = xmlNode->getBoolAttribute("isOpen");
+			openState(isOpen);
 
-        }
-    }
+		}
+	}
 
-    audioEditor->loadStateFromXml(xml);
+	audioEditor->loadStateFromXml(xml);
 
 }
 
 
 StringArray ControlPanel::getRecentlyUsedFilenames()
 {
-    return filenameComponent->getRecentlyUsedFilenames();
+	return filenameComponent->getRecentlyUsedFilenames();
 }
 
 
 void ControlPanel::setRecentlyUsedFilenames(const StringArray& filenames)
 {
-    filenameComponent->setRecentlyUsedFilenames(filenames);
+	filenameComponent->setRecentlyUsedFilenames(filenames);
 }
\ No newline at end of file
diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h
index 2e623282d7742f1a6255c25fedc2f4fa58c3ec5f..3632c3a711c476f5bcb634bf3514691f8c23f5e7 100755
--- a/Source/UI/ControlPanel.h
+++ b/Source/UI/ControlPanel.h
@@ -277,7 +277,8 @@ class ControlPanel : public Component,
     public Button::Listener,
     public Timer,
     public AccessClass,
-    public Label::Listener
+    public Label::Listener,
+	public ComboBox::Listener
 
 {
 public:
@@ -352,6 +353,8 @@ private:
     ScopedPointer<UtilityButton> newDirectoryButton;
     ScopedPointer<ControlPanelButton> cpb;
 
+	ScopedPointer<ComboBox> recordSelector;
+
     ScopedPointer<Label> prependText;
     ScopedPointer<Label> dateText;
     ScopedPointer<Label> appendText;
@@ -366,6 +369,8 @@ private:
 
     void buttonClicked(Button* button);
 
+	void comboBoxChanged(ComboBox* combo);
+
     bool initialize;
 
     /** Adds the RecordNode as a listener of the FilenameComponent
diff --git a/open-ephys.jucer b/open-ephys.jucer
index ce7c632944877ae23e88f6370ddc31a107157b3f..9794666263e6902be9299f472e636cc48d2b8544 100644
--- a/open-ephys.jucer
+++ b/open-ephys.jucer
@@ -12,7 +12,7 @@
               includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
-               extraLinkerFlags="" objCExtraSuffix="fea2mT" externalLibraries="">
+               extraLinkerFlags="-lhdf5" objCExtraSuffix="fea2mT">
       <CONFIGURATIONS>
         <CONFIGURATION name="Debug" isDebug="1" optimisation="3" targetName="open-ephys"
                        osxSDK="default" osxCompatibility="default" osxArchitecture="default"/>
@@ -37,7 +37,7 @@
         <MODULEPATH id="juce_audio_basics" path="JuceLibraryCode/modules"/>
       </MODULEPATHS>
     </XCODE_MAC>
-    <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" extraLinkerFlags="-pg -ldl -lXext -lGLU -lhdf5"
+    <LINUX_MAKE targetFolder="Builds/Linux" vstFolder="~/SDKs/vstsdk2.4" extraLinkerFlags="-pg -ldl -lXext -lGLU -lhdf5 -lhdf5_cpp"
                 extraCompilerFlags="-export-dynamic -g -pg -std=c++0x">
       <CONFIGURATIONS>
         <CONFIGURATION name="Debug" isDebug="1" optimisation="3" targetName="open-ephys"
@@ -64,24 +64,28 @@
       </MODULEPATHS>
     </LINUX_MAKE>
     <VS2012 targetFolder="Builds/VisualStudio2012" libraryType="1" extraDefs="NOMINMAX"
-            externalLibraries="setupapi.lib&#10;opengl32.lib&#10;glu32.lib">
+            externalLibraries="setupapi.lib&#10;opengl32.lib&#10;glu32.lib&#10;szip.lib&#10;zlib.lib&#10;hdf5.lib&#10;hdf5_cpp.lib">
       <CONFIGURATIONS>
         <CONFIGURATION name="Debug" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit"
                        isDebug="1" optimisation="1" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Debug\bin"
-                       headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x86&#10;../../Resources/Google Protocols/vsprojects/Debug"
-                       postbuildCommand="copy ..\..\Resources\DLLs\okFrontPanel.dll .\Debug\bin"/>
+                       headerPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include&#10;../../Resources/Google Protocols/src&#10;"
+                       libraryPath="../../Resources/ZeroMQ/lib_x86&#10;../../Resources/Google Protocols/vsprojects/Debug&#10;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib"
+                       postbuildCommand="call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;"/>
         <CONFIGURATION name="Release" winWarningLevel="4" generateManifest="1" winArchitecture="32-bit"
                        isDebug="0" optimisation="3" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Release\bin"
-                       headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x86&#10;../../Resources/Google Protocols/vsprojects/Release"
-                       postbuildCommand="copy ..\..\Resources\DLLs\okFrontPanel.dll .\Release\bin"/>
+                       headerPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\include&#10;../../Resources/Google Protocols/src"
+                       libraryPath="$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\lib&#10;../../Resources/ZeroMQ/lib_x86&#10;../../Resources/Google Protocols/vsprojects/Release"
+                       postbuildCommand="call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;"/>
         <CONFIGURATION name="Debug64" winWarningLevel="2" generateManifest="1" winArchitecture="x64"
                        isDebug="1" optimisation="1" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Debug64\bin"
-                       headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x64&#10;../../Resources/Google Protocols/vsprojects/x64/Debug"
-                       postbuildCommand="copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Debug64\bin"/>
+                       headerPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include&#10;../../Resources/Google Protocols/src"
+                       libraryPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib&#10;../../Resources/ZeroMQ/lib_x64&#10;../../Resources/Google Protocols/vsprojects/x64/Debug"
+                       postbuildCommand="call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;"/>
         <CONFIGURATION name="Release64" winWarningLevel="2" generateManifest="1" winArchitecture="x64"
                        isDebug="0" optimisation="3" targetName="open-ephys" binaryPath="Builds\VisualStudio2012\Release64\bin"
-                       headerPath="../../Resources/Google Protocols/src" libraryPath="../../Resources/ZeroMQ/lib_x64&#10;../../Resources/Google Protocols/vsprojects/x64/Release"
-                       postbuildCommand="copy ..\..\Resources\DLLs\Win64\okFrontPanel.dll .\Release64\bin"/>
+                       headerPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\include&#10;../../Resources/Google Protocols/src"
+                       libraryPath="$(MSBuildExtensionsPath64)\..\HDF_Group\HDF5\1.8.12\lib&#10;../../Resources/ZeroMQ/lib_x64&#10;../../Resources/Google Protocols/vsprojects/x64/Release"
+                       postbuildCommand="call &quot;$(SolutionDir)\copydlls.cmd&quot; &quot;$(MSBuildExtensionsPath32)\..\HDF_Group\HDF5\1.8.12\bin&quot; &quot;$(SolutionDir)\..\..\Resources\DLLs&quot; &quot;$(OutDir)&quot;"/>
       </CONFIGURATIONS>
       <MODULEPATHS>
         <MODULEPATH id="juce_video" path="JuceLibraryCode/modules"/>
@@ -286,6 +290,20 @@
               file="Source/Processors/SpikeSortBoxes.h"/>
         <FILE id="LfiaEP" name="SpikeSorter.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter.cpp"/>
         <FILE id="OeZ3tb" name="SpikeSorter.h" compile="0" resource="0" file="Source/Processors/SpikeSorter.h"/>
+        <FILE id="GP1WNZ" name="HDF5FileFormat.cpp" compile="1" resource="0"
+              file="Source/Processors/HDF5FileFormat.cpp"/>
+        <FILE id="ggxZWd" name="HDF5FileFormat.h" compile="0" resource="0"
+              file="Source/Processors/HDF5FileFormat.h"/>
+        <FILE id="TJ0Hmt" name="OriginalRecording.cpp" compile="1" resource="0"
+              file="Source/Processors/OriginalRecording.cpp"/>
+        <FILE id="z11idO" name="OriginalRecording.h" compile="0" resource="0"
+              file="Source/Processors/OriginalRecording.h"/>
+        <FILE id="ikbpX1" name="RecordEngine.cpp" compile="1" resource="0"
+              file="Source/Processors/RecordEngine.cpp"/>
+        <FILE id="uqGmrZ" name="RecordEngine.h" compile="0" resource="0" file="Source/Processors/RecordEngine.h"/>
+        <FILE id="eUtNHW" name="HDF5Recording.cpp" compile="1" resource="0"
+              file="Source/Processors/HDF5Recording.cpp"/>
+        <FILE id="dXX5ds" name="HDF5Recording.h" compile="0" resource="0" file="Source/Processors/HDF5Recording.h"/>
         <FILE id="Yj1umv" name="SerialInput.cpp" compile="1" resource="0" file="Source/Processors/SerialInput.cpp"/>
         <FILE id="TSsuVv" name="SerialInput.h" compile="0" resource="0" file="Source/Processors/SerialInput.h"/>
         <FILE id="M6nCIs" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader.cpp"/>