diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index 2ed899ec5977a7eb734086eff1d1d0b700e3ae38..91537484f2186024acfeb0161884ad5069768682 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -63,6 +63,7 @@ OBJECTS := \
   $(OBJDIR)/RootFinder_239a995f.o \
   $(OBJDIR)/State_22979684.o \
   $(OBJDIR)/AudioComponent_521bd9c9.o \
+  $(OBJDIR)/LfpTriggeredAverageNode_ff52d7b9.o \
   $(OBJDIR)/FileReader_18023b0e.o \
   $(OBJDIR)/ChannelMappingNode_d9219b9c.o \
   $(OBJDIR)/PulsePalOutput_9f4ef492.o \
@@ -83,6 +84,7 @@ OBJECTS := \
   $(OBJDIR)/RecordControl_3e1c6062.o \
   $(OBJDIR)/Merger_2f90542e.o \
   $(OBJDIR)/Splitter_6e27a57b.o \
+  $(OBJDIR)/LfpTriggeredAverageCanvas_50148944.o \
   $(OBJDIR)/SpikeObject_24e8c655.o \
   $(OBJDIR)/SpikeDisplayCanvas_b208ff6e.o \
   $(OBJDIR)/DataWindow_83ce6754.o \
@@ -91,6 +93,7 @@ OBJECTS := \
   $(OBJDIR)/SpikeDetector_300d85e7.o \
   $(OBJDIR)/AudioNode_94606ff3.o \
   $(OBJDIR)/EventNode_95c842b7.o \
+  $(OBJDIR)/LfpTriggeredAverageEditor_101d75b.o \
   $(OBJDIR)/ChannelMappingEditor_dd803b0.o \
   $(OBJDIR)/FileReaderEditor_16fd7744.o \
   $(OBJDIR)/PhaseDetectorEditor_f53aa520.o \
@@ -281,6 +284,11 @@ $(OBJDIR)/AudioComponent_521bd9c9.o: ../../Source/Audio/AudioComponent.cpp
 	@echo "Compiling AudioComponent.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/LfpTriggeredAverageNode_ff52d7b9.o: ../../Source/Processors/LfpTriggeredAverageNode.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpTriggeredAverageNode.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/FileReader_18023b0e.o: ../../Source/Processors/FileReader.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling FileReader.cpp"
@@ -381,6 +389,11 @@ $(OBJDIR)/Splitter_6e27a57b.o: ../../Source/Processors/Utilities/Splitter.cpp
 	@echo "Compiling Splitter.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/LfpTriggeredAverageCanvas_50148944.o: ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpTriggeredAverageCanvas.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/SpikeObject_24e8c655.o: ../../Source/Processors/Visualization/SpikeObject.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling SpikeObject.cpp"
@@ -421,6 +434,11 @@ $(OBJDIR)/EventNode_95c842b7.o: ../../Source/Processors/EventNode.cpp
 	@echo "Compiling EventNode.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/LfpTriggeredAverageEditor_101d75b.o: ../../Source/Processors/Editors/LfpTriggeredAverageEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpTriggeredAverageEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/ChannelMappingEditor_dd803b0.o: ../../Source/Processors/Editors/ChannelMappingEditor.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling ChannelMappingEditor.cpp"
diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
index f829487126d20777ccbeb42992e81576c96a2ea2..2ab804390d78a0bde8f0c99528355c0d7b123d0b 100644
--- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
@@ -41,6 +41,7 @@
 		AE06672D2CBF8F64465B2126 = { isa = PBXBuildFile; fileRef = 3F69480D6145C77992FA59BA; };
 		69630D3ECA4D6014EE3734CD = { isa = PBXBuildFile; fileRef = C1CB526B75E406851FA918C6; };
 		0AE243437B40602D35435C32 = { isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; };
+		A2969F0562F47DEF11181DF0 = { isa = PBXBuildFile; fileRef = FD30B010D9F45E5ACC7A7096; };
 		F25EC78DCCC9CCEE805AE011 = { isa = PBXBuildFile; fileRef = 9215DC26F511C58DEE009209; };
 		EA6A1BDDF81818D516B93DD6 = { isa = PBXBuildFile; fileRef = 5654BDD4FBFF01AC3F17FA0D; };
 		7077270005BA819E3D5654B5 = { isa = PBXBuildFile; fileRef = DBB295F412798131D3F04045; };
@@ -61,6 +62,7 @@
 		E4DA638CDD4DD574A6CD843E = { isa = PBXBuildFile; fileRef = 258938780F93A7CF41366F26; };
 		2B4A80DCF867DC025C21966B = { isa = PBXBuildFile; fileRef = 4867923F31CC3EDC9B1A5BE5; };
 		D0E9E20F9D8FDA700BB6D820 = { isa = PBXBuildFile; fileRef = 2C4730CAFED4F6292B575318; };
+		7A74EFD7EF20C9D185DBD9FA = { isa = PBXBuildFile; fileRef = 2AC957BA2C6BE4A7678FCA50; };
 		19BB86C918F89D1377F8A0E1 = { isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9; };
 		EE56A6BBBFA4A27A4BCF7279 = { isa = PBXBuildFile; fileRef = A7D4C9E3ED3763847C087F46; };
 		1B620FC17AAECA4C5DE741E2 = { isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E; };
@@ -69,6 +71,7 @@
 		ED8CB527B27C67E9E4DA027C = { isa = PBXBuildFile; fileRef = BC3B7E4E25505D9044BFACC7; };
 		DE758AF46844DF951655966C = { isa = PBXBuildFile; fileRef = B27F558F42AC78F0E564B5AF; };
 		80E5365461A5A7A32C48C563 = { isa = PBXBuildFile; fileRef = F94DD42C7BBF81C101D3F605; };
+		DD77A0AB68C932F294B753C2 = { isa = PBXBuildFile; fileRef = 7B7819A5759B54D91E334447; };
 		52E0D9DC7F5C4703257D8BEB = { isa = PBXBuildFile; fileRef = B083B1375828610D55F12CF3; };
 		EA46BA3970E958013FF85690 = { isa = PBXBuildFile; fileRef = 4B0097003751A59A11FA8C5B; };
 		88B896EB9793E0C44410D981 = { isa = PBXBuildFile; fileRef = 75B1E4EFCDA9A506CFEDB09F; };
@@ -280,6 +283,7 @@
 		215B159836CE40810964B773 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; };
 		215E1BD79B5870D5356810F0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Visualizer.h; path = ../../Source/Processors/Visualization/Visualizer.h; sourceTree = "SOURCE_ROOT"; };
 		217032322A2570ABAC47194C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; };
+		2196ED9DD4262C60135E77F5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageEditor.h; path = ../../Source/Processors/Editors/LfpTriggeredAverageEditor.h; sourceTree = "SOURCE_ROOT"; };
 		21A0260D2DB039B81DF4970C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; };
 		21C11A58CAA0F9E86AA204EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; };
 		21D3C1095D2B5A834D998B74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -319,6 +323,7 @@
 		29FD7B383C5DDACAA7B8DFD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MergerEditor.cpp; path = ../../Source/Processors/Editors/MergerEditor.cpp; sourceTree = "SOURCE_ROOT"; };
 		2A3230DEAAC86A9090950703 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2AB1CC4252DB09507ED31482 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; };
+		2AC957BA2C6BE4A7678FCA50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageCanvas.cpp; path = ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp; sourceTree = "SOURCE_ROOT"; };
 		2AE12F85965B8BE4A0E12F67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; };
 		2B134713E91426120A994CB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2B19F2DE42A91F56C2380F9A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -407,6 +412,7 @@
 		3FFD5E5D5C1D8B48DBBB9D18 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; };
 		402BC572EE3E8EC418946CE0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; };
 		405298E6CE1C80EC7CC43A87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		4061311AF3F3487DD3995871 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageNode.h; path = ../../Source/Processors/LfpTriggeredAverageNode.h; sourceTree = "SOURCE_ROOT"; };
 		40C22F3CD61DDB9C7B3DCCA6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; };
 		4133FE7830C52BBA035D82B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; };
 		414D8E6E4EE98E66C2583A50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -669,6 +675,7 @@
 		7ACB1CB66D69738904358F43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Design.h; path = ../../Source/Dsp/Design.h; sourceTree = "SOURCE_ROOT"; };
 		7B42B28FDB2E3AC67EF296F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PracticalSocket.h; path = ../../Source/Network/PracticalSocket.h; sourceTree = "SOURCE_ROOT"; };
 		7B674BB1DA11A4E58EA71624 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; };
+		7B7819A5759B54D91E334447 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageEditor.cpp; path = ../../Source/Processors/Editors/LfpTriggeredAverageEditor.cpp; sourceTree = "SOURCE_ROOT"; };
 		7BCE1C09508E1B9CFC79C185 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		7BD2C39F13FDE202141C4B41 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MessageCenter.cpp; path = ../../Source/UI/MessageCenter.cpp; sourceTree = "SOURCE_ROOT"; };
 		7BE7EBBCC4DCF760A1AA697E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; };
@@ -788,6 +795,7 @@
 		92E07CA13571893873565AC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; };
 		92E3405CB31ACFE3F80BBAD4 = { isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoBlack.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoBlack.png; sourceTree = "SOURCE_ROOT"; };
 		92EC6BB8A8C4C5A61F43C233 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; };
+		932577DC3232F4576A87F063 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageCanvas.h; path = ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.h; sourceTree = "SOURCE_ROOT"; };
 		9360657FDE33FA37D80075D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9380932BED279F91B8C1C04B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; };
 		93EFC1AA800FC5DA2F04A213 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-04.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-04.png"; sourceTree = "SOURCE_ROOT"; };
@@ -1189,40 +1197,40 @@
 		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"; };
+		EF8488936B3D3E9178C9099C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.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"; };
-		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"; };
-		F2FDC07162CAEDE524F09CFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.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"; };
 		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"; };
-		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"; };
-		EF4A6E0E1232071252ACCD7B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.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"; };
-		EF8488936B3D3E9178C9099C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.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"; };
+		EF059B26886B32000BCF8CFF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.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"; };
 		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"; };
 		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"; };
 		F1DBAE92084D9D90234AC436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; 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"; };
+		F2FDC07162CAEDE524F09CFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.cpp; sourceTree = "SOURCE_ROOT"; };
 		F3D0224E4247BCB06A9E4DDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F3F48717927A4E24F7373C09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; };
 		F463A19E6EFEB2837582B117 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1254,6 +1262,7 @@
 		FC080F7DF94ABCB7EA09224A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; };
 		FC85D30C66E7A4E4A6CA29AE = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_bold.otf"; path = "../../Resources/Fonts/cpmono_bold.otf"; sourceTree = "SOURCE_ROOT"; };
 		FC887C6CD74FE33F8BA784A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MergerEditor.h; path = ../../Source/Processors/Editors/MergerEditor.h; sourceTree = "SOURCE_ROOT"; };
+		FD30B010D9F45E5ACC7A7096 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageNode.cpp; path = ../../Source/Processors/LfpTriggeredAverageNode.cpp; sourceTree = "SOURCE_ROOT"; };
 		FD3A6BD3A8898E137DF257B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; };
 		FD770E73FD462E9C9F6DBFB2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
 		FD88DA941838FC91D222DF35 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1400,6 +1409,8 @@
 				2C4730CAFED4F6292B575318,
 				B1082A8A306A1947F5B0E5FC ); name = Utilities; sourceTree = "<group>"; };
 		C4B85C0286AC2510730355E3 = { isa = PBXGroup; children = (
+				2AC957BA2C6BE4A7678FCA50,
+				932577DC3232F4576A87F063,
 				5894D40A0E8FA6E9B3EBF9D9,
 				ADCB42E4C5641007A4B78025,
 				A7D4C9E3ED3763847C087F46,
@@ -1412,6 +1423,8 @@
 				F2FDC07162CAEDE524F09CFC,
 				DA4A6BD7079F2BC73B5035F3 ); name = Visualization; sourceTree = "<group>"; };
 		9F16043BF599BCE0C02A00A5 = { isa = PBXGroup; children = (
+				7B7819A5759B54D91E334447,
+				2196ED9DD4262C60135E77F5,
 				B083B1375828610D55F12CF3,
 				E442E1FA7B58BFF6F1D8CBD8,
 				4B0097003751A59A11FA8C5B,
@@ -1488,6 +1501,8 @@
 				92602D7166325C7232B85EDD,
 				0287B009511521BEAAE8A52C ); name = DataThreads; sourceTree = "<group>"; };
 		83A3E005DDFCC55F277EEDA5 = { isa = PBXGroup; children = (
+				FD30B010D9F45E5ACC7A7096,
+				4061311AF3F3487DD3995871,
 				9215DC26F511C58DEE009209,
 				FB071D0659E5F1CC630D765A,
 				5654BDD4FBFF01AC3F17FA0D,
@@ -2734,6 +2749,7 @@
 				AE06672D2CBF8F64465B2126,
 				69630D3ECA4D6014EE3734CD,
 				0AE243437B40602D35435C32,
+				A2969F0562F47DEF11181DF0,
 				F25EC78DCCC9CCEE805AE011,
 				EA6A1BDDF81818D516B93DD6,
 				7077270005BA819E3D5654B5,
@@ -2754,6 +2770,7 @@
 				E4DA638CDD4DD574A6CD843E,
 				2B4A80DCF867DC025C21966B,
 				D0E9E20F9D8FDA700BB6D820,
+				7A74EFD7EF20C9D185DBD9FA,
 				19BB86C918F89D1377F8A0E1,
 				EE56A6BBBFA4A27A4BCF7279,
 				1B620FC17AAECA4C5DE741E2,
@@ -2762,6 +2779,7 @@
 				ED8CB527B27C67E9E4DA027C,
 				DE758AF46844DF951655966C,
 				80E5365461A5A7A32C48C563,
+				DD77A0AB68C932F294B753C2,
 				52E0D9DC7F5C4703257D8BEB,
 				EA46BA3970E958013FF85690,
 				88B896EB9793E0C44410D981,
diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj b/Builds/VisualStudio2010/open-ephys.vcxproj
index eb4b9ededa47f8060e24daf256383641e64ad75f..f2007e43204ca13473c0022d891b1a69baf4b71b 100644
--- a/Builds/VisualStudio2010/open-ephys.vcxproj
+++ b/Builds/VisualStudio2010/open-ephys.vcxproj
@@ -147,6 +147,7 @@
     <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/>
     <ClCompile Include="..\..\Source\Dsp\State.cpp"/>
     <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/>
@@ -167,6 +168,7 @@
     <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\LfpTriggeredAverageCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/>
@@ -175,6 +177,7 @@
     <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/>
     <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/>
@@ -1329,6 +1332,7 @@
     <ClInclude Include="..\..\Source\Dsp\Types.h"/>
     <ClInclude Include="..\..\Source\Dsp\Utilities.h"/>
     <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/>
+    <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"/>
     <ClInclude Include="..\..\Source\Processors\FileReader.h"/>
     <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/>
     <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/>
@@ -1350,6 +1354,7 @@
     <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\LfpTriggeredAverageCanvas.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/>
@@ -1359,6 +1364,7 @@
     <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/>
     <ClInclude Include="..\..\Source\Processors\AudioNode.h"/>
     <ClInclude Include="..\..\Source\Processors\EventNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/>
diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj.filters b/Builds/VisualStudio2010/open-ephys.vcxproj.filters
index d3b246777c040cb767e2472ca97ae6d1748bcf7b..eb4fd308585a287a2d93aab5448af0bf38594dac 100644
--- a/Builds/VisualStudio2010/open-ephys.vcxproj.filters
+++ b/Builds/VisualStudio2010/open-ephys.vcxproj.filters
@@ -415,6 +415,9 @@
     <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp">
       <Filter>open-ephys\Source\Audio</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\FileReader.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
@@ -475,6 +478,9 @@
     <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp">
       <Filter>open-ephys\Source\Processors\Utilities</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp">
+      <Filter>open-ephys\Source\Processors\Visualization</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp">
       <Filter>open-ephys\Source\Processors\Visualization</Filter>
     </ClCompile>
@@ -499,6 +505,9 @@
     <ClCompile Include="..\..\Source\Processors\EventNode.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp">
+      <Filter>open-ephys\Source\Processors\Editors</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp">
       <Filter>open-ephys\Source\Processors\Editors</Filter>
     </ClCompile>
@@ -1920,6 +1929,9 @@
     <ClInclude Include="..\..\Source\Audio\AudioComponent.h">
       <Filter>open-ephys\Source\Audio</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\FileReader.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
@@ -1983,6 +1995,9 @@
     <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h">
       <Filter>open-ephys\Source\Processors\Utilities</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h">
+      <Filter>open-ephys\Source\Processors\Visualization</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h">
       <Filter>open-ephys\Source\Processors\Visualization</Filter>
     </ClInclude>
@@ -2010,6 +2025,9 @@
     <ClInclude Include="..\..\Source\Processors\EventNode.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h">
+      <Filter>open-ephys\Source\Processors\Editors</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h">
       <Filter>open-ephys\Source\Processors\Editors</Filter>
     </ClInclude>
diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj
index ecb81902960d1f599a4666f55efdbcdb16ad00e4..35644804d4a265eb5114433c76b23c1720bddc78 100644
--- a/Builds/VisualStudio2012/open-ephys.vcxproj
+++ b/Builds/VisualStudio2012/open-ephys.vcxproj
@@ -163,6 +163,7 @@
     <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/>
     <ClCompile Include="..\..\Source\Dsp\State.cpp"/>
     <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/>
@@ -183,6 +184,7 @@
     <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\LfpTriggeredAverageCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/>
@@ -191,6 +193,7 @@
     <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/>
     <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/>
@@ -1345,6 +1348,7 @@
     <ClInclude Include="..\..\Source\Dsp\Types.h"/>
     <ClInclude Include="..\..\Source\Dsp\Utilities.h"/>
     <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/>
+    <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"/>
     <ClInclude Include="..\..\Source\Processors\FileReader.h"/>
     <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/>
     <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/>
@@ -1366,6 +1370,7 @@
     <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\LfpTriggeredAverageCanvas.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/>
     <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/>
@@ -1375,6 +1380,7 @@
     <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/>
     <ClInclude Include="..\..\Source\Processors\AudioNode.h"/>
     <ClInclude Include="..\..\Source\Processors\EventNode.h"/>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/>
     <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/>
diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj.filters b/Builds/VisualStudio2012/open-ephys.vcxproj.filters
index d3b246777c040cb767e2472ca97ae6d1748bcf7b..eb4fd308585a287a2d93aab5448af0bf38594dac 100644
--- a/Builds/VisualStudio2012/open-ephys.vcxproj.filters
+++ b/Builds/VisualStudio2012/open-ephys.vcxproj.filters
@@ -415,6 +415,9 @@
     <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp">
       <Filter>open-ephys\Source\Audio</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\FileReader.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
@@ -475,6 +478,9 @@
     <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp">
       <Filter>open-ephys\Source\Processors\Utilities</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp">
+      <Filter>open-ephys\Source\Processors\Visualization</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp">
       <Filter>open-ephys\Source\Processors\Visualization</Filter>
     </ClCompile>
@@ -499,6 +505,9 @@
     <ClCompile Include="..\..\Source\Processors\EventNode.cpp">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp">
+      <Filter>open-ephys\Source\Processors\Editors</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp">
       <Filter>open-ephys\Source\Processors\Editors</Filter>
     </ClCompile>
@@ -1920,6 +1929,9 @@
     <ClInclude Include="..\..\Source\Audio\AudioComponent.h">
       <Filter>open-ephys\Source\Audio</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h">
+      <Filter>open-ephys\Source\Processors</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\FileReader.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
@@ -1983,6 +1995,9 @@
     <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h">
       <Filter>open-ephys\Source\Processors\Utilities</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h">
+      <Filter>open-ephys\Source\Processors\Visualization</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h">
       <Filter>open-ephys\Source\Processors\Visualization</Filter>
     </ClInclude>
@@ -2010,6 +2025,9 @@
     <ClInclude Include="..\..\Source\Processors\EventNode.h">
       <Filter>open-ephys\Source\Processors</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h">
+      <Filter>open-ephys\Source\Processors\Editors</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h">
       <Filter>open-ephys\Source\Processors\Editors</Filter>
     </ClInclude>
diff --git a/JuceLibraryCode/BinaryData.cpp b/JuceLibraryCode/BinaryData.cpp
index 6c225d9e3468f216ae8b798f5a27e14fd6dcf224..b2387ecd88ddf59b96517dee48ea56f45b6ae896 100644
--- a/JuceLibraryCode/BinaryData.cpp
+++ b/JuceLibraryCode/BinaryData.cpp
@@ -8,7 +8,7 @@ namespace BinaryData
 {
 
 //================== cpmono-black-serialized ==================
-static const unsigned char temp_77517bbb[] =
+static const unsigned char temp_8b870a76[] =
 { 120,156,237,157,127,156,149,85,181,255,71,65,64,12,10,47,132,9,130,81,152,63,80,233,226,197,66,158,103,176,240,66,23,47,136,93,12,186,24,196,211,65,177,51,228,185,151,210,11,134,66,141,97,160,32,40,5,57,6,130,130,160,99,16,36,8,231,57,6,66,98,160,24,
 212,24,228,143,33,212,41,16,20,196,194,160,190,251,253,89,207,179,103,200,31,13,126,49,61,190,248,99,102,125,94,103,255,90,251,199,179,247,218,107,175,189,246,231,47,249,207,111,140,252,198,144,111,117,62,191,164,164,100,240,228,207,149,158,90,242,55,
 135,142,41,89,184,160,105,233,200,50,7,75,102,111,106,20,102,1,35,103,117,41,100,245,123,10,8,138,202,58,116,184,43,56,99,112,251,66,22,16,54,253,82,144,221,176,126,103,232,1,65,81,217,105,133,167,2,151,199,13,217,19,170,162,176,124,199,173,113,150,95,
@@ -229,10 +229,10 @@ static const unsigned char temp_77517bbb[] =
 33,16,98,208,66,64,165,133,0,168,139,0,116,17,81,213,69,164,165,35,200,236,208,187,111,169,2,12,170,46,2,72,31,2,160,188,148,147,168,140,108,213,204,0,29,214,114,202,236,65,226,103,102,120,232,129,212,29,171,247,93,105,234,14,91,227,94,138,253,11,117,
 39,245,137,109,181,198,15,39,160,102,201,43,166,238,224,78,3,234,14,168,158,218,3,104,152,0,24,38,68,213,48,33,173,29,159,199,233,48,177,155,126,42,15,0,3,176,29,101,254,118,116,116,191,107,163,251,200,205,65,174,242,37,255,15,41,157,224,99,0,0 };
 
-const char* cpmonoblackserialized = (const char*) temp_77517bbb;
+const char* cpmonoblackserialized = (const char*) temp_8b870a76;
 
 //================== cpmono-bold-serialized ==================
-static const unsigned char temp_62a06903[] =
+static const unsigned char temp_87096e8[] =
 { 120,156,237,157,15,156,87,69,185,255,65,8,20,47,36,94,76,19,83,219,46,94,52,77,10,131,90,247,28,212,48,45,188,24,118,53,236,210,213,56,125,81,185,223,37,206,109,11,46,118,81,40,188,32,38,136,134,129,173,173,130,65,144,171,16,40,202,126,207,33,8,10,131,
 194,160,182,32,44,8,107,11,68,3,177,48,200,223,188,63,207,57,243,101,213,250,129,47,42,191,190,120,189,246,181,207,231,245,157,63,231,153,153,103,102,158,153,121,230,153,15,124,228,223,62,61,226,211,215,124,174,87,223,54,109,218,12,153,114,81,191,211,
 219,188,228,80,219,54,243,231,117,234,55,162,214,193,54,247,173,239,16,22,1,35,26,122,167,69,253,158,3,130,162,218,150,69,227,130,117,55,188,35,45,2,174,222,53,57,40,158,210,242,124,232,1,65,81,237,236,145,165,192,229,113,115,241,198,110,35,194,9,219,
@@ -466,10 +466,10 @@ static const unsigned char temp_62a06903[] =
 51,181,25,217,171,205,216,211,1,112,175,76,109,134,99,37,218,12,170,54,3,48,217,40,132,199,124,136,58,145,7,18,72,11,71,57,175,81,45,31,86,203,0,116,100,204,109,66,15,50,39,17,131,66,15,180,131,130,86,170,29,20,118,124,144,10,58,153,164,3,85,87,26,1,
 62,84,1,80,61,172,2,144,220,0,108,87,189,201,228,134,196,146,27,228,18,64,246,48,21,21,94,58,34,238,127,63,113,63,124,163,148,171,141,54,255,15,230,92,172,169,0,0 };
 
-const char* cpmonoboldserialized = (const char*) temp_62a06903;
+const char* cpmonoboldserialized = (const char*) temp_87096e8;
 
 //================== cpmono-extralight-serialized ==================
-static const unsigned char temp_b510c8a2[] =
+static const unsigned char temp_893e36c7[] =
 { 120,156,237,157,127,188,149,69,181,255,81,16,232,24,24,10,65,129,98,20,132,133,129,97,218,69,246,3,26,126,177,139,23,193,210,176,75,87,227,113,195,133,246,38,118,151,130,164,48,40,16,195,4,81,143,74,29,5,193,32,240,158,194,64,65,206,126,54,129,160,32,
 40,4,122,8,130,4,33,143,65,160,32,42,134,117,231,253,89,207,51,251,80,118,191,71,47,254,216,190,248,99,191,230,243,218,243,107,61,107,214,172,89,51,179,102,230,11,253,254,237,155,195,191,121,245,119,186,156,95,175,94,189,129,83,46,234,113,102,189,191,
 57,116,66,189,249,243,202,122,12,207,58,88,111,230,198,134,65,6,48,124,70,215,66,70,255,39,128,168,48,123,227,164,73,221,207,26,216,185,144,1,180,157,176,39,149,25,50,184,97,15,15,136,10,179,77,71,126,53,229,202,248,65,230,236,195,19,130,9,123,110,137,
@@ -713,10 +713,10 @@ static const unsigned char temp_b510c8a2[] =
 120,66,120,32,139,155,40,15,180,126,150,157,113,154,128,107,216,179,37,108,220,194,47,233,224,13,93,89,4,92,176,15,24,56,101,167,173,159,113,105,17,195,62,33,235,103,186,197,72,130,4,64,144,72,42,65,34,47,226,66,97,18,36,138,143,5,233,108,1,8,128,236,
 48,253,183,227,242,255,46,202,255,177,211,99,142,61,245,254,7,170,167,234,165,0,0 };
 
-const char* cpmonoextralightserialized = (const char*) temp_b510c8a2;
+const char* cpmonoextralightserialized = (const char*) temp_893e36c7;
 
 //================== cpmono-light-serialized ==================
-static const unsigned char temp_72729244[] =
+static const unsigned char temp_86a820ff[] =
 { 120,156,237,157,127,160,149,69,181,247,81,16,12,195,196,32,40,8,184,167,80,41,20,13,195,222,19,207,6,12,47,118,233,98,120,47,132,69,65,60,110,12,218,155,216,93,186,16,118,17,168,99,7,161,32,48,76,13,131,192,32,168,83,120,161,64,206,126,54,129,135,4,65,
 65,168,99,32,40,4,117,18,2,130,208,11,65,189,243,249,174,231,153,125,200,122,47,250,226,143,109,252,115,230,123,246,252,90,207,204,154,53,107,102,214,172,249,208,71,255,245,115,163,62,55,228,63,175,190,174,65,131,6,131,167,95,223,163,67,131,191,56,116,
 94,131,37,139,155,246,24,149,117,176,193,188,173,141,83,25,192,168,185,93,11,25,253,158,0,162,194,236,202,118,23,4,147,251,189,183,144,1,236,107,245,88,144,41,12,58,191,135,7,68,133,217,41,149,149,129,43,99,98,102,204,246,137,169,138,253,223,136,50,252,
@@ -973,10 +973,10 @@ static const unsigned char temp_72729244[] =
 195,60,113,76,68,82,189,98,69,94,234,75,40,9,179,212,163,142,0,200,180,129,55,79,61,208,165,32,162,60,208,222,215,218,99,87,216,222,23,55,12,225,138,77,27,99,207,194,67,59,175,52,141,128,61,47,211,39,127,99,123,95,139,154,253,81,123,95,132,58,191,0,136,
 145,0,48,18,73,197,72,228,133,93,40,76,140,68,241,98,164,228,70,35,4,64,118,152,254,203,57,254,127,13,249,255,236,201,49,215,60,13,254,47,224,111,82,132,0,0 };
 
-const char* cpmonolightserialized = (const char*) temp_72729244;
+const char* cpmonolightserialized = (const char*) temp_86a820ff;
 
 //================== cpmono-plain-serialized ==================
-static const unsigned char temp_7b72b510[] =
+static const unsigned char temp_8fa843cb[] =
 { 120,156,237,157,127,188,86,69,181,255,143,130,96,40,36,6,98,65,104,39,33,44,8,10,67,67,246,62,80,120,177,240,106,88,16,118,241,66,108,31,20,122,14,185,187,20,132,93,68,12,67,161,48,48,76,234,212,65,84,16,244,24,4,10,194,179,31,2,193,64,240,30,131,194,
 32,44,8,12,131,192,48,72,184,144,119,222,159,181,247,28,200,238,247,162,95,127,61,198,31,231,181,62,231,153,31,123,205,204,154,153,53,51,107,214,124,242,51,255,250,229,225,95,30,248,181,78,23,150,149,149,13,152,252,137,138,115,203,94,114,232,164,178,
 185,115,26,85,12,175,116,176,108,198,250,6,97,30,48,188,186,115,49,175,223,51,64,80,84,233,146,5,155,187,127,160,152,7,76,29,248,64,144,239,52,237,112,232,1,65,81,101,121,249,221,129,203,99,108,126,212,200,145,225,248,93,223,77,242,252,50,126,87,211,
@@ -1230,10 +1230,10 @@ static const unsigned char temp_7b72b510[] =
 0,27,91,68,213,198,22,105,225,40,227,53,170,180,27,162,231,22,196,138,108,12,220,164,29,120,160,235,41,4,121,160,125,43,154,68,251,86,204,159,72,5,47,118,73,58,120,227,78,42,194,244,187,14,10,64,101,123,97,160,204,66,144,14,162,74,110,72,156,118,156,
 171,5,200,30,166,162,220,75,39,196,253,141,19,247,215,110,148,114,252,151,253,15,5,44,29,103,0,0 };
 
-const char* cpmonoplainserialized = (const char*) temp_7b72b510;
+const char* cpmonoplainserialized = (const char*) temp_8fa843cb;
 
 //================== BebasNeue.otf ==================
-static const unsigned char temp_7b880677[] =
+static const unsigned char temp_fe42b2f2[] =
 { 79,84,84,79,0,11,0,128,0,3,0,48,67,70,70,32,57,136,64,140,0,0,39,76,0,0,70,154,71,80,79,83,223,12,110,56,0,0,116,248,0,0,73,16,71,83,85,66,114,203,114,178,0,0,116,0,0,0,0,246,79,83,47,50,102,169,27,20,0,0,1,32,0,0,0,96,99,109,97,112,211,17,247,228,0,
 0,35,232,0,0,3,68,104,101,97,100,243,84,238,113,0,0,0,188,0,0,0,54,104,104,101,97,6,215,3,186,0,0,0,244,0,0,0,36,104,109,116,120,67,128,39,22,0,0,109,232,0,0,6,24,109,97,120,112,1,134,80,0,0,0,1,24,0,0,0,6,110,97,109,101,230,56,31,140,0,0,1,128,0,0,34,
 101,112,111,115,116,255,184,0,50,0,0,39,44,0,0,0,32,0,1,0,0,0,1,0,131,131,184,68,27,95,15,60,245,0,3,3,232,0,0,0,0,200,111,85,40,0,0,0,0,200,111,85,40,255,119,255,60,3,232,3,130,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,2,188,254,212,0,185,3,232,255,119,255,119,
@@ -1843,10 +1843,10 @@ static const unsigned char temp_7b880677[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,10,0,3,0,10,0,3,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,24,0,22,0,24,0,22,0,24,0,22,0,24,0,4,0,11,0,4,0,11,0,4,0,11,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,5,0,12,0,6,0,13,0,6,0,19,
 0,21,0,19,0,21,0,19,0,21,0,15,0,17,0,3,0,10,0,22,0,24,0,4,0,11,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,24,0,4,0,11,0,5,0,12,0,5,0,12,0,5,0,12,0,6,0,13,0,0 };
 
-const char* BebasNeue_otf = (const char*) temp_7b880677;
+const char* BebasNeue_otf = (const char*) temp_fe42b2f2;
 
 //================== cpmono_bold.otf ==================
-static const unsigned char temp_8e883f13[] =
+static const unsigned char temp_4d49b8ce[] =
 { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,35,187,57,254,0,0,10,112,0,0,84,205,71,83,85,66,106,18,122,98,0,0,98,20,0,0,5,216,79,83,47,50,104,215,98,101,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,56,0,0,5,24,104,101,97,100,237,187,124,213,0,
 0,0,172,0,0,0,54,104,104,101,97,6,229,0,115,0,0,0,228,0,0,0,36,104,109,116,120,58,11,56,208,0,0,95,64,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,226,66,147,104,0,0,1,112,0,0,3,198,112,111,115,116,255,181,0,161,0,0,10,80,0,0,0,
 32,0,1,0,0,0,1,0,0,64,149,238,152,95,15,60,245,0,3,3,232,0,0,0,0,198,13,28,168,0,0,0,0,198,13,28,168,255,7,255,16,3,131,3,149,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,7,255,7,3,131,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105,
@@ -2190,10 +2190,10 @@ static const unsigned char temp_8e883f13[] =
 0,2,0,21,0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0,
 81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 };
 
-const char* cpmono_bold_otf = (const char*) temp_8e883f13;
+const char* cpmono_bold_otf = (const char*) temp_4d49b8ce;
 
 //================== cpmono_extra_light.otf ==================
-static const unsigned char temp_8172799f[] =
+static const unsigned char temp_2742a784[] =
 { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,248,217,201,134,0,0,10,164,0,0,78,103,71,83,85,66,106,18,122,98,0,0,91,224,0,0,5,216,79,83,47,50,104,210,98,59,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,108,0,0,5,24,104,101,97,100,237,187,115,86,
 0,0,0,172,0,0,0,54,104,104,101,97,6,229,0,179,0,0,0,228,0,0,0,36,104,109,116,120,81,57,79,54,0,0,89,12,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,101,109,217,12,0,0,1,112,0,0,3,252,112,111,115,116,255,181,0,161,0,0,10,132,0,0,
 0,32,0,1,0,0,0,1,0,0,97,176,60,66,95,15,60,245,0,3,3,232,0,0,0,0,198,13,23,248,0,0,0,0,198,13,23,248,255,71,255,16,3,67,3,118,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,71,255,71,3,67,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,
@@ -2518,10 +2518,10 @@ static const unsigned char temp_8172799f[] =
 0,55,0,61,0,62,0,70,0,2,0,21,0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168,
 0,77,0,179,0,184,0,81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 };
 
-const char* cpmono_extra_light_otf = (const char*) temp_8172799f;
+const char* cpmono_extra_light_otf = (const char*) temp_2742a784;
 
 //================== cpmono_light.otf ==================
-static const unsigned char temp_9ff5f6ce[] =
+static const unsigned char temp_b963b473[] =
 { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,64,226,171,159,0,0,10,124,0,0,81,133,71,83,85,66,106,18,122,98,0,0,94,216,0,0,5,216,79,83,47,50,104,211,98,73,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,68,0,0,5,24,104,101,97,100,237,187,127,116,0,
 0,0,172,0,0,0,54,104,104,101,97,6,229,0,158,0,0,0,228,0,0,0,36,104,109,116,120,73,105,71,167,0,0,92,4,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,106,76,91,179,0,0,1,112,0,0,3,209,112,111,115,116,255,181,0,161,0,0,10,92,0,0,0,32,
 0,1,0,0,0,1,0,0,215,127,97,71,95,15,60,245,0,3,3,232,0,0,0,0,198,13,30,2,0,0,0,0,198,13,30,2,255,50,255,16,3,88,3,128,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,50,255,50,3,88,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105,0,0,
@@ -2856,10 +2856,10 @@ static const unsigned char temp_9ff5f6ce[] =
 0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0,81,0,208,
 0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 };
 
-const char* cpmono_light_otf = (const char*) temp_9ff5f6ce;
+const char* cpmono_light_otf = (const char*) temp_b963b473;
 
 //================== cpmono_plain.otf ==================
-static const unsigned char temp_eca62182[] =
+static const unsigned char temp_613df27[] =
 { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,153,52,71,27,0,0,10,124,0,0,81,49,71,83,85,66,106,18,122,98,0,0,94,132,0,0,5,216,79,83,47,50,104,213,98,87,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,68,0,0,5,24,104,101,97,100,237,186,121,35,0,0,0,
 172,0,0,0,54,104,104,101,97,6,228,0,137,0,0,0,228,0,0,0,36,104,109,116,120,65,179,64,52,0,0,91,176,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,95,80,74,175,0,0,1,112,0,0,3,209,112,111,115,116,255,181,0,161,0,0,10,92,0,0,0,32,0,
 1,0,0,0,1,0,0,76,64,104,233,95,15,60,245,0,3,3,232,0,0,0,0,198,13,26,212,0,0,0,0,198,13,26,212,255,28,255,16,3,109,3,139,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,28,255,29,3,109,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105,
@@ -3193,10 +3193,10 @@ static const unsigned char temp_eca62182[] =
 0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0,81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,
 0,139,0,163,0,164,0,169,1,7,0,0 };
 
-const char* cpmono_plain_otf = (const char*) temp_eca62182;
+const char* cpmono_plain_otf = (const char*) temp_613df27;
 
 //================== miso-bold.ttf ==================
-static const unsigned char temp_7dfa977e[] =
+static const unsigned char temp_b543f9[] =
 { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,237,157,221,60,0,0,5,108,0,0,0,227,79,83,47,50,81,16,250,27,0,0,1,152,0,0,0,86,86,68,77,88,108,156,116,37,0,0,231,220,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224,
 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,122,237,74,59,0,0,34,228,0,0,184,220,104,100,109,120,139,147,218,195,0,0,6,80,0,0,20,132,104,101,97,100,230,15,38,231,0,0,1,28,0,0,0,54,104,104,101,97,6,202,7,163,0,0,1,84,0,0,
 0,36,104,109,116,120,82,131,27,122,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,221,128,0,0,4,68,108,111,99,97,100,35,145,228,0,0,219,192,0,0,1,192,109,97,120,112,2,241,2,157,0,0,1,120,0,0,0,32,110,97,109,101,215,203,101,65,0,0,225,196,0,0,3,225,
@@ -3880,10 +3880,10 @@ static const unsigned char temp_7dfa977e[] =
 255,203,0,239,0,212,255,203,0,240,0,213,255,203,0,241,0,214,255,202,0,242,0,215,255,202,0,243,0,216,255,202,0,244,0,217,255,202,0,245,0,218,255,202,0,246,0,218,255,201,0,247,0,219,255,201,0,248,0,220,255,201,0,249,0,221,255,201,0,250,0,222,255,201,0,
 251,0,223,255,200,0,252,0,224,255,200,0,253,0,225,255,200,0,254,0,226,255,200,0,255,0,226,255,199,0,0 };
 
-const char* misobold_ttf = (const char*) temp_7dfa977e;
+const char* misobold_ttf = (const char*) temp_b543f9;
 
 //================== miso-light.ttf ==================
-static const unsigned char temp_9ecc78ad[] =
+static const unsigned char temp_73675b92[] =
 { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,109,206,108,252,0,0,5,108,0,0,0,227,79,83,47,50,79,98,250,86,0,0,1,152,0,0,0,86,86,68,77,88,108,201,116,87,0,0,229,68,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224,
 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,9,54,37,173,0,0,34,228,0,0,182,56,104,100,109,120,120,118,213,147,0,0,6,80,0,0,20,132,104,101,97,100,230,13,38,194,0,0,1,28,0,0,0,54,104,104,101,97,6,201,7,195,0,0,1,84,0,0,0,36,
 104,109,116,120,82,124,51,141,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,218,220,0,0,4,68,108,111,99,97,249,219,39,62,0,0,217,28,0,0,1,192,109,97,120,112,2,241,2,188,0,0,1,120,0,0,0,32,110,97,109,101,174,204,29,32,0,0,223,32,0,0,3,240,112,111,
@@ -4549,10 +4549,10 @@ static const unsigned char temp_9ecc78ad[] =
 203,0,243,0,216,255,203,0,244,0,217,255,203,0,245,0,218,255,202,0,246,0,218,255,202,0,247,0,219,255,202,0,248,0,220,255,202,0,249,0,221,255,201,0,250,0,222,255,201,0,251,0,223,255,201,0,252,0,224,255,201,0,253,0,225,255,201,0,254,0,226,255,200,0,255,
 0,226,255,200,0,0 };
 
-const char* misolight_ttf = (const char*) temp_9ecc78ad;
+const char* misolight_ttf = (const char*) temp_73675b92;
 
 //================== miso-regular.ttf ==================
-static const unsigned char temp_bfd04473[] =
+static const unsigned char temp_d93e0218[] =
 { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,96,206,125,196,0,0,5,108,0,0,0,227,79,83,47,50,79,197,250,61,0,0,1,152,0,0,0,86,86,68,77,88,108,201,116,86,0,0,225,224,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224,
 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,144,118,127,194,0,0,34,228,0,0,179,20,104,100,109,120,123,104,215,146,0,0,6,80,0,0,20,132,104,101,97,100,230,14,38,213,0,0,1,28,0,0,0,54,104,104,101,97,6,189,7,195,0,0,1,84,0,0,
 0,36,104,109,116,120,82,124,40,229,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,215,184,0,0,4,68,108,111,99,97,156,38,200,236,0,0,213,248,0,0,1,192,109,97,120,112,2,241,2,186,0,0,1,120,0,0,0,32,110,97,109,101,65,189,188,90,0,0,219,252,0,0,3,174,
@@ -5216,10 +5216,10 @@ static const unsigned char temp_bfd04473[] =
 0,206,255,208,0,236,0,207,255,207,0,237,0,207,255,207,0,238,0,208,255,207,0,239,0,209,255,207,0,240,0,210,255,207,0,241,0,211,255,206,0,242,0,212,255,206,0,243,0,213,255,206,0,244,0,214,255,206,0,245,0,214,255,206,0,246,0,215,255,205,0,247,0,216,255,
 205,0,248,0,217,255,205,0,249,0,218,255,205,0,250,0,219,255,205,0,251,0,220,255,204,0,252,0,220,255,204,0,253,0,221,255,204,0,254,0,222,255,204,0,255,0,223,255,203,0,0 };
 
-const char* misoregular_ttf = (const char*) temp_bfd04473;
+const char* misoregular_ttf = (const char*) temp_d93e0218;
 
 //================== miso-serialized ==================
-static const unsigned char temp_263ed5c5[] =
+static const unsigned char temp_e5004f80[] =
 { 120,156,236,221,11,252,253,197,180,63,254,79,244,237,170,139,164,123,73,55,116,165,146,240,221,239,175,168,148,75,95,145,144,16,187,143,67,246,231,155,173,155,131,82,169,164,72,233,34,149,110,18,37,183,82,74,159,253,222,137,238,36,33,169,164,66,116,145,
 20,161,19,254,243,124,205,222,31,250,31,231,156,56,156,195,227,119,122,60,62,205,250,238,247,204,154,153,53,51,107,214,90,179,102,205,139,223,188,219,174,19,19,19,231,156,250,226,57,171,78,252,161,64,243,77,28,59,103,195,102,222,228,163,70,233,163,71,
 233,252,163,116,214,40,93,96,148,46,56,74,23,26,165,11,143,210,69,70,233,162,163,244,49,163,116,177,81,186,248,40,93,98,148,46,57,74,31,59,74,151,26,165,143,27,165,75,143,210,199,143,210,101,70,233,178,163,116,185,81,186,252,40,93,97,148,174,56,74,87,
@@ -6270,10 +6270,10 @@ static const unsigned char temp_263ed5c5[] =
 219,114,86,91,239,25,109,89,219,189,161,215,207,60,247,238,205,109,203,166,45,119,111,203,250,157,123,151,118,230,189,119,251,157,251,182,245,247,109,219,239,219,214,223,183,212,95,163,80,149,125,75,61,229,188,222,155,243,251,188,182,254,188,182,254,
 188,182,254,188,82,223,122,206,43,245,149,251,181,245,246,107,235,237,215,214,219,175,212,91,173,244,183,95,169,167,124,91,91,239,109,109,189,203,123,251,166,252,89,91,222,212,150,255,15,63,201,76,247,0,0 };
 
-const char* misoserialized = (const char*) temp_263ed5c5;
+const char* misoserialized = (const char*) temp_e5004f80;
 
 //================== nordic.ttf ==================
-static const unsigned char temp_bcaa94b9[] =
+static const unsigned char temp_740cb21e[] =
 { 0,1,0,0,0,14,0,128,0,3,0,96,79,83,47,50,123,137,164,77,0,0,1,136,0,0,0,86,99,109,97,112,54,197,178,209,0,0,31,240,0,0,1,202,99,118,116,32,15,192,16,0,0,0,26,184,0,0,2,0,102,112,103,109,1,82,156,24,0,0,28,184,0,0,0,179,103,97,115,112,0,23,0,6,0,0,26,168,
 0,0,0,16,103,108,121,102,108,103,13,174,0,0,40,168,0,0,51,44,104,101,97,100,98,133,67,155,0,0,0,236,0,0,0,54,104,104,101,97,6,68,3,192,0,0,1,36,0,0,0,36,104,109,116,120,180,81,19,127,0,0,37,52,0,0,3,116,108,111,99,97,0,33,207,92,0,0,33,188,0,0,3,120,
 109,97,120,112,24,248,0,170,0,0,1,72,0,0,0,32,110,97,109,101,185,229,179,231,0,0,1,224,0,0,24,198,112,111,115,116,255,163,0,48,0,0,1,104,0,0,0,32,112,114,101,112,15,37,62,165,0,0,29,108,0,0,2,130,0,1,0,0,0,5,0,0,166,84,57,97,95,15,60,245,0,1,4,0,0,0,
@@ -6514,10 +6514,10 @@ static const unsigned char temp_bcaa94b9[] =
 6,7,6,39,53,54,55,51,22,23,185,30,74,27,4,1,23,86,22,3,204,31,74,27,4,2,22,86,22,4,2,126,88,56,12,28,214,22,3,3,22,86,88,56,12,28,214,22,3,3,22,0,0,0,2,0,50,1,226,1,133,2,237,0,10,0,21,0,3,0,48,49,19,6,7,6,39,53,54,55,51,22,31,1,6,7,6,39,53,54,55,51,
 22,23,185,30,74,27,4,1,23,86,22,3,204,31,74,27,4,2,22,86,22,4,2,126,88,56,12,28,214,22,3,3,22,86,88,56,12,28,214,22,3,3,22,0,0,0,0 };
 
-const char* nordic_ttf = (const char*) temp_bcaa94b9;
+const char* nordic_ttf = (const char*) temp_740cb21e;
 
 //================== ostrich.ttf ==================
-static const unsigned char temp_189d4f30[] =
+static const unsigned char temp_4d7ede6b[] =
 { 0,1,0,0,0,16,1,0,0,4,0,0,70,70,84,77,91,245,3,49,0,0,1,12,0,0,0,28,71,68,69,70,0,172,0,3,0,0,1,40,0,0,0,32,79,83,47,50,147,188,109,12,0,0,1,72,0,0,0,96,99,109,97,112,43,226,86,187,0,0,1,168,0,0,1,162,99,118,116,32,13,119,11,140,0,0,3,76,0,0,0,34,102,
 112,103,109,15,180,47,167,0,0,3,112,0,0,2,101,103,97,115,112,0,0,0,16,0,0,5,216,0,0,0,8,103,108,121,102,143,7,37,77,0,0,5,224,0,0,69,164,104,101,97,100,248,105,156,174,0,0,75,132,0,0,0,54,104,104,101,97,11,58,5,41,0,0,75,188,0,0,0,36,104,109,116,120,
 102,145,6,220,0,0,75,224,0,0,1,252,108,111,99,97,36,35,54,72,0,0,77,220,0,0,1,0,109,97,120,112,1,156,1,252,0,0,78,220,0,0,0,32,110,97,109,101,44,100,71,147,0,0,78,252,0,0,2,6,112,111,115,116,68,107,181,125,0,0,81,4,0,0,1,187,112,114,101,112,2,242,181,
@@ -6769,10 +6769,10 @@ static const unsigned char temp_189d4f30[] =
 32,69,176,3,43,68,176,12,32,69,186,0,11,127,255,0,2,43,177,3,70,118,43,68,176,13,32,69,178,12,9,2,43,177,3,70,118,43,68,176,14,32,69,178,13,8,2,43,177,3,70,118,43,68,176,15,32,69,186,0,14,1,56,0,2,43,177,3,70,118,43,68,176,16,32,69,178,15,7,2,43,177,
 3,70,118,43,68,89,176,20,43,0,0,0,0 };
 
-const char* ostrich_ttf = (const char*) temp_189d4f30;
+const char* ostrich_ttf = (const char*) temp_4d7ede6b;
 
 //================== silkscreen-serialized ==================
-static const unsigned char temp_4c9cd71c[] =
+static const unsigned char temp_acccd897[] =
 { 120,156,237,155,7,148,20,69,16,134,215,156,48,39,80,84,204,57,160,120,162,48,123,42,98,206,120,230,132,99,171,200,238,170,140,162,24,49,97,206,57,231,128,57,158,1,238,206,132,1,195,153,21,207,128,17,179,232,138,138,9,39,117,119,245,116,207,78,47,252,
 199,221,170,188,199,123,205,78,239,215,213,85,213,85,93,53,203,128,65,133,193,158,59,132,177,82,46,151,235,217,165,95,125,143,220,20,127,52,131,255,55,87,95,42,246,26,57,185,175,63,26,94,8,6,254,227,150,66,145,77,204,139,65,240,200,45,142,27,59,62,239,
 63,31,93,8,6,19,242,125,90,252,217,195,28,49,8,30,185,108,70,56,113,38,56,113,102,56,113,22,56,113,86,56,113,54,56,113,118,56,113,14,56,113,78,56,113,46,56,177,11,156,56,55,156,56,15,156,56,47,156,56,31,156,56,63,156,184,0,156,184,32,156,184,16,156,184,
@@ -6807,10 +6807,10 @@ static const unsigned char temp_4c9cd71c[] =
 2,78,156,0,39,126,9,39,126,5,39,126,13,39,126,3,39,126,11,39,126,7,39,126,15,39,254,0,39,78,132,19,127,132,19,127,130,19,203,112,226,207,112,226,36,56,241,23,56,241,87,56,241,55,56,113,50,156,248,59,156,248,7,156,248,39,156,248,23,156,248,55,156,56,5,
 78,12,128,255,0,255,66,227,172,0,0 };
 
-const char* silkscreenserialized = (const char*) temp_4c9cd71c;
+const char* silkscreenserialized = (const char*) temp_acccd897;
 
 //================== silkscreen.ttf ==================
-static const unsigned char temp_2de8efad[] =
+static const unsigned char temp_283d292[] =
 { 0,1,0,0,0,15,0,48,0,3,0,192,79,83,47,50,121,166,129,146,0,0,64,208,0,0,0,78,80,67,76,84,173,52,110,22,0,0,65,32,0,0,0,54,99,109,97,112,198,58,142,190,0,0,61,32,0,0,2,4,99,118,116,32,7,83,8,77,0,0,64,172,0,0,0,36,102,112,103,109,152,92,220,162,0,0,3,224,
 0,0,0,100,103,108,121,102,48,157,174,66,0,0,4,152,0,0,54,18,104,100,109,120,137,166,202,30,0,0,65,88,0,0,6,72,104,101,97,100,213,88,95,61,0,0,0,252,0,0,0,54,104,104,101,97,2,213,6,14,0,0,1,52,0,0,0,36,104,109,116,120,44,25,4,90,0,0,63,36,0,0,1,136,108,
 111,99,97,0,10,37,204,0,0,58,172,0,0,1,140,109,97,120,112,1,9,0,219,0,0,1,88,0,0,0,32,110,97,109,101,63,98,60,192,0,0,1,120,0,0,2,103,112,111,115,116,9,71,9,62,0,0,60,56,0,0,0,230,112,114,101,112,5,176,112,7,0,0,4,68,0,0,0,83,0,1,0,0,0,1,0,0,124,56,31,
@@ -7017,10 +7017,10 @@ static const unsigned char temp_2de8efad[] =
 14,16,19,16,16,16,16,14,14,16,16,8,16,16,14,19,19,16,16,16,16,16,14,16,19,19,19,19,14,11,14,11,14,16,11,16,16,16,16,14,14,16,16,8,16,16,14,19,19,16,16,16,16,16,14,16,19,19,19,19,14,14,8,14,16,24,20,12,0,11,11,9,14,20,17,20,17,9,11,11,20,20,9,14,6,14,
 17,14,17,17,17,17,17,17,17,17,6,9,14,14,14,17,20,17,17,17,17,14,14,17,17,9,17,17,14,20,20,17,17,17,17,17,14,17,20,20,20,20,14,11,14,11,14,17,11,17,17,17,17,14,14,17,17,9,17,17,14,20,20,17,17,17,17,17,14,17,20,20,20,20,14,14,9,14,17,0,0 };
 
-const char* silkscreen_ttf = (const char*) temp_2de8efad;
+const char* silkscreen_ttf = (const char*) temp_283d292;
 
 //================== ArduinoIcon.png ==================
-static const unsigned char temp_dd579bb9[] =
+static const unsigned char temp_8327c99e[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,6,47,0,0,4,111,8,6,0,0,0,96,133,119,144,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,
 0,0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,
 202,251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,
@@ -7809,10 +7809,10 @@ static const unsigned char temp_dd579bb9[] =
 223,255,212,213,121,32,27,7,166,188,232,223,182,138,0,0,0,0,0,32,99,109,205,214,129,253,183,63,255,249,207,94,222,126,236,75,57,185,187,67,8,23,75,2,0,0,0,0,32,163,252,123,8,225,191,255,169,171,243,68,54,14,206,157,23,76,13,33,108,19,3,0,0,0,0,64,198,
 248,117,8,97,92,182,22,23,33,184,243,130,147,190,148,147,59,46,132,48,51,132,240,223,165,1,0,0,0,0,16,73,39,66,8,91,255,212,213,249,84,182,15,244,255,63,0,215,70,173,194,31,62,235,52,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* ArduinoIcon_png = (const char*) temp_dd579bb9;
+const char* ArduinoIcon_png = (const char*) temp_8327c99e;
 
 //================== OpenEphysBoardLogoBlack.png ==================
-static const unsigned char temp_ef366d73[] =
+static const unsigned char temp_c05febd8[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,7,115,0,0,5,27,8,6,0,0,0,52,231,138,245,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,140,165,73,68,65,84,120,218,236,221,209,149,19,71,162,199,225,54,231,30,29,233,9,54,2,228,8,152,141,96,180,17,120,110,4,200,17,236,108,4,30,71,176,16,129,69,4,59,68,176,34,2,102,34,176,136,224,194,147,116,244,194,173,178,
 122,188,44,6,3,51,211,221,127,73,223,119,78,185,13,6,117,119,169,103,95,126,91,213,223,189,127,255,190,33,195,104,60,121,84,14,39,237,47,103,31,252,167,217,71,127,116,90,198,99,51,6,0,0,0,0,0,192,87,122,83,198,234,163,223,91,126,226,223,175,182,155,245,
@@ -8286,10 +8286,10 @@ static const unsigned char temp_ef366d73[] =
 38,188,253,43,192,21,222,214,75,152,155,65,10,120,183,225,238,40,149,248,181,93,188,0,0,0,0,0,0,228,118,87,109,194,218,69,42,243,248,20,220,54,79,152,91,152,116,76,115,188,135,119,148,74,245,197,215,187,226,247,220,209,11,0,0,0,0,0,192,215,196,99,144,
 23,247,124,127,177,243,253,237,215,183,235,213,242,218,144,149,227,255,1,23,88,237,144,160,48,169,201,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* OpenEphysBoardLogoBlack_png = (const char*) temp_ef366d73;
+const char* OpenEphysBoardLogoBlack_png = (const char*) temp_c05febd8;
 
 //================== OpenEphysBoardLogoGray.png ==================
-static const unsigned char temp_76e84745[] =
+static const unsigned char temp_2b12e840[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,7,115,0,0,5,27,8,6,0,0,0,52,231,138,245,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,139,144,73,68,65,84,120,218,236,221,223,117,220,198,193,198,97,68,39,247,100,7,98,42,16,115,133,75,174,43,16,191,10,180,174,192,76,5,166,43,8,85,129,86,21,132,170,32,171,203,185,50,89,65,168,14,168,10,242,13,188,160,163,
 40,148,197,63,11,224,197,238,243,156,51,134,100,75,11,96,22,204,205,47,51,248,211,191,255,253,239,134,12,165,148,195,122,56,238,127,187,248,226,63,45,190,250,163,71,117,188,52,99,0,0,0,0,0,0,60,208,167,58,110,190,250,119,235,123,126,125,213,182,237,173,
@@ -8760,10 +8760,10 @@ static const unsigned char temp_76e84745[] =
 194,221,105,190,210,239,85,241,2,0,0,0,0,0,80,218,125,179,13,107,55,249,90,167,187,224,182,127,194,220,202,228,109,154,211,57,188,211,124,53,127,249,253,190,244,103,206,232,5,0,0,0,0,0,224,107,210,54,200,155,7,254,124,179,247,231,187,223,223,133,16,110,
 12,89,61,254,7,181,146,230,16,82,63,166,171,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* OpenEphysBoardLogoGray_png = (const char*) temp_76e84745;
+const char* OpenEphysBoardLogoGray_png = (const char*) temp_2b12e840;
 
 //================== RadioButtons-01.png ==================
-static const unsigned char temp_bcea9320[] =
+static const unsigned char temp_81774685[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,191,73,68,65,84,120,218,196,150,219,78,19,81,20,134,255,61,199,118,128,136,209,132,150,27,98,226,133,70,99,104,69,206,82,18,9,166,49,122,161,9,23,92,250,4,190,129,190,130,207,161,55,106,76,19,37,86,40,162,40,109,154,84,4,
 34,98,5,76,228,2,16,122,156,233,28,92,211,169,74,109,109,13,69,88,201,206,236,116,239,174,245,173,127,173,189,103,24,200,60,30,207,29,122,4,104,180,226,144,141,81,240,123,62,255,197,187,221,221,189,80,20,229,80,131,71,34,83,16,36,73,12,140,94,13,226,
@@ -8777,10 +8777,10 @@ static const unsigned char temp_bcea9320[] =
 139,193,13,163,246,157,221,112,9,202,148,32,17,195,47,19,116,2,18,208,41,176,105,214,127,97,252,42,65,58,157,174,251,62,248,31,166,235,142,2,247,227,241,216,176,215,219,78,23,198,225,66,100,179,25,231,142,164,143,146,97,122,12,31,197,55,193,15,1,6,0,
 156,20,41,102,255,70,71,224,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons01_png = (const char*) temp_bcea9320;
+const char* RadioButtons01_png = (const char*) temp_81774685;
 
 //================== RadioButtons-02.png ==================
-static const unsigned char temp_bcf8aaa1[] =
+static const unsigned char temp_81855e06[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,197,73,68,65,84,120,218,196,150,107,79,19,65,20,134,223,153,157,221,110,11,36,152,20,104,52,154,144,160,40,69,32,164,40,136,52,38,24,141,31,252,79,254,31,191,154,104,248,224,133,86,80,145,134,91,32,70,32,202,69,46,134,91,
 111,123,233,94,60,179,106,44,180,24,109,19,152,228,100,119,178,115,206,115,230,61,115,38,203,98,177,216,43,156,211,16,137,129,219,247,70,70,146,103,14,78,165,198,33,20,69,129,22,10,157,57,92,114,133,34,8,174,105,167,46,98,140,228,81,200,132,15,159,230,
@@ -8794,10 +8794,10 @@ static const unsigned char temp_bcf8aaa1[] =
 11,27,40,149,78,239,65,201,21,129,236,150,85,243,77,37,93,83,233,37,76,125,252,132,11,205,13,216,219,207,83,89,124,42,135,255,215,254,175,75,246,147,9,20,10,192,254,126,241,159,47,156,95,178,215,183,243,90,135,228,138,98,177,128,157,237,237,51,135,75,
 46,163,63,153,39,231,245,39,243,67,128,1,0,60,21,103,165,70,150,193,96,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons02_png = (const char*) temp_bcf8aaa1;
+const char* RadioButtons02_png = (const char*) temp_81855e06;
 
 //================== RadioButtons-03.png ==================
-static const unsigned char temp_bd06c222[] =
+static const unsigned char temp_81937587[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,77,73,68,65,84,120,218,196,150,219,110,211,64,16,134,255,61,196,109,66,165,86,106,47,242,32,173,8,23,69,240,16,136,103,225,142,151,42,92,34,40,32,113,1,151,160,34,78,82,213,67,148,66,147,56,118,236,181,119,205,76,156,162,
 172,157,22,25,161,116,164,141,226,221,153,249,230,228,149,69,183,219,125,129,91,18,189,187,119,247,193,254,254,253,149,131,15,15,95,65,43,165,16,172,173,173,28,206,92,173,52,193,131,160,118,40,37,32,4,45,126,16,75,172,11,192,209,42,230,171,49,92,51,92,
@@ -8809,10 +8809,10 @@ static const unsigned char temp_bd06c222[] =
 253,155,136,179,130,202,88,194,31,61,126,114,163,110,191,63,32,93,202,60,245,225,204,45,203,158,54,203,60,163,88,191,255,56,193,206,246,75,186,44,236,245,21,162,183,228,232,243,49,205,71,74,109,170,102,254,143,101,103,57,59,51,56,120,254,14,66,220,208,
 30,190,255,169,31,214,214,111,160,121,217,155,103,254,63,132,185,58,142,35,244,207,207,87,14,103,174,160,47,153,167,183,245,37,243,91,128,1,0,11,149,65,182,96,70,58,8,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons03_png = (const char*) temp_bd06c222;
+const char* RadioButtons03_png = (const char*) temp_81937587;
 
 //================== RadioButtons-04.png ==================
-static const unsigned char temp_bd14d9a3[] =
+static const unsigned char temp_81a18d08[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,165,73,68,65,84,120,218,196,150,237,79,211,80,24,197,207,109,111,1,157,74,50,144,76,226,198,139,128,2,66,162,66,136,31,48,42,248,217,232,95,228,127,102,2,74,130,38,203,192,12,84,134,1,231,88,145,142,194,218,117,107,215,23,
 159,219,161,216,161,198,200,132,155,52,109,239,189,233,239,60,231,60,109,202,18,137,196,75,156,211,224,83,211,51,15,103,103,31,156,57,120,113,113,1,92,150,101,180,181,183,159,57,92,112,185,204,9,222,214,118,98,145,177,227,235,32,248,15,112,46,224,146,
@@ -8825,10 +8825,10 @@ static const unsigned char temp_bd14d9a3[] =
 83,92,187,240,93,35,132,215,5,220,9,154,224,30,184,235,122,161,255,167,29,66,196,171,165,45,164,51,219,152,156,184,142,241,241,41,112,101,8,165,210,14,89,236,208,155,19,245,79,112,27,182,219,118,203,190,92,66,196,194,98,14,233,244,39,18,208,143,106,213,
 167,134,182,195,202,209,74,219,255,52,42,21,134,61,109,61,188,246,253,224,196,7,233,200,246,214,86,254,183,67,112,185,101,85,176,171,170,103,14,23,92,70,127,50,47,206,235,79,230,155,0,3,0,91,7,91,249,23,102,61,167,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons04_png = (const char*) temp_bd14d9a3;
+const char* RadioButtons04_png = (const char*) temp_81a18d08;
 
 //================== RadioButtons-05.png ==================
-static const unsigned char temp_bd22f124[] =
+static const unsigned char temp_81afa489[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0,
 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202,
 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11,
@@ -8880,10 +8880,10 @@ static const unsigned char temp_bd22f124[] =
 162,63,207,207,191,252,78,47,76,49,6,14,15,19,62,191,243,5,198,88,140,57,95,51,207,205,73,170,147,228,66,176,16,240,240,225,99,176,159,49,24,68,52,91,17,113,60,230,203,175,118,209,74,32,4,164,153,37,207,237,84,135,186,200,254,53,213,207,44,73,224,94,
 237,224,164,117,254,119,192,197,96,131,206,243,127,62,241,255,97,121,158,163,163,104,72,171,217,188,84,112,20,13,17,213,106,245,211,23,241,3,249,115,0,245,214,95,36,216,96,243,208,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons05_png = (const char*) temp_bd22f124;
+const char* RadioButtons05_png = (const char*) temp_81afa489;
 
 //================== RadioButtons_neutral-01.png ==================
-static const unsigned char temp_fbf03e98[] =
+static const unsigned char temp_cd19bcfd[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,103,73,68,65,84,120,218,196,86,221,75,83,97,28,126,206,217,217,161,177,205,64,177,121,154,125,96,132,23,125,144,36,117,219,77,222,108,115,36,74,11,22,140,210,182,187,162,174,130,46,250,83,6,121,83,162,99,69,69,17,164,77,152,
 168,67,48,203,106,141,105,160,172,109,110,147,181,185,243,181,211,123,142,37,68,251,10,199,250,193,15,94,206,251,62,239,243,252,62,248,157,151,82,20,5,28,199,221,49,27,141,55,201,218,140,22,27,67,200,31,234,245,250,251,54,199,32,123,200,194,181,148,252,
@@ -8896,10 +8896,10 @@ static const unsigned char temp_fbf03e98[] =
 209,58,51,61,253,79,231,101,53,3,162,36,255,136,126,90,197,177,158,19,45,255,25,169,101,99,120,129,127,176,188,242,62,176,83,42,193,108,110,237,123,68,18,69,80,191,94,68,151,140,6,131,75,71,211,7,90,157,133,159,2,12,0,238,13,9,71,19,58,158,165,0,0,0,
 0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_neutral01_png = (const char*) temp_fbf03e98;
+const char* RadioButtons_neutral01_png = (const char*) temp_cd19bcfd;
 
 //================== RadioButtons_neutral-02.png ==================
-static const unsigned char temp_fbfe5619[] =
+static const unsigned char temp_cd27d47e[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,54,73,68,65,84,120,218,196,150,207,79,19,65,20,199,191,187,157,182,86,131,166,254,72,69,19,13,141,137,49,30,12,218,131,225,102,106,140,129,112,52,210,150,67,19,53,130,240,223,104,188,123,210,196,171,98,148,6,127,20,104,145,
 32,28,48,129,130,201,66,65,91,160,148,110,161,178,219,157,226,204,28,56,176,187,13,182,164,125,201,203,190,153,247,94,62,243,230,205,76,86,186,226,247,43,104,146,144,182,54,255,229,59,119,239,53,28,252,57,246,9,196,225,112,192,229,118,55,28,206,185,68,
@@ -8911,10 +8911,10 @@ static const unsigned char temp_fbfe5619[] =
 158,112,24,14,246,30,124,249,26,199,204,244,76,213,60,81,121,133,87,94,7,156,75,60,62,42,212,235,245,34,111,113,126,44,225,188,114,42,122,174,29,201,123,157,205,102,14,29,75,69,207,217,150,233,53,246,188,30,225,92,98,148,203,88,77,47,55,28,206,185,68,
 85,11,175,152,54,229,79,230,159,0,3,0,178,38,58,166,235,164,14,20,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_neutral02_png = (const char*) temp_fbfe5619;
+const char* RadioButtons_neutral02_png = (const char*) temp_cd27d47e;
 
 //================== RadioButtons_neutral-03.png ==================
-static const unsigned char temp_fc0c6d9a[] =
+static const unsigned char temp_cd35ebff[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,1,165,73,68,65,84,120,218,196,150,109,75,194,80,20,199,207,220,221,172,12,21,122,130,40,76,139,94,7,245,162,122,19,73,244,213,194,143,209,75,251,0,69,169,212,103,136,232,77,132,154,104,69,234,210,72,216,195,189,235,222,13,133,
 218,217,70,19,244,63,198,6,255,115,206,111,231,222,187,187,73,91,185,92,13,166,36,146,205,230,50,199,39,167,19,7,223,150,111,128,200,178,12,106,60,62,113,184,224,146,88,44,6,241,41,192,5,215,129,43,138,226,49,91,141,58,88,166,25,88,192,182,25,100,54,
@@ -8924,10 +8924,10 @@ static const unsigned char temp_fc0c6d9a[] =
 66,33,48,174,82,42,65,235,237,3,239,156,137,206,35,192,219,29,13,170,181,122,104,220,211,115,21,173,47,184,132,58,115,254,127,184,200,185,40,22,35,239,237,212,153,115,190,98,141,8,115,62,174,4,151,136,143,71,179,241,50,113,184,224,146,126,191,119,206,
 207,169,252,201,252,8,48,0,227,76,197,247,89,122,10,69,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_neutral03_png = (const char*) temp_fc0c6d9a;
+const char* RadioButtons_neutral03_png = (const char*) temp_cd35ebff;
 
 //================== RadioButtons_neutral-04.png ==================
-static const unsigned char temp_fc1a851b[] =
+static const unsigned char temp_cd440380[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,27,73,68,65,84,120,218,196,150,109,79,211,80,24,134,239,182,167,29,219,50,100,176,110,200,48,203,22,127,5,209,15,4,162,63,68,72,36,209,175,26,241,215,248,7,28,159,36,129,69,92,228,69,167,113,250,9,156,16,141,14,98,125,9,91,
 11,117,93,123,138,61,167,209,4,219,17,18,203,246,36,39,79,211,59,231,190,158,231,188,52,21,174,150,74,159,48,160,32,197,98,169,48,61,123,163,239,224,181,202,10,136,36,73,80,98,177,190,195,25,151,136,162,136,216,0,224,140,203,225,178,44,7,196,159,223,
@@ -8939,10 +8939,10 @@ static const unsigned char temp_fc1a851b[] =
 106,149,103,195,180,60,111,59,212,159,113,9,229,123,110,93,200,247,251,217,218,211,158,26,229,123,78,233,185,14,87,212,193,184,132,221,229,253,47,159,251,14,103,92,162,235,237,71,222,24,200,159,204,111,1,6,0,203,214,249,255,62,204,159,178,0,0,0,0,73,
 69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_neutral04_png = (const char*) temp_fc1a851b;
+const char* RadioButtons_neutral04_png = (const char*) temp_cd440380;
 
 //================== RadioButtons_neutral-05.png ==================
-static const unsigned char temp_fc289c9c[] =
+static const unsigned char temp_cd521b01[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0,
 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202,
 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11,
@@ -8993,10 +8993,10 @@ static const unsigned char temp_fc289c9c[] =
 229,42,213,143,142,62,250,227,151,203,24,65,139,24,130,192,255,173,248,237,236,204,95,123,50,69,12,90,68,234,14,193,191,10,17,65,135,229,50,139,153,249,134,130,195,114,25,157,207,187,183,242,121,183,225,63,144,239,3,0,218,200,55,245,184,64,106,163,0,
 0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_neutral05_png = (const char*) temp_fc289c9c;
+const char* RadioButtons_neutral05_png = (const char*) temp_cd521b01;
 
 //================== RadioButtons_selected-01.png ==================
-static const unsigned char temp_789007d8[] =
+static const unsigned char temp_cc965613[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,134,73,68,65,84,120,218,196,86,75,104,19,81,20,61,47,153,76,147,104,90,146,214,106,68,65,116,81,116,99,43,72,109,87,21,139,65,171,82,161,152,44,20,233,39,70,10,69,219,69,161,16,138,96,65,186,112,227,82,139,248,87,106,53,169,
 46,20,252,130,138,40,45,88,41,46,130,198,66,193,79,98,205,111,38,49,153,207,115,146,148,34,152,31,166,140,15,238,48,188,251,206,187,231,157,185,239,222,33,148,82,88,173,214,147,235,170,140,221,162,76,77,80,121,48,74,240,83,134,10,118,104,120,231,6,118,
@@ -9009,10 +9009,10 @@ static const unsigned char temp_789007d8[] =
 201,56,82,41,9,166,77,13,152,187,228,46,9,35,137,52,171,0,207,211,101,41,173,252,195,9,229,57,81,242,122,81,82,20,72,73,50,247,52,160,67,163,73,84,189,25,101,114,32,250,75,112,79,250,5,79,108,173,1,171,85,110,138,73,65,6,89,252,35,106,169,54,232,28,74,
 103,210,171,173,194,111,1,6,0,169,191,241,34,56,210,107,35,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected01_png = (const char*) temp_789007d8;
+const char* RadioButtons_selected01_png = (const char*) temp_cc965613;
 
 //================== RadioButtons_selected-02.png ==================
-static const unsigned char temp_789e1f59[] =
+static const unsigned char temp_cca46d94[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,102,73,68,65,84,120,218,196,150,77,104,19,65,20,199,255,187,153,181,201,134,212,24,42,126,32,86,15,133,10,69,26,40,162,17,84,68,41,10,18,84,90,171,205,69,37,135,74,241,82,240,3,188,120,241,100,241,224,199,69,17,60,104,75,
 43,22,105,197,70,35,226,71,139,7,17,63,138,20,139,208,18,164,24,107,178,105,178,155,110,146,221,117,102,11,10,238,166,132,180,164,11,111,118,118,222,188,249,241,248,207,155,89,210,88,183,121,18,203,244,144,237,155,106,106,187,154,86,85,28,220,253,62,
@@ -9025,10 +9025,10 @@ static const unsigned char temp_789e1f59[] =
 177,168,3,67,121,209,135,31,212,156,94,31,213,57,81,82,12,227,146,130,166,67,150,141,37,57,175,101,249,119,201,115,25,215,212,92,206,26,21,191,88,76,205,213,188,142,47,169,202,223,106,140,75,98,178,113,47,38,107,203,242,39,243,71,128,1,0,163,90,231,150,
 52,232,169,252,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected02_png = (const char*) temp_789e1f59;
+const char* RadioButtons_selected02_png = (const char*) temp_cca46d94;
 
 //================== RadioButtons_selected-03.png ==================
-static const unsigned char temp_78ac36da[] =
+static const unsigned char temp_ccb28515[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,1,190,73,68,65,84,120,218,196,150,189,79,194,80,20,197,207,43,79,144,26,163,68,6,29,140,50,24,29,77,208,196,56,56,184,57,27,157,116,112,116,246,223,80,255,5,227,226,234,224,199,164,51,241,35,58,56,104,116,129,176,16,48,10,161,
 69,90,222,135,125,69,166,190,130,96,130,55,13,29,238,61,231,215,155,243,82,74,230,103,82,89,252,83,209,165,233,228,212,222,66,162,239,224,131,251,79,80,18,33,136,154,70,223,225,138,75,13,239,39,22,239,63,92,113,155,155,15,146,64,243,170,48,140,34,27,
@@ -9038,10 +9038,10 @@ static const unsigned char temp_78ac36da[] =
 133,212,250,251,240,134,191,185,236,26,30,27,107,26,174,31,92,181,157,187,187,60,209,250,43,46,229,76,162,246,213,61,220,204,102,80,127,56,237,56,55,116,123,140,90,61,232,175,184,148,113,1,219,238,30,14,187,134,199,163,195,158,223,237,138,235,103,110,
 247,176,249,95,203,207,220,105,8,60,85,250,255,175,166,184,52,111,203,227,188,205,255,229,75,230,91,128,1,0,165,175,191,223,100,163,205,167,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected03_png = (const char*) temp_78ac36da;
+const char* RadioButtons_selected03_png = (const char*) temp_ccb28515;
 
 //================== RadioButtons_selected-04.png ==================
-static const unsigned char temp_78ba4e5b[] =
+static const unsigned char temp_ccc09c96[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,100,73,68,65,84,120,218,196,150,77,104,211,96,24,199,255,111,154,102,205,92,221,186,85,17,71,173,58,198,188,232,6,14,84,148,162,172,226,7,76,70,65,119,216,209,195,64,60,41,130,99,87,15,122,24,168,7,5,79,83,97,8,165,155,122,
 17,199,16,25,58,61,104,81,118,152,173,171,19,183,22,109,221,154,146,164,31,107,154,248,38,21,81,147,94,180,235,2,239,75,194,147,252,127,255,231,125,222,143,144,174,246,29,159,177,78,23,187,127,187,219,123,177,219,85,115,240,200,155,52,88,98,35,224,234,
@@ -9054,10 +9054,10 @@ static const unsigned char temp_78ba4e5b[] =
 225,201,103,241,213,66,95,231,178,74,73,133,44,107,107,178,127,71,158,62,174,24,211,185,70,205,229,156,86,243,131,197,168,121,161,168,98,54,83,251,83,77,231,146,206,157,219,70,215,235,79,230,135,0,3,0,71,200,242,251,63,187,157,122,0,0,0,0,73,69,78,68,
 174,66,96,130,0,0 };
 
-const char* RadioButtons_selected04_png = (const char*) temp_78ba4e5b;
+const char* RadioButtons_selected04_png = (const char*) temp_ccc09c96;
 
 //================== RadioButtons_selected-05.png ==================
-static const unsigned char temp_78c865dc[] =
+static const unsigned char temp_ccceb417[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0,
 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202,
 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11,
@@ -9108,10 +9108,10 @@ static const unsigned char temp_78c865dc[] =
 67,47,42,109,196,133,131,158,216,185,173,106,221,105,147,89,82,137,21,26,39,18,154,254,235,201,213,60,226,64,151,202,198,52,99,235,6,155,222,129,127,54,50,165,90,172,177,249,59,150,208,89,45,165,141,110,69,109,250,195,137,253,157,172,168,141,30,48,99,
 15,3,166,34,209,235,207,0,161,143,20,90,35,156,236,45,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected05_png = (const char*) temp_78c865dc;
+const char* RadioButtons_selected05_png = (const char*) temp_ccceb417;
 
 //================== RadioButtons_selected_over-01.png ==================
-static const unsigned char temp_a1a89ec7[] =
+static const unsigned char temp_6010fd6c[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,239,73,68,65,84,120,218,196,86,93,72,20,81,20,254,238,236,236,56,179,174,43,91,130,187,130,136,97,81,22,244,3,105,8,134,105,168,245,32,229,147,15,10,25,37,173,81,212,67,15,86,15,65,68,244,212,83,62,244,24,65,68,166,32,18,
 132,63,69,17,82,61,20,171,65,81,216,139,144,238,34,106,59,59,251,51,51,247,118,103,86,130,220,137,149,86,182,129,195,12,115,206,61,223,119,190,57,247,204,37,140,49,4,131,193,75,213,91,188,251,240,31,46,145,131,223,80,138,164,129,211,117,85,82,169,34,
@@ -9125,10 +9125,10 @@ static const unsigned char temp_a1a89ec7[] =
 210,200,69,104,11,12,70,130,75,111,58,47,213,51,4,0,45,145,231,72,227,242,106,99,67,8,38,77,148,214,236,194,252,232,29,104,81,10,211,2,167,127,95,102,242,166,180,21,136,199,55,103,184,171,35,195,246,76,128,201,96,234,185,135,164,97,114,5,210,38,85,167,
 34,110,212,151,24,155,244,143,219,120,49,86,15,144,64,32,112,130,63,143,52,87,40,40,47,236,113,0,95,227,156,192,218,137,168,105,171,226,238,226,127,38,185,208,39,162,95,2,12,0,137,200,31,90,212,72,119,82,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected_over01_png = (const char*) temp_a1a89ec7;
+const char* RadioButtons_selected_over01_png = (const char*) temp_6010fd6c;
 
 //================== RadioButtons_selected_over-02.png ==================
-static const unsigned char temp_a1b6b648[] =
+static const unsigned char temp_601f14ed[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,216,73,68,65,84,120,218,196,149,79,72,84,65,28,199,191,51,239,237,190,221,183,184,166,22,145,84,70,137,97,90,33,107,218,22,129,18,17,29,162,67,66,209,255,78,117,137,14,29,11,138,200,110,17,116,232,84,80,116,8,73,41,188,164,
 93,182,63,104,148,34,149,186,176,22,37,122,200,63,152,171,187,179,239,173,251,254,52,111,246,80,235,110,82,107,232,240,230,49,204,252,230,247,249,205,124,103,126,67,130,91,202,31,96,153,138,188,110,165,255,116,83,213,234,37,7,183,14,142,67,46,81,101,
@@ -9142,10 +9142,10 @@ static const unsigned char temp_a1b6b648[] =
 152,175,120,22,147,161,155,152,126,23,130,33,206,65,238,121,14,87,54,121,150,74,104,139,72,214,60,247,176,246,86,140,116,182,65,45,41,130,30,157,134,153,180,97,25,88,240,254,59,92,217,48,45,48,246,31,94,138,152,141,217,169,169,116,251,47,220,57,92,161,
 57,211,236,37,127,82,133,230,201,148,133,254,25,186,228,112,135,43,143,50,251,225,40,51,177,28,229,167,0,3,0,110,188,26,228,110,165,221,163,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected_over02_png = (const char*) temp_a1b6b648;
+const char* RadioButtons_selected_over02_png = (const char*) temp_601f14ed;
 
 //================== RadioButtons_selected_over-03.png ==================
-static const unsigned char temp_a1c4cdc9[] =
+static const unsigned char temp_602d2c6e[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,101,73,68,65,84,120,218,196,150,61,143,211,64,16,134,223,89,111,226,195,7,220,33,78,66,128,34,16,80,5,209,32,1,66,162,165,161,166,160,65,80,208,242,51,248,13,84,72,92,139,104,168,40,40,174,58,10,26,78,66,87,33,133,143,0,34,
 137,20,146,216,107,39,142,215,203,172,147,226,108,135,128,41,114,43,37,78,188,51,243,236,188,51,187,54,221,108,94,122,142,67,26,178,177,117,252,193,221,203,167,86,14,126,185,223,129,60,233,73,220,56,99,86,14,223,249,36,33,133,67,112,143,136,242,44,21,
@@ -9158,10 +9158,10 @@ static const unsigned char temp_a1c4cdc9[] =
 233,51,62,35,150,31,110,188,153,144,140,121,129,186,80,115,61,175,185,138,254,243,233,48,250,71,191,5,102,89,205,39,124,122,125,24,138,149,63,82,45,87,182,149,217,110,43,125,40,111,50,191,5,24,0,98,67,27,130,54,13,67,66,0,0,0,0,73,69,78,68,174,66,96,
 130,0,0 };
 
-const char* RadioButtons_selected_over03_png = (const char*) temp_a1c4cdc9;
+const char* RadioButtons_selected_over03_png = (const char*) temp_602d2c6e;
 
 //================== RadioButtons_selected_over-04.png ==================
-static const unsigned char temp_a1d2e54a[] =
+static const unsigned char temp_603b43ef[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,2,211,73,68,65,84,120,218,196,150,205,75,20,97,28,199,191,207,204,179,186,179,187,90,90,184,100,25,26,43,149,122,176,64,74,33,37,148,204,50,12,234,84,135,110,65,151,110,29,252,51,58,132,208,169,46,5,33,228,91,210,139,96,16,
 145,93,180,178,14,97,104,33,42,235,186,235,174,59,179,187,243,246,60,61,179,43,184,57,219,69,86,125,96,102,96,158,121,158,207,247,247,250,12,105,109,8,61,193,62,13,90,115,184,252,206,205,198,224,158,131,7,127,132,65,15,249,40,206,85,243,61,135,79,46,
@@ -9175,10 +9175,10 @@ static const unsigned char temp_a1d2e54a[] =
 109,113,164,210,69,236,159,73,142,228,203,87,66,196,56,202,58,175,192,79,85,68,23,8,212,117,6,61,143,227,112,169,37,154,133,166,237,66,243,222,224,248,250,98,12,114,73,174,166,109,131,131,153,121,49,183,55,99,174,165,119,249,84,35,238,30,144,141,185,
 110,50,204,38,164,61,63,82,29,46,93,212,248,211,69,205,222,151,63,153,191,2,12,0,199,181,70,142,38,155,205,86,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* RadioButtons_selected_over04_png = (const char*) temp_a1d2e54a;
+const char* RadioButtons_selected_over04_png = (const char*) temp_603b43ef;
 
 //================== RadioButtons_selected_over-05.png ==================
-static const unsigned char temp_a1e0fccb[] =
+static const unsigned char temp_60495b70[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0,
 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202,
 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11,
@@ -9231,10 +9231,10 @@ static const unsigned char temp_a1e0fccb[] =
 210,38,160,217,252,135,89,141,144,218,222,213,127,69,126,47,211,166,159,227,102,123,180,167,147,214,1,202,239,5,92,241,228,72,133,253,94,128,218,110,134,159,111,55,205,200,111,32,127,13,0,111,180,58,50,205,148,146,75,0,0,0,0,73,69,78,68,174,66,96,130,
 0,0 };
 
-const char* RadioButtons_selected_over05_png = (const char*) temp_a1e0fccb;
+const char* RadioButtons_selected_over05_png = (const char*) temp_60495b70;
 
 //================== noise_wave.png ==================
-static const unsigned char temp_2ada9d3c[] =
+static const unsigned char temp_8b0a9eb7[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,101,0,0,2,30,8,6,0,0,0,18,223,178,102,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,76,229,73,68,65,84,120,218,236,221,235,149,21,55,214,48,96,13,203,255,221,95,4,212,68,64,59,2,202,17,24,71,48,77,4,47,142,192,77,4,120,34,160,39,2,112,4,20,17,24,34,112,57,2,67,4,243,181,56,167,135,6,250,114,46,117,145,180,
 159,103,173,90,96,3,125,78,237,146,84,210,46,149,244,143,4,0,0,0,172,229,228,242,56,189,60,186,237,113,155,225,242,248,112,121,188,19,50,0,0,0,128,253,229,36,204,217,229,241,242,242,248,243,242,248,239,1,199,155,203,227,60,109,146,57,0,0,0,0,220,225,
@@ -9516,10 +9516,10 @@ static const unsigned char temp_2ada9d3c[] =
 73,212,228,227,97,186,249,117,163,15,151,199,251,203,99,220,30,131,176,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 176,175,255,47,192,0,205,180,140,11,223,168,97,120,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* noise_wave_png = (const char*) temp_2ada9d3c;
+const char* noise_wave_png = (const char*) temp_8b0a9eb7;
 
 //================== saw_wave.png ==================
-static const unsigned char temp_fad5260d[] =
+static const unsigned char temp_247d4a48[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,180,0,0,2,143,8,6,0,0,0,116,54,147,247,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,41,190,73,68,65,84,120,218,236,221,141,149,212,102,186,174,225,103,38,129,211,206,64,206,0,71,176,69,6,56,130,45,34,216,16,1,69,4,248,68,208,58,17,152,12,90,19,1,236,8,80,6,144,129,143,100,53,174,6,131,145,212,245,163,159,
 235,90,235,93,94,158,25,51,174,183,170,87,21,55,42,125,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,242,
@@ -9661,10 +9661,10 @@ static const unsigned char temp_fad5260d[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,231,254,191,0,3,0,11,98,146,161,132,82,43,233,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* saw_wave_png = (const char*) temp_fad5260d;
+const char* saw_wave_png = (const char*) temp_247d4a48;
 
 //================== sine_wave.png ==================
-static const unsigned char temp_eb0332c3[] =
+static const unsigned char temp_f65f95e8[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,180,0,0,2,171,8,6,0,0,0,232,11,212,215,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,49,204,73,68,65,84,120,218,236,221,175,151,36,199,149,40,224,24,205,3,122,200,13,197,156,203,196,92,102,102,78,49,9,109,137,237,178,52,123,102,229,191,96,211,232,157,69,101,182,176,198,200,107,84,18,178,141,170,133,158,88,
 143,153,30,170,22,211,67,51,98,54,242,203,112,85,107,122,52,61,221,153,89,249,43,50,191,239,156,123,122,108,31,219,163,232,200,31,113,51,238,141,15,2,0,0,0,0,36,228,3,67,0,0,0,0,64,74,36,180,0,0,0,0,72,138,132,22,0,0,0,0,73,145,208,2,0,0,0,32,41,18,90,
@@ -9837,10 +9837,10 @@ static const unsigned char temp_eb0332c3[] =
 104,1,0,0,0,144,20,9,45,0,0,0,0,146,34,161,5,0,0,0,64,82,36,180,0,0,0,0,72,138,132,22,0,0,0,0,73,145,208,2,0,0,0,32,41,18,90,0,0,0,0,36,69,66,11,0,0,0,128,164,72,104,1,0,0,0,144,20,9,45,0,0,0,0,146,242,255,5,24,0,142,248,78,14,98,33,228,71,0,0,0,0,73,
 69,78,68,174,66,96,130,0,0 };
 
-const char* sine_wave_png = (const char*) temp_eb0332c3;
+const char* sine_wave_png = (const char*) temp_f65f95e8;
 
 //================== square_wave.png ==================
-static const unsigned char temp_727226f3[] =
+static const unsigned char temp_184254d8[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,164,0,0,2,171,8,6,0,0,0,207,165,85,63,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,23,205,73,68,65,84,120,218,236,221,63,146,148,199,1,198,225,214,138,64,153,55,116,230,225,4,94,157,128,209,9,88,78,160,37,115,6,156,0,113,2,164,208,17,67,228,114,36,136,28,50,202,156,105,201,148,121,148,217,25,206,164,204,
 221,254,190,45,244,7,73,32,161,151,233,238,231,169,234,98,237,64,59,221,223,4,83,191,237,238,41,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -9911,10 +9911,10 @@ static const unsigned char temp_727226f3[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,14,253,79,128,1,0,153,2,27,8,33,213,49,244,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* square_wave_png = (const char*) temp_727226f3;
+const char* square_wave_png = (const char*) temp_184254d8;
 
 //================== triangle_wave.png ==================
-static const unsigned char temp_3825ab28[] =
+static const unsigned char temp_aaa1f3cd[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,172,0,0,2,113,8,6,0,0,0,111,215,42,130,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,32,173,73,68,65,84,120,218,236,221,251,145,85,199,122,198,225,214,113,2,100,224,9,129,12,204,201,128,16,94,101,64,8,100,160,16,80,6,132,128,28,1,114,4,216,17,72,25,224,189,197,12,12,48,151,125,89,151,175,187,159,167,170,
 171,252,199,41,219,181,46,189,250,251,157,13,180,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -10023,10 +10023,10 @@ static const unsigned char temp_3825ab28[] =
 253,85,213,43,183,1,0,0,0,128,31,189,110,95,226,209,150,161,42,46,59,0,0,0,0,207,121,117,88,239,219,122,161,234,248,107,174,184,204,0,0,0,0,156,235,248,247,73,165,125,137,87,215,254,171,130,199,72,245,166,125,249,203,222,1,88,193,47,46,1,0,0,48,161,151,
 183,235,230,176,254,235,153,255,236,127,31,214,223,135,245,231,97,253,225,210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,239,255,5,24,0,2,125,7,137,153,101,243,194,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* triangle_wave_png = (const char*) temp_3825ab28;
+const char* triangle_wave_png = (const char*) temp_aaa1f3cd;
 
 //================== wifi.png ==================
-static const unsigned char temp_4168e213[] =
+static const unsigned char temp_2a5bce[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,64,0,0,0,247,8,6,0,0,0,108,40,141,211,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,12,225,73,68,65,84,120,218,236,221,139,117,27,199,21,128,225,81,5,102,7,70,7,70,7,130,43,8,58,8,84,65,144,10,12,87,0,167,2,56,21,192,169,128,84,5,164,42,32,93,1,169,10,28,236,209,64,130,104,62,0,98,95,51,247,251,207,185,
 135,142,148,248,132,187,51,255,222,59,51,187,55,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,242,206,37,64,75,92,236,98,250,196,159,79,243,223,157,202,205,46,30,30,253,217,67,254,115,128,0,209,57,123,121,77,114,52,
@@ -10076,10 +10076,10 @@ static const unsigned char temp_4168e213[] =
 242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,132,148,32,249,1,8,41,65,242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,45,252,95,128,1,0,166,155,18,218,219,72,225,153,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* wifi_png = (const char*) temp_4168e213;
+const char* wifi_png = (const char*) temp_2a5bce;
 
 //================== SourceDrop.png ==================
-static const unsigned char temp_77043408[] =
+static const unsigned char temp_d7343583[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,154,0,0,2,209,8,6,0,0,0,163,255,186,145,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,24,15,73,68,65,84,120,218,236,157,49,118,219,58,155,64,225,252,234,199,59,120,76,55,93,244,78,154,233,66,173,192,206,10,34,55,108,99,175,64,210,10,226,180,106,44,175,32,206,10,68,151,83,228,68,89,65,152,106,202,167,233,166,
 203,224,139,32,255,50,4,82,36,69,144,50,113,239,57,140,98,218,164,36,232,234,3,64,2,31,206,212,137,144,36,201,185,126,24,234,45,214,219,95,122,139,244,38,251,190,206,231,243,105,195,207,181,52,207,211,36,35,253,58,211,6,95,163,188,190,101,133,67,178,
@@ -10169,10 +10169,10 @@ static const unsigned char temp_77043408[] =
 26,164,75,209,72,34,211,28,63,74,138,38,66,201,96,214,123,31,215,202,78,82,52,153,53,99,58,3,113,133,118,4,84,67,196,90,153,246,239,131,61,5,46,8,209,140,108,43,83,16,183,166,173,177,173,50,183,237,162,119,53,170,131,166,73,95,128,80,217,182,35,165,183,
 255,53,143,89,151,98,217,252,191,0,3,0,92,224,0,25,78,103,130,40,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* SourceDrop_png = (const char*) temp_77043408;
+const char* SourceDrop_png = (const char*) temp_d7343583;
 
 //================== DefaultDataSource.png ==================
-static const unsigned char temp_1f71843e[] =
+static const unsigned char temp_f39ef263[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,14,0,0,2,14,8,6,0,0,0,208,187,133,57,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,54,204,73,68,65,84,120,218,236,221,219,113,27,71,211,198,241,33,234,187,55,51,240,58,2,193,55,46,251,74,171,8,76,69,32,40,2,137,17,144,140,64,100,4,130,34,16,20,129,86,87,118,249,198,80,4,239,58,3,58,131,15,35,244,90,16,5,146,
 56,236,244,116,207,252,127,85,44,218,239,129,0,22,187,179,207,246,156,78,2,0,247,254,248,243,175,118,227,95,167,171,159,211,141,127,255,65,254,179,109,78,31,248,239,182,185,93,253,44,31,248,239,63,221,249,247,165,252,127,190,252,127,127,251,245,151,37,
@@ -10371,10 +10371,10 @@ static const unsigned char temp_1f71843e[] =
 124,222,248,247,158,65,139,0,193,1,192,126,193,98,168,90,68,177,106,209,200,63,55,193,126,229,98,168,20,12,255,252,175,252,243,80,45,88,50,72,17,32,56,0,200,27,52,54,181,59,252,95,159,110,249,207,134,39,255,135,220,74,24,248,166,114,64,133,0,40,207,255,
 11,48,0,82,9,189,51,228,54,205,183,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* DefaultDataSource_png = (const char*) temp_1f71843e;
+const char* DefaultDataSource_png = (const char*) temp_f39ef263;
 
 //================== FileReaderIcon.png ==================
-static const unsigned char temp_745ce456[] =
+static const unsigned char temp_5169b051[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,43,0,0,2,165,8,6,0,0,0,10,20,172,128,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,13,207,73,68,65,84,120,218,236,221,193,109,219,102,24,199,97,167,224,189,217,160,26,33,39,130,60,69,222,32,27,68,217,160,157,64,244,6,217,32,242,4,237,6,97,78,36,120,202,8,234,6,206,4,233,171,194,45,138,130,110,42,231,179,244,
 138,126,30,224,3,115,50,132,191,232,234,87,17,65,94,12,227,244,245,234,219,250,171,60,62,37,122,45,159,227,220,101,121,45,109,83,223,93,1,192,194,188,248,159,177,2,23,27,113,113,190,216,69,220,2,98,5,96,9,17,183,143,243,123,162,215,178,207,242,90,34,
@@ -10420,10 +10420,10 @@ static const unsigned char temp_745ce456[] =
 127,254,79,195,56,173,205,12,0,100,141,149,205,253,1,0,120,20,143,129,0,0,177,2,0,32,86,0,0,177,2,0,32,86,0,0,196,10,0,32,86,0,0,196,10,0,32,86,0,0,196,10,0,128,88,1,0,196,10,0,128,88,1,0,196,10,0,128,88,1,0,16,43,0,128,88,1,0,16,43,0,128,88,1,0,16,43,
 0,0,98,5,0,16,43,0,0,167,240,135,0,3,0,22,72,102,252,69,115,49,232,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* FileReaderIcon_png = (const char*) temp_745ce456;
+const char* FileReaderIcon_png = (const char*) temp_5169b051;
 
 //================== IntanIcon.png ==================
-static const unsigned char temp_18972d[] =
+static const unsigned char temp_b74fa52[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,88,0,0,2,88,8,6,0,0,0,190,102,152,220,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,63,109,73,68,65,84,120,218,236,221,219,117,219,198,162,6,96,56,43,239,155,187,130,208,21,88,126,201,74,158,76,87,96,185,2,83,21,88,170,64,82,5,146,43,16,93,129,229,10,68,63,37,43,47,86,42,48,83,193,81,42,216,7,99,13,19,154,
 230,5,131,27,1,242,251,214,194,102,182,197,203,112,0,2,63,102,6,131,39,89,71,252,246,251,31,71,249,67,88,134,249,242,44,95,6,241,79,71,11,255,13,0,240,144,47,247,11,255,253,103,190,204,194,191,253,250,203,207,247,93,40,224,147,29,7,170,227,124,121,145,
@@ -10654,10 +10654,10 @@ static const unsigned char temp_18972d[] =
 105,213,2,0,154,55,203,151,219,124,121,95,245,202,192,206,6,172,21,97,107,148,47,175,178,199,150,45,115,105,1,0,85,133,57,172,66,144,250,152,47,211,54,67,85,39,2,214,154,192,53,140,97,235,167,236,223,22,174,97,166,181,11,0,248,215,44,46,243,255,254,43,
 134,170,217,174,2,213,178,255,23,96,0,208,173,232,3,246,227,153,225,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* IntanIcon_png = (const char*) temp_18972d;
+const char* IntanIcon_png = (const char*) temp_b74fa52;
 
 //================== muteoff.png ==================
-static const unsigned char temp_bf129135[] =
+static const unsigned char temp_ca6ef45a[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,165,0,0,0,119,8,6,0,0,0,98,221,128,254,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,7,127,73,68,65,84,120,218,236,93,237,141,219,56,16,157,13,238,255,169,131,232,42,136,58,136,174,130,115,42,136,182,3,167,130,213,85,160,77,5,74,7,218,171,64,238,64,78,5,187,169,192,123,21,236,217,128,140,91,24,182,197,33,
 135,228,144,126,15,32,2,36,182,98,146,79,111,190,248,65,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,23,119,24,2,49,52,251,246,215,190,21,251,182,221,183,239,251,246,130,97,1,98,224,64,194,105,223,222,78,218,110,223,86,24,30,64,11,33,223,183,10,195,4,132,194,106,
@@ -10688,10 +10688,10 @@ static const unsigned char temp_bf129135[] =
 182,24,66,64,147,106,154,30,135,13,0,193,84,19,102,16,80,165,154,3,134,10,8,141,134,174,87,64,96,182,129,104,196,220,157,81,72,16,210,2,119,24,2,81,172,102,34,110,136,127,239,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,224,63,1,6,0,199,74,112,
 188,78,34,32,245,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* muteoff_png = (const char*) temp_bf129135;
+const char* muteoff_png = (const char*) temp_ca6ef45a;
 
 //================== muteon.png ==================
-static const unsigned char temp_a3695c2f[] =
+static const unsigned char temp_cd11806a[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,165,0,0,0,119,8,6,0,0,0,98,221,128,254,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,5,175,73,68,65,84,120,218,236,157,225,113,219,54,20,128,41,95,7,144,39,40,51,65,153,9,66,79,80,101,130,72,19,84,158,32,242,4,106,38,176,55,80,58,129,212,9,228,78,32,101,2,187,19,176,192,9,185,178,172,34,63,146,32,240,32,
 126,223,29,207,254,33,203,226,227,167,247,0,16,0,179,12,0,0,0,0,0,0,0,0,0,32,46,19,66,224,135,170,170,230,230,199,175,230,152,154,227,217,28,95,38,147,201,145,200,64,12,25,167,230,216,87,255,231,197,28,51,34,4,90,132,172,83,16,41,8,37,228,204,101,195,
@@ -10716,10 +10716,10 @@ static const unsigned char temp_a3695c2f[] =
 38,65,91,214,228,14,14,168,202,154,60,228,30,130,203,121,233,105,25,123,202,54,196,20,179,57,87,115,131,144,221,96,31,27,191,114,218,182,163,21,113,215,246,185,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,61,252,35,192,0,171,7,136,102,133,179,227,147,0,0,0,
 0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* muteon_png = (const char*) temp_a3695c2f;
+const char* muteon_png = (const char*) temp_cd11806a;
 
 //================== MergerA-01.png ==================
-static const unsigned char temp_7677e5e[] =
+static const unsigned char temp_1b9d0d19[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,21,118,73,68,65,84,120,218,236,221,189,111,93,71,122,7,224,33,205,133,100,55,75,195,69,108,96,131,28,117,74,82,136,238,210,36,190,238,220,45,221,109,170,92,117,73,181,218,46,157,168,191,64,18,130,0,219,241,170,76,37,186,220,
 138,87,221,22,73,72,45,16,239,166,226,81,103,87,146,58,17,145,172,204,240,156,107,82,50,181,226,199,189,119,230,156,243,60,192,64,194,98,23,246,190,188,31,63,190,243,158,153,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -10797,10 +10797,10 @@ static const unsigned char temp_7677e5e[] =
 248,195,31,30,43,12,66,17,148,105,26,154,109,180,127,89,116,32,18,138,24,98,32,26,159,252,207,126,241,139,191,60,90,127,252,246,219,240,242,229,255,41,18,66,17,148,97,18,215,111,98,24,186,179,204,71,246,189,163,25,108,32,154,249,139,79,63,13,127,253,
 55,127,27,254,251,191,254,83,48,66,40,130,124,82,39,232,183,113,253,99,12,67,15,114,28,238,248,255,2,12,0,160,41,104,168,212,59,220,159,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* MergerA01_png = (const char*) temp_7677e5e;
+const char* MergerA01_png = (const char*) temp_1b9d0d19;
 
 //================== MergerA-02.png ==================
-static const unsigned char temp_77595df[] =
+static const unsigned char temp_1bab249a[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,21,221,73,68,65,84,120,218,236,221,207,143,220,229,125,192,241,199,6,20,145,3,24,113,104,14,84,76,14,68,42,145,98,71,109,165,68,106,203,112,171,0,41,246,49,39,236,219,70,171,85,234,191,0,175,170,168,205,41,187,26,141,58,55,
 102,149,246,18,21,177,72,148,156,130,191,62,1,39,198,28,210,10,34,49,78,140,212,139,221,129,74,56,17,152,246,251,236,124,7,111,28,227,95,187,51,207,243,253,62,175,151,52,26,43,34,96,127,118,215,251,222,231,121,190,223,239,145,0,29,55,24,142,94,174,223,
@@ -10880,10 +10880,10 @@ static const unsigned char temp_77595df[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,7,243,255,2,12,0,244,180,87,201,128,90,137,162,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* MergerA02_png = (const char*) temp_77595df;
+const char* MergerA02_png = (const char*) temp_1bab249a;
 
 //================== MergerB-01.png ==================
-static const unsigned char temp_6f48ab3d[] =
+static const unsigned char temp_837e39f8[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,22,71,73,68,65,84,120,218,236,221,193,110,92,215,125,192,225,35,195,64,150,97,158,160,147,39,16,253,4,30,111,219,2,161,159,32,163,29,1,130,144,252,4,146,94,160,148,58,24,100,18,47,56,68,187,106,211,74,6,28,103,149,112,180,106,
 187,210,72,221,217,5,60,130,232,165,108,102,99,67,128,1,245,156,185,119,68,202,162,109,82,26,206,57,247,222,239,67,47,168,4,110,98,255,69,101,126,60,231,220,123,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -10964,10 +10964,10 @@ static const unsigned char temp_6f48ab3d[] =
 90,156,33,18,68,136,34,40,194,36,100,60,119,36,138,232,108,24,185,195,12,81,4,197,154,214,113,52,21,69,112,201,254,254,31,254,241,240,179,63,125,218,55,9,68,17,20,109,30,214,248,42,17,81,68,23,221,138,215,77,99,64,20,65,99,164,67,217,31,94,246,182,218,
 187,230,76,199,92,248,185,69,0,100,51,13,107,124,50,182,40,66,16,1,80,154,73,200,240,14,53,81,132,32,2,160,4,199,117,12,221,205,117,247,217,255,11,48,0,4,145,141,135,126,85,212,174,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* MergerB01_png = (const char*) temp_6f48ab3d;
+const char* MergerB01_png = (const char*) temp_837e39f8;
 
 //================== MergerB-02.png ==================
-static const unsigned char temp_6f56c2be[] =
+static const unsigned char temp_838c5179[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,
 100,121,113,201,101,60,0,0,18,109,73,68,65,84,120,218,236,221,253,109,28,199,25,192,225,161,97,88,127,90,174,192,231,10,76,87,224,77,5,145,42,48,85,129,237,10,44,86,16,177,2,31,43,200,165,2,175,42,200,169,2,173,42,200,249,207,0,1,156,27,237,94,72,43,
 148,248,117,119,243,238,204,243,0,7,25,65,128,216,175,201,240,199,249,216,253,60,65,253,126,221,126,206,140,129,154,125,254,228,137,33,48,87,203,237,231,242,63,255,254,119,95,252,251,200,191,11,4,17,0,71,182,153,98,232,98,27,67,67,152,95,46,252,123,65,
@@ -11034,10 +11034,10 @@ static const unsigned char temp_6f56c2be[] =
 0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,
 16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,181,248,175,0,3,0,94,88,236,111,126,120,246,51,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* MergerB02_png = (const char*) temp_6f56c2be;
+const char* MergerB02_png = (const char*) temp_838c5179;
 
 //================== PipelineA-01.png ==================
-static const unsigned char temp_a2c576c6[] =
+static const unsigned char temp_7fd242c1[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,20,161,73,68,65,84,120,218,236,221,77,118,220,198,213,6,224,82,236,121,232,89,102,129,87,96,122,5,106,175,192,202,10,212,90,129,153,21,136,90,1,165,21,176,51,250,134,162,71,223,80,240,10,68,205,50,19,178,2,209,179,204,148,
 174,3,180,217,110,145,84,55,8,116,85,1,207,115,78,29,57,63,199,150,47,33,246,203,91,183,80,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,22,190,81,2,128,193,124,92,175,39,235,245,239,245,250,175,114,0,0,165,248,220,173,79,235,
@@ -11112,10 +11112,10 @@ static const unsigned char temp_a2c576c6[] =
 0,132,24,40,73,28,224,125,17,12,242,2,8,49,80,88,128,137,91,72,6,121,1,132,24,40,138,147,72,0,66,12,20,25,96,174,148,1,64,136,129,210,2,204,74,25,0,132,24,40,201,107,1,6,96,222,188,39,134,18,197,240,242,66,25,0,230,77,39,6,1,6,0,33,6,4,24,0,132,24,16,
 96,0,16,98,16,96,0,152,154,111,149,128,204,57,70,13,192,157,116,98,16,96,0,40,210,255,4,24,0,27,12,93,110,21,245,184,159,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* PipelineA01_png = (const char*) temp_a2c576c6;
+const char* PipelineA01_png = (const char*) temp_7fd242c1;
 
 //================== PipelineA-02.png ==================
-static const unsigned char temp_a2d38e47[] =
+static const unsigned char temp_7fe05a42[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,25,18,73,68,65,84,120,218,236,221,191,114,28,199,157,192,241,214,149,67,178,12,101,167,75,52,10,200,84,36,93,133,2,18,97,121,14,233,42,83,145,228,72,96,157,157,185,78,160,99,203,36,66,251,2,146,137,47,228,224,94,64,240,19,
 104,20,1,133,132,208,19,104,239,9,4,63,1,111,154,59,123,128,36,252,217,157,253,51,221,51,159,79,213,214,74,182,69,139,63,146,139,47,122,122,166,67,8,225,173,151,87,74,175,91,183,111,191,125,93,254,207,15,71,199,39,247,2,0,92,225,189,230,11,7,36,225,206,
@@ -11207,10 +11207,10 @@ static const unsigned char temp_a2d38e47[] =
 25,5,136,24,128,212,157,133,243,243,140,198,198,1,34,6,32,117,49,88,28,9,0,34,6,32,27,85,152,172,186,28,26,5,136,24,128,28,148,77,188,156,26,5,136,24,128,212,77,143,4,40,237,119,1,17,3,144,131,24,44,251,110,145,6,17,3,144,139,170,137,151,202,40,64,196,
 0,228,160,12,142,4,0,17,3,144,137,24,44,142,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,240,127,2,12,0,195,72,32,13,219,83,201,41,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* PipelineA02_png = (const char*) temp_a2d38e47;
+const char* PipelineA02_png = (const char*) temp_7fe05a42;
 
 //================== PipelineB-01.png ==================
-static const unsigned char temp_aa6a3a5[] =
+static const unsigned char temp_e7b36fa0[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,23,202,73,68,65,84,120,218,236,221,191,111,164,199,125,192,225,177,99,56,141,4,159,75,167,241,186,184,107,69,157,1,130,108,196,85,107,5,208,165,58,5,72,34,30,98,215,186,75,109,231,142,165,227,66,199,198,46,245,242,47,16,
 13,196,85,18,248,149,155,93,108,99,10,112,106,189,174,148,146,130,221,43,239,104,223,21,87,247,131,183,187,220,221,153,217,247,121,128,5,37,69,145,229,239,209,224,231,102,230,125,39,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,
@@ -11297,10 +11297,10 @@ static const unsigned char temp_aa6a3a5[] =
 175,127,249,203,162,231,100,4,12,0,223,240,55,237,231,137,49,144,218,31,254,240,73,248,235,95,255,18,14,14,14,5,12,0,34,134,178,252,239,159,254,20,254,239,243,207,195,221,31,223,13,223,253,238,223,206,254,114,124,140,250,196,116,0,120,145,47,125,124,
 114,250,220,190,115,231,203,255,250,239,255,249,114,52,158,28,251,159,39,0,47,243,255,2,12,0,38,140,193,224,172,166,247,238,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* PipelineB01_png = (const char*) temp_aa6a3a5;
+const char* PipelineB01_png = (const char*) temp_e7b36fa0;
 
 //================== PipelineB-02.png ==================
-static const unsigned char temp_ab4bb26[] =
+static const unsigned char temp_e7c18721[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,
 97,100,121,113,201,101,60,0,0,20,155,73,68,65,84,120,218,236,221,189,122,28,71,118,6,224,162,54,217,141,4,101,155,169,121,5,132,50,103,28,101,206,22,190,130,29,101,206,12,103,206,22,186,2,72,87,192,209,21,16,190,2,54,51,103,4,51,109,132,118,182,142,72,
 101,206,184,93,238,30,99,22,4,64,204,95,119,157,238,247,125,158,122,160,213,15,151,60,232,25,124,83,117,170,234,89,74,233,83,130,242,124,108,199,247,237,184,86,10,0,238,243,76,136,161,240,32,243,67,59,174,148,2,0,33,134,136,114,144,89,41,3,0,66,12,130,
@@ -11375,7 +11375,7 @@ static const unsigned char temp_ab4bb26[] =
 228,45,210,23,73,191,11,0,16,36,196,184,18,0,0,8,21,98,242,146,209,66,105,1,128,8,33,38,247,187,92,38,253,46,0,64,144,16,227,74,0,0,32,84,136,201,253,46,103,202,7,0,68,9,49,185,223,229,84,217,0,128,8,33,102,125,37,64,165,92,0,64,132,16,179,238,119,1,
 0,8,17,98,114,191,203,66,105,0,128,40,33,198,149,0,0,64,24,174,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,241,119,1,6,0,159,157,76,71,98,187,78,10,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* PipelineB02_png = (const char*) temp_ab4bb26;
+const char* PipelineB02_png = (const char*) temp_e7c18721;
 
 
 const char* getNamedResource (const char*, int&) throw();
diff --git a/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp b/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..4ca5c6678764c237fa77f9f2c2762a0c22073887
--- /dev/null
+++ b/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp
@@ -0,0 +1,65 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 "LfpTriggeredAverageEditor.h"
+
+
+LfpTrigAvgEditor::LfpTrigAvgEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true)
+    : VisualizerEditor(parentNode, useDefaultParameterEditors)
+
+{
+
+    tabText = "LFP";
+    desiredWidth = 180;
+
+}
+
+LfpTrigAvgEditor::~LfpTrigAvgEditor()
+{
+}
+
+
+Visualizer* LfpTrigAvgEditor::createNewCanvas()
+{
+
+    LfpTrigAvgNode* processor = (LfpTrigAvgNode*) getProcessor();
+    return new LfpTrigAvgCanvas(processor);
+
+}
+
+void LfpTrigAvgEditor::buttonCallback(Button* button)
+{
+
+    int gId = button->getRadioGroupId();
+
+    if (gId > 0)
+    {
+        if (canvas != 0)
+        {
+            canvas->setParameter(gId-1, button->getName().getFloatValue());
+        }
+
+    }
+
+}
+
diff --git a/Source/Processors/Editors/LfpTriggeredAverageEditor.h b/Source/Processors/Editors/LfpTriggeredAverageEditor.h
new file mode 100755
index 0000000000000000000000000000000000000000..172c7196c444ce5032bb9e4c45935cf748cd797b
--- /dev/null
+++ b/Source/Processors/Editors/LfpTriggeredAverageEditor.h
@@ -0,0 +1,63 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 __LFPTRIGAVGEDITOR_H_3438800D__
+#define __LFPTRIGAVGEDITOR_H_3438800D__
+
+#include "../../../JuceLibraryCode/JuceHeader.h"
+#include "GenericEditor.h"
+#include "../../UI/UIComponent.h"
+#include "../../UI/DataViewport.h"
+#include "../Visualization/DataWindow.h"
+#include "../LfpTriggeredAverageNode.h"
+#include "../Visualization/LfpTriggeredAverageCanvas.h"
+#include "VisualizerEditor.h"
+
+class Visualizer;
+
+/**
+
+  User interface for the LfpDisplayNode sink.
+
+  @see LfpDisplayNode, LfpDisplayCanvas
+
+*/
+
+class LfpTrigAvgEditor : public VisualizerEditor
+{
+public:
+    LfpTrigAvgEditor(GenericProcessor*, bool useDefaultParameterEditors);
+    ~LfpTrigAvgEditor();
+
+    void buttonCallback(Button* button);
+
+    Visualizer* createNewCanvas();
+
+private:
+
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgEditor);
+
+};
+
+#endif  // __LFPTRIGAVGEDITOR_H_3438800D__
diff --git a/Source/Processors/LfpTriggeredAverageNode.cpp b/Source/Processors/LfpTriggeredAverageNode.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..654f7b2105c6d97a5776147ad3bba385e029ed8a
--- /dev/null
+++ b/Source/Processors/LfpTriggeredAverageNode.cpp
@@ -0,0 +1,325 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 "LfpTriggeredAverageNode.h"
+#include "Visualization/LfpTriggeredAverageCanvas.h"
+#include <stdio.h>
+
+LfpTrigAvgNode::LfpTrigAvgNode()
+    : GenericProcessor("LFP Trig. Avg."),
+      displayBufferIndex(0), displayGain(1), bufferLength(5.0f),
+      abstractFifo(100), ttlState(0)
+{
+    std::cout << " LfpTrigAvgNodeConstructor" << std::endl;
+    displayBuffer = new AudioSampleBuffer(8, 100);
+    eventBuffer = new MidiBuffer();
+
+    arrayOfOnes = new float[5000];
+
+    for (int n = 0; n < 5000; n++)
+    {
+        arrayOfOnes[n] = 1;
+    }
+
+}
+
+LfpTrigAvgNode::~LfpTrigAvgNode()
+{
+
+}
+
+AudioProcessorEditor* LfpTrigAvgNode::createEditor()
+{
+
+    editor = new LfpTrigAvgEditor(this, true);
+    return editor;
+
+}
+
+void LfpTrigAvgNode::updateSettings()
+{
+    std::cout << "Setting num inputs on LfpTrigAvgNode to " << getNumInputs() << std::endl;
+}
+
+bool LfpTrigAvgNode::resizeBuffer()
+{
+    int nSamples = (int) getSampleRate()*bufferLength;
+    int nInputs = getNumInputs();
+
+    std::cout << "Resizing buffer. Samples: " << nSamples << ", Inputs: " << nInputs << std::endl;
+
+    if (nSamples > 0 && nInputs > 0)
+    {
+        abstractFifo.setTotalSize(nSamples);
+        displayBuffer->setSize(nInputs+1, nSamples); // add an extra channel for TTLs
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+
+}
+
+bool LfpTrigAvgNode::enable()
+{
+
+    if (resizeBuffer())
+    {
+        LfpTrigAvgEditor* editor = (LfpTrigAvgEditor*) getEditor();
+        editor->enable();
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+
+}
+
+bool LfpTrigAvgNode::disable()
+{
+    LfpTrigAvgEditor* editor = (LfpTrigAvgEditor*) getEditor();
+    editor->disable();
+    return true;
+}
+
+void LfpTrigAvgNode::setParameter(int parameterIndex, float newValue)
+{
+    editor->updateParameterButtons(parameterIndex);
+    //Sets Parameter in parameters array for processor
+    Parameter* parameterPointer=parameters.getRawDataPointer();
+    parameterPointer=parameterPointer+parameterIndex;
+    parameterPointer->setValue(newValue, currentChannel);
+
+    //std::cout << "Saving Parameter from " << currentChannel << ", channel ";
+
+    LfpTrigAvgEditor* ed = (LfpTrigAvgEditor*) getEditor();
+    if (ed->canvas != 0)
+        ed->canvas->setParameter(parameterIndex, newValue);
+}
+
+void LfpTrigAvgNode::handleEvent(int eventType, MidiMessage& event, int sampleNum)
+{
+    if (eventType == TTL)
+    {
+        const uint8* dataptr = event.getRawData();
+
+        // int eventNodeId = *(dataptr+1);
+        int eventId = *(dataptr+2);
+        int eventChannel = *(dataptr+3);
+        int eventTime = event.getTimeStamp();
+
+        int samplesLeft = totalSamples - eventTime;
+
+        //	std::cout << "Received event from " << eventNodeId << ", channel "
+        //	          << eventChannel << ", with ID " << eventId << std::endl;
+        //
+        int bufferIndex = (displayBufferIndex + eventTime);// % displayBuffer->getNumSamples();
+
+        if (eventId == 1)
+        {
+            ttlState |= (1L << eventChannel);
+        }
+        else
+        {
+            ttlState &= ~(1L << eventChannel);
+        }
+
+        if (samplesLeft + bufferIndex < displayBuffer->getNumSamples())
+        {
+
+            //	std::cout << bufferIndex << " " << samplesLeft << " " << ttlState << std::endl;
+
+            displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                    bufferIndex,		// destStartSample
+                                    arrayOfOnes, 		// source
+                                    samplesLeft, 		// numSamples
+                                    float(ttlState));   // gain
+        }
+        else
+        {
+
+            int block2Size = (samplesLeft + bufferIndex) % displayBuffer->getNumSamples();
+            int block1Size = samplesLeft - block2Size;
+
+            //std::cout << "OVERFLOW." << std::endl;
+
+            //std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl;
+
+            displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                    bufferIndex,		// destStartSample
+                                    arrayOfOnes, 		// source
+                                    block1Size, 		// numSamples
+                                    float(ttlState));   // gain
+
+            //std::cout << 0 << " " << block2Size << " " << ttlState << std::endl;
+
+            displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                    0,		// destStartSample
+                                    arrayOfOnes, 		// source
+                                    block2Size, 		// numSamples
+                                    float(ttlState));   // gain
+
+
+        }
+
+
+        // 	std::cout << "ttlState: " << ttlState << std::endl;
+
+        // std::cout << "Received event from " << eventNodeId <<
+        //              " on channel " << eventChannel <<
+        //             " with value " << eventId <<
+        //             " at timestamp " << event.getTimeStamp() << std::endl;
+
+
+    }
+    else if (eventType == TIMESTAMP)
+    {
+
+        const uint8* dataptr = event.getRawData();
+
+        // int eventNodeId = *(dataptr+1);
+        // int eventId = *(dataptr+2);
+        // int eventChannel = *(dataptr+3);
+
+        // update the timestamp for the current buffer:
+        memcpy(&bufferTimestamp, dataptr+4, 4);
+
+
+
+        //   	double timeInSeconds = double(ts)/Time::getHighResolutionTicksPerSecond();
+        //   	//int64 timestamp = ts[0] << 32 +
+        //   	//				  ts[1] << 16 +
+        //   	//				  ts[2] << 8 +
+        //   	//				  ts[3];
+        //   	//memcpy(ts, dataptr+4, 1);
+
+        //   	std::cout << "Time in seconds is " << timeInSeconds << std::endl;
+
+        // // std::cout << "Received event from " << eventNodeId <<
+        //    	//              " on channel " << eventChannel <<
+        //    	 //             " with value " << eventId <<
+        //    	 //             " for time: " << ts << std::endl;
+    }
+}
+
+void LfpTrigAvgNode::initializeEventChannel()
+{
+    if (displayBufferIndex + totalSamples < displayBuffer->getNumSamples())
+    {
+
+        //	std::cout << getNumInputs()+1 << " " << displayBufferIndex << " " << totalSamples << " " << ttlState << std::endl;
+        //
+        displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                displayBufferIndex,		// destStartSample
+                                arrayOfOnes, 		// source
+                                totalSamples, 		// numSamples
+                                float(ttlState));   // gain
+    }
+    else
+    {
+
+        int block2Size = (displayBufferIndex + totalSamples) % displayBuffer->getNumSamples();
+        int block1Size = totalSamples - block2Size;
+
+        // std::cout << "OVERFLOW." << std::endl;
+
+        // std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl;
+
+        displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                displayBufferIndex,		// destStartSample
+                                arrayOfOnes, 		// source
+                                block1Size, 		// numSamples
+                                float(ttlState));   // gain
+        // std::cout << 0 << " " << block2Size << " " << ttlState << std::endl;
+
+        displayBuffer->copyFrom(displayBuffer->getNumChannels()-1,  // destChannel
+                                0,		// destStartSample
+                                arrayOfOnes, 		// source
+                                block2Size, 		// numSamples
+                                float(ttlState));   // gain
+
+
+    }
+}
+
+void LfpTrigAvgNode::process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples)
+{
+    // 1. place any new samples into the displayBuffer
+    //std::cout << "Display node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl;
+
+    totalSamples = nSamples;
+    displayBufferIndexEvents = displayBufferIndex;
+
+    initializeEventChannel();
+
+    checkForEvents(events); // update timestamp, see if we got any TTL events
+
+    int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex;
+
+    if (nSamples < samplesLeft)
+    {
+
+        for (int chan = 0; chan < buffer.getNumChannels(); chan++)
+        {
+            displayBuffer->copyFrom(chan,  			// destChannel
+                                    displayBufferIndex, // destStartSample
+                                    buffer, 			// source
+                                    chan, 				// source channel
+                                    0,					// source start sample
+                                    nSamples); 			// numSamples
+
+        }
+        displayBufferIndex += (nSamples);
+
+    }
+    else
+    {
+
+        int extraSamples = nSamples - samplesLeft;
+
+        for (int chan = 0; chan < buffer.getNumChannels(); chan++)
+        {
+            displayBuffer->copyFrom(chan,  				// destChannel
+                                    displayBufferIndex, // destStartSample
+                                    buffer, 			// source
+                                    chan, 				// source channel
+                                    0,					// source start sample
+                                    samplesLeft); 		// numSamples
+
+            displayBuffer->copyFrom(chan,
+                                    0,
+                                    buffer,
+                                    chan,
+                                    samplesLeft,
+                                    extraSamples);
+        }
+
+        displayBufferIndex = extraSamples;
+    }
+
+
+
+}
+
diff --git a/Source/Processors/LfpTriggeredAverageNode.h b/Source/Processors/LfpTriggeredAverageNode.h
new file mode 100755
index 0000000000000000000000000000000000000000..6673dce138611bc7186e91cd132ddbfa8001eef5
--- /dev/null
+++ b/Source/Processors/LfpTriggeredAverageNode.h
@@ -0,0 +1,109 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 __LFPTRIGAVGNODE_H_D969A379__
+#define __LFPTRIGAVGNODE_H_D969A379__
+
+#include "../../JuceLibraryCode/JuceHeader.h"
+#include "Editors/LfpTriggeredAverageEditor.h"
+#include "Editors/VisualizerEditor.h"
+#include "GenericProcessor.h"
+
+class DataViewport;
+
+/**
+
+  Holds data in a displayBuffer to be used by the LfpDisplayCanvas
+  for rendering continuous data streams.
+
+  @see GenericProcessor, LfpTrigAvgEditor, LfpDisplayCanvas
+
+*/
+
+class LfpTrigAvgNode :  public GenericProcessor
+
+{
+public:
+
+    LfpTrigAvgNode();
+    ~LfpTrigAvgNode();
+
+    AudioProcessorEditor* createEditor();
+
+    bool isSink()
+    {
+        return true;
+    }
+
+    void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples);
+
+    void setParameter(int, float);
+
+    void updateSettings();
+
+    bool enable();
+    bool disable();
+
+    void handleEvent(int, MidiMessage&, int);
+
+    AudioSampleBuffer* getDisplayBufferAddress()
+    {
+        return displayBuffer;
+    }
+    int getDisplayBufferIndex()
+    {
+        return displayBufferIndex;
+    }
+
+private:
+
+    void initializeEventChannel();
+
+    ScopedPointer<AudioSampleBuffer> displayBuffer;
+    ScopedPointer<MidiBuffer> eventBuffer;
+
+    int displayBufferIndex;
+    int displayBufferIndexEvents;
+
+    float displayGain; //
+    float bufferLength; // s
+
+    AbstractFifo abstractFifo;
+
+    int64 bufferTimestamp;
+    int ttlState;
+    float* arrayOfOnes;
+    int totalSamples;
+
+    //Time timer;
+
+    bool resizeBuffer();
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgNode);
+
+};
+
+
+
+
+#endif  // __LFPTRIGAVGNODE_H_D969A379__
diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp
index 1af9de78f6844ae5b5837a25b190cd762601d3fe..72efab8a012055aee14f276335d23411fcae9c3c 100644
--- a/Source/Processors/ProcessorGraph.cpp
+++ b/Source/Processors/ProcessorGraph.cpp
@@ -27,6 +27,7 @@
 
 #include "AudioNode.h"
 #include "LfpDisplayNode.h"
+#include "LfpTriggeredAverageNode.h"
 #include "SpikeDisplayNode.h"
 #include "EventNode.h"
 #include "FilterNode.h"
@@ -557,6 +558,12 @@ GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& descrip
             // processor->setDataViewport(getDataViewport());
             //processor->setUIComponent(UI);
         }
+        else if (subProcessorType.equalsIgnoreCase("LFP Trig. Avg."))
+        {
+            std::cout << "Creating an LfpTrigAvgNode." << std::endl;
+            processor = new LfpTrigAvgNode();
+        }                   
+        
         else if (subProcessorType.equalsIgnoreCase("Spike Viewer"))
         {
             std::cout << "Creating an SpikeDisplayNode." << std::endl;
diff --git a/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..34fe1aa0c0b8cc58caa9a0c732f920c22e2ba52e
--- /dev/null
+++ b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp
@@ -0,0 +1,1165 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 "LfpTriggeredAverageCanvas.h"
+
+#include <math.h>
+
+LfpTrigAvgCanvas::LfpTrigAvgCanvas(LfpTrigAvgNode* processor_) :
+    screenBufferIndex(0), timebase(1.0f), displayGain(1.0f),   timeOffset(0.0f),
+    processor(processor_),
+    displayBufferIndex(0)
+{
+
+    nChans = processor->getNumInputs();
+    sampleRate = processor->getSampleRate();
+    std::cout << "Setting num inputs on LfpTrigAvgCanvas to " << nChans << std::endl;
+
+    displayBuffer = processor->getDisplayBufferAddress();
+    displayBufferSize = displayBuffer->getNumSamples();
+    std::cout << "Setting displayBufferSize on LfpTrigAvgCanvas to " << displayBufferSize << std::endl;
+
+    screenBuffer = new AudioSampleBuffer(MAX_N_CHAN, MAX_N_SAMP);
+    screenBuffer->clear();
+
+    viewport = new Viewport();
+    display = new LfpTrigAvgDisplay(this, viewport);
+    timescale = new LfpTrigAvgTimescale(this);
+
+    timescale->setTimebase(timebase);
+
+    viewport->setViewedComponent(display, false);
+    viewport->setScrollBarsShown(true, false);
+
+    scrollBarThickness = viewport->getScrollBarThickness();
+
+
+    //viewport->getVerticalScrollBar()->addListener(this->scrollBarMoved(viewport->getVerticalScrollBar(), 1.0));
+
+
+
+    addAndMakeVisible(viewport);
+    addAndMakeVisible(timescale);
+
+    voltageRanges.add("50");
+    voltageRanges.add("100");
+    voltageRanges.add("500");
+    voltageRanges.add("1000");
+    voltageRanges.add("2000");
+    voltageRanges.add("5000");
+
+    timebases.add("0.2");
+    timebases.add("0.5");
+    timebases.add("1.0");
+    timebases.add("2.0");
+    timebases.add("5.0");
+    timebases.add("10.0");
+
+
+    spreads.add("10");
+    spreads.add("20");
+    spreads.add("30");
+    spreads.add("40");
+    spreads.add("50");
+    spreads.add("60");
+
+
+    rangeSelection = new ComboBox("Voltage range");
+    rangeSelection->addItemList(voltageRanges, 1);
+    rangeSelection->setSelectedId(4,false);
+    rangeSelection->addListener(this);
+    addAndMakeVisible(rangeSelection);
+
+    timebaseSelection = new ComboBox("Timebase");
+    timebaseSelection->addItemList(timebases, 1);
+    timebaseSelection->setSelectedId(3,false);
+    timebaseSelection->addListener(this);
+    addAndMakeVisible(timebaseSelection);
+
+
+    spreadSelection = new ComboBox("Spread");
+    spreadSelection->addItemList(spreads, 1);
+    spreadSelection->setSelectedId(5,false);
+    spreadSelection->addListener(this);
+    addAndMakeVisible(spreadSelection);
+
+
+    display->setNumChannels(nChans);
+    display->setRange(1000.0f);
+
+    // add event display-specific controls (currently just an enable/disable button)
+    for (int i = 0; i < 8; i++)
+    {
+
+
+        LfpTrigAvgEventInterface* eventOptions = new LfpTrigAvgEventInterface(display, this, i);
+        LfpTrigAvgEventInterfaces.add(eventOptions);
+        addAndMakeVisible(eventOptions);
+        eventOptions->setBounds(500+(floor(i/2)*20), getHeight()-20-(i%2)*20, 40, 20);
+
+        display->setEventDisplayState(i,true);
+
+    }
+
+
+}
+
+LfpTrigAvgCanvas::~LfpTrigAvgCanvas()
+{
+
+    deleteAndZero(screenBuffer);
+}
+
+void LfpTrigAvgCanvas::resized()
+{
+
+    timescale->setBounds(leftmargin,0,getWidth()-scrollBarThickness-leftmargin,30);
+    viewport->setBounds(0,30,getWidth(),getHeight()-90);
+
+    display->setBounds(0,0,getWidth()-scrollBarThickness, getChannelHeight()*nChans);
+
+    rangeSelection->setBounds(5,getHeight()-30,100,25);
+    timebaseSelection->setBounds(175,getHeight()-30,100,25);
+    spreadSelection->setBounds(345,getHeight()-30,100,25);
+
+    for (int i = 0; i < 8; i++)
+    {
+        LfpTrigAvgEventInterfaces[i]->setBounds(500+(floor(i/2)*20), getHeight()-40+(i%2)*20, 40, 20); // arrange event channel buttons in two rows
+        LfpTrigAvgEventInterfaces[i]->repaint();
+    }
+
+
+    // std::cout << "Canvas thinks LfpTrigAvgDisplay should be this high: "
+    //  << LfpTrigAvgDisplay->getTotalHeight() << std::endl;
+
+}
+
+void LfpTrigAvgCanvas::beginAnimation()
+{
+    std::cout << "Beginning animation." << std::endl;
+
+    displayBufferSize = displayBuffer->getNumSamples();
+
+    screenBufferIndex = 0;
+
+    startCallbacks();
+}
+
+void LfpTrigAvgCanvas::endAnimation()
+{
+    std::cout << "Ending animation." << std::endl;
+
+    stopCallbacks();
+}
+
+void LfpTrigAvgCanvas::update()
+{
+    nChans = jmax(processor->getNumInputs(),1);
+    sampleRate = processor->getSampleRate();
+
+    std::cout << "Setting num inputs on LfpTrigAvgCanvas to " << nChans << std::endl;
+
+    refreshScreenBuffer();
+
+    display->setNumChannels(nChans);
+
+    // update channel names
+    for (int i = 0; i < processor->getNumInputs(); i++)
+    {
+
+        String chName = processor->channels[i]->getName();
+
+        //std::cout << chName << std::endl;
+
+        display->channelInfo[i]->setName(chName);
+
+    }
+
+    display->setBounds(0,0,getWidth()-scrollBarThickness*2, display->getTotalHeight());
+
+}
+
+void LfpTrigAvgCanvas::comboBoxChanged(ComboBox* cb)
+{
+
+    if (cb == timebaseSelection)
+    {
+        timebase = timebases[cb->getSelectedId()-1].getFloatValue();
+    }
+    else if (cb == rangeSelection)
+    {
+        display->setRange(voltageRanges[cb->getSelectedId()-1].getFloatValue());
+        //std::cout << "Setting range to " << voltageRanges[cb->getSelectedId()-1].getFloatValue() << std::endl;
+    }
+    else if (cb == spreadSelection)
+    {
+        //spread = spreads[cb->getSelectedId()-1].getFloatValue();
+        display->setChannelHeight(spreads[cb->getSelectedId()-1].getIntValue());
+        //display->resized();
+        resized();
+        //std::cout << "Setting spread to " << spreads[cb->getSelectedId()-1].getFloatValue() << std::endl;
+    }
+
+    timescale->setTimebase(timebase);
+}
+
+
+
+
+int LfpTrigAvgCanvas::getChannelHeight()
+{
+    return spreads[spreadSelection->getSelectedId()-1].getIntValue();
+
+}
+
+
+void LfpTrigAvgCanvas::setParameter(int param, float val)
+{
+    // if (param == 0)
+    // {
+    //     timebase = val;
+    //     refreshScreenBuffer();
+    // }
+    // else
+    // {
+    //     displayGain = val; //* 0.0001f;
+    // }
+
+    // repaint();
+}
+
+void LfpTrigAvgCanvas::refreshState()
+{
+    // called when the component's tab becomes visible again
+    displayBufferIndex = processor->getDisplayBufferIndex();
+    screenBufferIndex = 0;
+
+}
+
+void LfpTrigAvgCanvas::refreshScreenBuffer()
+{
+
+    screenBufferIndex = 0;
+
+    screenBuffer->clear();
+
+    // int w = display->getWidth();
+    // //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl;
+
+    // for (int i = 0; i < w; i++)
+    // {
+    //  float x = float(i);
+
+    //  for (int n = 0; n < nChans; n++)
+    //  {
+    //      waves[n][i*2] = x;
+    //      waves[n][i*2+1] = 0.5f; // line in center of display
+    //  }
+    // }
+
+}
+
+void LfpTrigAvgCanvas::updateScreenBuffer()
+{
+
+
+    // copy new samples from the displayBuffer into the screenBuffer (waves)
+    int maxSamples = display->getWidth() - leftmargin;
+
+    if (screenBufferIndex >= maxSamples) // wrap around if we reached right edge before
+        screenBufferIndex = 0;
+
+    lastScreenBufferIndex = screenBufferIndex;
+
+    int index = processor->getDisplayBufferIndex();
+
+    int nSamples =  index - displayBufferIndex; // N new samples to be addeddisplayBufferIndex
+
+    if (nSamples < 0) // buffer has reset to 0
+    {
+        nSamples = (displayBufferSize - displayBufferIndex) + index;
+    }
+
+    float ratio = sampleRate * timebase / float(getWidth() - leftmargin - scrollBarThickness);
+
+    // this number is crucial: converting from samples to values (in px) for the screen buffer
+    int valuesNeeded = (int) float(nSamples) / ratio;
+
+
+    if (screenBufferIndex + valuesNeeded > maxSamples)  // crop number of samples to fit cavas width
+    {
+        valuesNeeded = maxSamples - screenBufferIndex;
+    }
+
+    float subSampleOffset = 0.0;
+
+    displayBufferIndex = displayBufferIndex % displayBufferSize; // make sure we're not overshooting
+    int nextPos = (displayBufferIndex + 1) % displayBufferSize; //  position next to displayBufferIndex in display buffer to copy from
+
+    if (valuesNeeded > 0 && valuesNeeded < 1000)
+    {
+
+        for (int i = 0; i < valuesNeeded; i++) // also fill one extra sample for line drawing interpolation to match across draws
+        {
+            float gain = 1.0;
+            float alpha = (float) subSampleOffset;
+            float invAlpha = 1.0f - alpha;
+
+            screenBuffer->clear(screenBufferIndex, 1);
+
+            for (int channel = 0; channel <= nChans; channel++) // pull one extra channel for event display
+            {
+
+                screenBuffer->addFrom(channel, // destChannel
+                                      screenBufferIndex, // destStartSample
+                                      displayBuffer->getSampleData(channel, displayBufferIndex), // source
+                                      1, // numSamples
+                                      invAlpha*gain); // gain
+
+                screenBuffer->addFrom(channel, // destChannel
+                                      screenBufferIndex, // destStartSample
+                                      displayBuffer->getSampleData(channel, nextPos), // source
+                                      1, // numSamples
+                                      alpha*gain); // gain
+
+
+            }
+
+            subSampleOffset += ratio;
+
+            while (subSampleOffset >= 1.0)
+            {
+                if (++displayBufferIndex > displayBufferSize)
+                    displayBufferIndex = 0;
+
+                nextPos = (displayBufferIndex + 1) % displayBufferSize;
+                subSampleOffset -= 1.0;
+            }
+
+            screenBufferIndex++;
+
+        }
+
+
+    }
+    else
+    {
+        //std::cout << "Skip." << std::endl;
+    }
+}
+
+float LfpTrigAvgCanvas::getXCoord(int chan, int samp)
+{
+    return samp;
+}
+
+int LfpTrigAvgCanvas::getNumChannels()
+{
+    return nChans;
+}
+
+float LfpTrigAvgCanvas::getYCoord(int chan, int samp)
+{
+    return *screenBuffer->getSampleData(chan, samp);
+}
+
+void LfpTrigAvgCanvas::paint(Graphics& g)
+{
+
+    //std::cout << "Painting" << std::endl;
+    g.setColour(Colour(0,18,43)); //background color
+    g.fillRect(0, 0, getWidth(), getHeight());
+
+    g.setGradientFill(ColourGradient(Colour(50,50,50),0,0,
+                                     Colour(25,25,25),0,30,
+                                     false));
+
+    g.fillRect(0, 0, getWidth()-scrollBarThickness, 30);
+
+    g.setColour(Colours::black);
+
+    g.drawLine(0,30,getWidth()-scrollBarThickness,30);
+
+    g.setColour(Colour(25,25,60)); // timing grid color
+
+    int w = getWidth()-scrollBarThickness-leftmargin;
+
+    for (int i = 0; i < 10; i++)
+    {
+        if (i == 5 || i == 0)
+            g.drawLine(w/10*i+leftmargin,0,w/10*i+leftmargin,getHeight()-60,3.0f);
+        else
+            g.drawLine(w/10*i+leftmargin,0,w/10*i+leftmargin,getHeight()-60,1.0f);
+    }
+
+    g.drawLine(0,getHeight()-60,getWidth(),getHeight()-60,3.0f);
+
+    g.setFont(Font("Default", 16, Font::plain));
+
+    g.setColour(Colour(100,100,100));
+
+    g.drawText("Voltage range (uV)",5,getHeight()-55,300,20,Justification::left, false);
+    g.drawText("Timebase (s)",175,getHeight()-55,300,20,Justification::left, false);
+    g.drawText("Spread (px)",345,getHeight()-55,300,20,Justification::left, false);
+
+    g.drawText("Event display",500,getHeight()-55,300,20,Justification::left, false);
+
+
+
+}
+
+void LfpTrigAvgCanvas::refresh()
+{
+    updateScreenBuffer();
+
+    display->refresh(); // redraws only the new part of the screen buffer
+
+    //getPeer()->performAnyPendingRepaintsNow();
+
+}
+
+void LfpTrigAvgCanvas::saveVisualizerParameters(XmlElement* xml)
+{
+
+    XmlElement* xmlNode = xml->createNewChildElement("LfpTrigAvgDisplay");
+
+
+    xmlNode->setAttribute("Range",rangeSelection->getSelectedId());
+    xmlNode->setAttribute("Timebase",timebaseSelection->getSelectedId());
+    xmlNode->setAttribute("Spread",spreadSelection->getSelectedId());
+
+    int eventButtonState = 0;
+
+    for (int i = 0; i < 8; i++)
+    {
+    	if (display->eventDisplayEnabled[i])
+    	{
+    		eventButtonState += (1 << i);
+    	}
+    }
+
+    xmlNode->setAttribute("EventButtonState", eventButtonState);
+
+    xmlNode->setAttribute("ScrollX",viewport->getViewPositionX());
+    xmlNode->setAttribute("ScrollY",viewport->getViewPositionY());
+}
+
+
+void LfpTrigAvgCanvas::loadVisualizerParameters(XmlElement* xml)
+{
+    forEachXmlChildElement(*xml, xmlNode)
+    {
+        if (xmlNode->hasTagName("LfpTrigAvgDisplay"))
+        {
+            rangeSelection->setSelectedId(xmlNode->getIntAttribute("Range"));
+            timebaseSelection->setSelectedId(xmlNode->getIntAttribute("Timebase"));
+            spreadSelection->setSelectedId(xmlNode->getIntAttribute("Spread"));
+
+            viewport->setViewPosition(xmlNode->getIntAttribute("ScrollX"),
+                                      xmlNode->getIntAttribute("ScrollY"));
+
+            int eventButtonState = xmlNode->getIntAttribute("eventButtonState");
+
+            for (int i = 0; i < 8; i++)
+            {
+            	display->eventDisplayEnabled[i] = (eventButtonState >> i) & 1;
+
+            	LfpTrigAvgEventInterfaces[i]->checkEnabledState();
+            }
+        }
+    }
+
+}
+
+
+// -------------------------------------------------------------
+
+LfpTrigAvgTimescale::LfpTrigAvgTimescale(LfpTrigAvgCanvas* c) : canvas(c)
+{
+
+    font = Font("Default", 16, Font::plain);
+}
+
+LfpTrigAvgTimescale::~LfpTrigAvgTimescale()
+{
+
+}
+
+void LfpTrigAvgTimescale::paint(Graphics& g)
+{
+
+
+
+    g.setFont(font);
+
+    g.setColour(Colour(100,100,100));
+
+    g.drawText("ms:",5,0,100,getHeight(),Justification::left, false);
+
+    for (int i = 1; i < 10; i++)
+    {
+        if (i == 5)
+            g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),3.0f);
+        else
+            g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),1.0f);
+
+        g.drawText(labels[i-1],getWidth()/10*i+3,0,100,getHeight(),Justification::left, false);
+    }
+
+}
+
+void LfpTrigAvgTimescale::setTimebase(float t)
+{
+    timebase = t;
+
+    labels.clear();
+
+    for (float i = 1.0f; i < 10.0; i++)
+    {
+        String labelString = String(timebase/10.0f*1000.0f*i);
+
+        labels.add(labelString.substring(0,4));
+    }
+
+    repaint();
+
+}
+
+
+// ---------------------------------------------------------------
+
+LfpTrigAvgDisplay::LfpTrigAvgDisplay(LfpTrigAvgCanvas* c, Viewport* v) :
+    canvas(c), viewport(v), range(1000.0f)
+{
+
+    totalHeight = 0;
+
+    addMouseListener(this, true);
+
+    // hue cycle
+    //for (int i = 0; i < 15; i++)
+    //{
+    //    channelColours.add(Colour(float(sin((3.14/2)*(float(i)/15))),float(1.0),float(1),float(1.0)));
+    //}
+
+    //hand-built palette
+    channelColours.add(Colour(224,185,36));
+    channelColours.add(Colour(214,210,182));
+    channelColours.add(Colour(243,119,33));
+    channelColours.add(Colour(186,157,168));
+    channelColours.add(Colour(237,37,36));
+    channelColours.add(Colour(179,122,79));
+    channelColours.add(Colour(217,46,171));
+    channelColours.add(Colour(217, 139,196));
+    channelColours.add(Colour(101,31,255));
+    channelColours.add(Colour(141,111,181));
+    channelColours.add(Colour(48,117,255));
+    channelColours.add(Colour(184,198,224));
+    channelColours.add(Colour(116,227,156));
+    channelColours.add(Colour(150,158,155));
+    channelColours.add(Colour(82,173,0));
+    channelColours.add(Colour(125,99,32));
+
+}
+
+LfpTrigAvgDisplay::~LfpTrigAvgDisplay()
+{
+    deleteAllChildren();
+}
+
+
+int LfpTrigAvgDisplay::getNumChannels()
+{
+    return numChans;
+}
+
+void LfpTrigAvgDisplay::setNumChannels(int numChannels)
+{
+    numChans = numChannels;
+
+    deleteAllChildren();
+
+    channels.clear();
+    channelInfo.clear();
+
+    totalHeight = 0;
+
+    for (int i = 0; i < numChans; i++)
+    {
+
+        //std::cout << "Adding new channel display." << std::endl;
+
+        LfpTrigAvgChannelDisplay* lfpChan = new LfpTrigAvgChannelDisplay(canvas, this, i);
+
+        lfpChan->setColour(channelColours[i % channelColours.size()]);
+        lfpChan->setRange(range);
+        lfpChan->setChannelHeight(canvas->getChannelHeight());
+
+        addAndMakeVisible(lfpChan);
+
+        channels.add(lfpChan);
+
+        LfpTrigAvgChannelDisplayInfo* lfpInfo = new LfpTrigAvgChannelDisplayInfo(canvas, this, i);
+
+        lfpInfo->setColour(channelColours[i % channelColours.size()]);
+        lfpInfo->setRange(range);
+        lfpInfo->setChannelHeight(canvas->getChannelHeight());
+
+        addAndMakeVisible(lfpInfo);
+
+        channelInfo.add(lfpInfo);
+
+        totalHeight += lfpChan->getChannelHeight();
+
+    }
+
+}
+
+int LfpTrigAvgDisplay::getTotalHeight()
+{
+    return totalHeight;
+}
+
+void LfpTrigAvgDisplay::resized()
+{
+
+    int totalHeight = 0;
+
+    for (int i = 0; i < channels.size(); i++)
+    {
+
+        LfpTrigAvgChannelDisplay* disp = channels[i];
+
+        disp->setBounds(canvas->leftmargin,
+                        totalHeight-disp->getChannelOverlap()/2,
+                        getWidth(),
+                        disp->getChannelHeight()+disp->getChannelOverlap());
+
+        LfpTrigAvgChannelDisplayInfo* info = channelInfo[i];
+
+        info->setBounds(0,
+                        totalHeight-disp->getChannelOverlap()/2,
+                        canvas->leftmargin,
+                        disp->getChannelHeight()+disp->getChannelOverlap());
+
+        totalHeight += disp->getChannelHeight();
+
+    }
+
+    canvas->fullredraw = true; //issue full redraw
+
+    // std::cout << "Total height: " << totalHeight << std::endl;
+
+}
+
+void LfpTrigAvgDisplay::paint(Graphics& g)
+{
+
+}
+
+void LfpTrigAvgDisplay::refresh()
+{
+
+
+    int topBorder = viewport->getViewPositionY();
+    int bottomBorder = viewport->getViewHeight() + topBorder;
+
+    // ensure that only visible channels are redrawn
+    for (int i = 0; i < numChans; i++)
+    {
+
+        int componentTop = channels[i]->getY();
+        int componentBottom = channels[i]->getHeight() + componentTop;
+
+        if ((topBorder <= componentBottom && bottomBorder >= componentTop))
+        {
+            if (canvas->fullredraw)
+            {
+                channels[i]->fullredraw = true;
+                channels[i]->repaint();
+                channelInfo[i]->repaint();
+
+            }
+            else
+            {
+                channels[i]->repaint(canvas->lastScreenBufferIndex-2, 0, (canvas->screenBufferIndex-canvas->lastScreenBufferIndex)+3, getChildComponent(i)->getHeight());  //repaint only the updated portion
+                // we redraw from -2 to +1 relative to the real redraw window, the -2 makes sure that the lines join nicely, and the +1 draws the vertical update line
+            }
+            //std::cout << i << std::endl;
+        }
+
+    }
+
+    canvas->fullredraw = false;
+}
+
+void LfpTrigAvgDisplay::setRange(float r)
+{
+    range = r;
+
+    for (int i = 0; i < numChans; i++)
+    {
+        channels[i]->setRange(range);
+    }
+}
+
+int LfpTrigAvgDisplay::getRange()
+{
+    return channels[0]->getRange();
+}
+
+
+void LfpTrigAvgDisplay::setChannelHeight(int r)
+{
+
+    for (int i = 0; i < numChans; i++)
+    {
+        channels[i]->setChannelHeight(r);
+        channelInfo[i]->setChannelHeight(r);
+    }
+
+    resized();
+
+}
+
+int LfpTrigAvgDisplay::getChannelHeight()
+{
+    return channels[0]->getChannelHeight();
+}
+
+
+
+void LfpTrigAvgDisplay::mouseWheelMove(const MouseEvent&  e, const MouseWheelDetails&   wheel)
+{
+
+    //std::cout << "Mouse wheel " <<  e.mods.isCommandDown() << "  " << wheel.deltaY << std::endl;
+
+    if (e.mods.isCommandDown())  // CTRL + scroll wheel -> change channel spacing
+    {
+        //
+        // this should also scroll to keep the selected channel at a constant y!
+        //
+        int h = getChannelHeight();
+        if (wheel.deltaY>0)
+        {
+            setChannelHeight(h+1);
+        }
+        else
+        {
+            if (h>5)
+                setChannelHeight(h-1);
+        }
+    }
+    else
+    {
+        if (e.mods.isShiftDown())  // SHIFT + scroll wheel -> change channel range
+        {
+            int h= getRange();
+            if (wheel.deltaY>0)
+            {
+                setRange(h+10);
+            }
+            else
+            {
+                if (h>11)
+                    setRange(h-10);
+            }
+
+        }
+        else    // just scroll
+        {
+            //  passes the event up to the viewport so the screen scrolls
+            if (viewport != nullptr && e.eventComponent == this) // passes only if it's not a listening event
+                viewport->mouseWheelMove(e.getEventRelativeTo(canvas), wheel);
+
+        }
+    }
+
+    canvas->fullredraw = true;//issue full redraw
+
+    refresh();
+
+}
+
+
+void LfpTrigAvgDisplay::mouseDown(const MouseEvent& event)
+{
+    //int y = event.getMouseDownY(); //relative to each channel pos
+    MouseEvent canvasevent = event.getEventRelativeTo(viewport);
+    int y = canvasevent.getMouseDownY() + viewport->getViewPositionY(); // need to account for scrolling
+
+    int dist=0;
+    int mindist=10000;
+    int closest=5;
+    for (int n = 0; n < numChans; n++) // select closest instead of relying ot eventComponent
+    {
+        channels[n]->deselect();
+
+        int cpos=(channels[n]->getY() + (channels[n]->getHeight()/2));
+        dist=int(abs(y - cpos));
+
+        //std::cout << "Mouse down at " << y << " pos is "<< cpos << "n:" << n << "  dist " << dist << std::endl;
+
+        if (dist<mindist)
+        {
+            mindist=dist-1;
+            closest=n;
+        }
+    }
+
+    //LfpTrigAvgChannelDisplay* lcd = (LfpTrigAvgChannelDisplay*) event.eventComponent;
+    //lcd->select();
+
+    channels[closest]->select();
+
+    canvas->fullredraw = true;//issue full redraw
+
+    refresh();
+
+}
+
+
+bool LfpTrigAvgDisplay::setEventDisplayState(int ch, bool state)
+{
+    eventDisplayEnabled[ch] = state;
+    return eventDisplayEnabled[ch];
+}
+
+
+bool LfpTrigAvgDisplay::getEventDisplayState(int ch)
+{
+    return eventDisplayEnabled[ch];
+}
+
+
+// ------------------------------------------------------------------
+
+LfpTrigAvgChannelDisplay::LfpTrigAvgChannelDisplay(LfpTrigAvgCanvas* c, LfpTrigAvgDisplay* d, int channelNumber) :
+    canvas(c), display(d), isSelected(false), chan(channelNumber), channelHeight(40), channelOverlap(300), range(1000.0f)
+{
+
+
+    name = String(channelNumber+1); // default is to make the channelNumber the name
+
+
+    channelHeightFloat = (float) channelHeight;
+
+    channelFont = Font("Default", channelHeight*0.6, Font::plain);
+
+    lineColour = Colour(255,255,255);
+
+}
+
+LfpTrigAvgChannelDisplay::~LfpTrigAvgChannelDisplay()
+{
+
+}
+
+void LfpTrigAvgChannelDisplay::paint(Graphics& g)
+{
+
+    //g.fillAll(Colours::grey);
+
+    g.setColour(Colours::yellow);   // draw most recent drawn sample position
+    g.drawLine(canvas->screenBufferIndex+1, 0, canvas->screenBufferIndex+1, getHeight());
+
+
+
+
+    //g.setColour(Colours::red); // draw oldest drawn sample position
+    //g.drawLine(canvas->lastScreenBufferIndex, 0, canvas->lastScreenBufferIndex, getHeight()-channelOverlap);
+
+    int center = getHeight()/2;
+
+    if (isSelected)
+    {
+
+        g.setColour(Colours::lightgrey);
+        g.fillRect(0,center-channelHeight/2,10,channelHeight);
+        g.drawLine(0,center+channelHeight/2,getWidth(),center+channelHeight/2);
+        g.drawLine(0,center-channelHeight/2,getWidth(),center-channelHeight/2);
+
+        g.setColour(Colour(25,25,25));
+        g.drawLine(0,center+channelHeight/4,10,center+channelHeight/4);
+        g.drawLine(0,center-channelHeight/4,10,center-channelHeight/4);
+
+    }
+
+
+    g.setColour(Colour(40,40,40));
+    g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
+
+    int stepSize = 1;
+    int from = 0; // for vertical line drawing in the LFP data
+    int to = 0;
+
+    //for (int i = 0; i < getWidth()-stepSize; i += stepSize) // redraw entire display
+    int ifrom = canvas->lastScreenBufferIndex - 3; // need to start drawing a bit before the actual redraw windowfor the interpolated line to join correctly
+
+    if (ifrom < 0)
+        ifrom = 0;
+
+    int ito = canvas->screenBufferIndex - 1;
+
+    if (fullredraw)
+    {
+        ifrom = 0; //canvas->leftmargin;
+        ito = getWidth()-stepSize;
+        fullredraw = false;
+    }
+
+    for (int i = ifrom; i < ito ; i += stepSize) // redraw only changed portion
+    {
+
+        // draw event markers
+        int rawEventState = canvas->getYCoord(canvas->getNumChannels(), i);// get last channel+1 in buffer (represents events)
+        for (int ev_ch = 0; ev_ch < 8 ; ev_ch++) // for all event channels
+        {
+            if (display->getEventDisplayState(ev_ch))  // check if plotting for this channel is enabled
+            {
+                if (rawEventState & (1 << ev_ch))    // events are  representet by a bit code, so we have to extract the individual bits with a mask
+                {
+                    g.setColour(display->channelColours[ev_ch*2]); // get color from lfp color scheme
+                    g.setOpacity(0.35f);
+                    g.drawLine(i, center-channelHeight/2 , i, center+channelHeight/2);
+                }
+            }
+        }
+
+        //std::cout << "e " << canvas->getYCoord(canvas->getNumChannels()-1, i) << std::endl;
+
+        g.setColour(lineColour);
+        g.setOpacity(1);
+
+        // drawLine makes for ok anti-aliased plots, but is pretty slow
+        g.drawLine(i,
+                   (canvas->getYCoord(chan, i)/range*channelHeightFloat)+getHeight()/2,
+                   i+stepSize,
+                   (canvas->getYCoord(chan, i+stepSize)/range*channelHeightFloat)+getHeight()/2);
+
+        if (false) // switched back to line drawing now that we only draw partial updates
+        {
+
+            // // pixel wise line plot has no anti-aliasing, but runs much faster
+            double a = (canvas->getYCoord(chan, i)/range*channelHeightFloat)+getHeight()/2;
+            double b = (canvas->getYCoord(chan, i+stepSize)/range*channelHeightFloat)+getHeight()/2;
+
+            if (a<b)
+            {
+                from = (a);
+                to = (b);
+            }
+            else
+            {
+                from = (b);
+                to = (a);
+            }
+
+            if ((to-from) < 40)  // if there is too much vertical range in one pixel, don't draw the full line for speed reasons
+            {
+                for (int j = from; j <= to; j += 1)
+                {
+                    g.setPixel(i,j);
+                }
+            }
+            else if ((to-from) < 100)
+            {
+                for (int j = from; j <= to; j += 2)
+                {
+                    g.setPixel(i,j);
+                }
+            }
+            else
+            {
+                g.setPixel(i,to);
+                g.setPixel(i,from);
+            }
+
+        }
+
+    }
+
+    // g.setColour(lineColour.withAlpha(0.7f)); // alpha on seems to decrease draw speed
+    // g.setFont(channelFont);
+    //  g.setFont(channelHeightFloat*0.6);
+
+    // g.drawText(String(chan+1), 10, center-channelHeight/2, 200, channelHeight, Justification::left, false);
+
+
+}
+
+
+
+
+
+
+void LfpTrigAvgChannelDisplay::setRange(float r)
+{
+    range = r;
+
+    //std::cout << "Range: " << r << std::endl;
+}
+
+int LfpTrigAvgChannelDisplay::getRange()
+{
+    return range;
+}
+
+
+void LfpTrigAvgChannelDisplay::select()
+{
+    isSelected = true;
+}
+
+void LfpTrigAvgChannelDisplay::deselect()
+{
+    isSelected = false;
+}
+
+void LfpTrigAvgChannelDisplay::setColour(Colour c)
+{
+    lineColour = c;
+}
+
+
+void LfpTrigAvgChannelDisplay::setChannelHeight(int c)
+{
+    channelHeight = c;
+    channelHeightFloat = (float) channelHeight;
+    //channelOverlap = channelHeight / 2; //clips data too early,
+    channelOverlap = channelHeight *5;
+}
+
+int LfpTrigAvgChannelDisplay::getChannelHeight()
+{
+
+    return channelHeight;
+}
+
+void LfpTrigAvgChannelDisplay::setChannelOverlap(int overlap)
+{
+    channelOverlap = overlap;
+}
+
+
+int LfpTrigAvgChannelDisplay::getChannelOverlap()
+{
+    return channelOverlap;
+}
+
+void LfpTrigAvgChannelDisplay::setName(String name_)
+{
+    name = name_;
+}
+
+// -------------------------------
+
+LfpTrigAvgChannelDisplayInfo::LfpTrigAvgChannelDisplayInfo(LfpTrigAvgCanvas* canvas_, LfpTrigAvgDisplay* display_, int ch)
+    : LfpTrigAvgChannelDisplay(canvas_, display_, ch)
+{
+
+}
+
+void LfpTrigAvgChannelDisplayInfo::paint(Graphics& g)
+{
+
+
+    int center = getHeight()/2;
+
+    g.setColour(lineColour);
+
+    g.setFont(channelFont);
+    g.setFont(channelHeightFloat*0.3);
+
+    g.drawText(name, 10, center-channelHeight/2, 200, channelHeight, Justification::left, false);
+
+}
+
+
+
+// Event display Options --------------------------------------------------------------------
+
+LfpTrigAvgEventInterface::LfpTrigAvgEventInterface(LfpTrigAvgDisplay* display_, LfpTrigAvgCanvas* canvas_, int chNum):
+    isEnabled(true), display(display_), canvas(canvas_)
+{
+
+    channelNumber = chNum;
+
+    chButton = new UtilityButton(String(channelNumber+1), Font("Small Text", 13, Font::plain));
+    chButton->setRadius(5.0f);
+    chButton->setBounds(4,4,14,14);
+    chButton->setEnabledState(true);
+    chButton->setCorners(true, false, true, false);
+    //chButton.color = display->channelColours[channelNumber*2];
+    chButton->addListener(this);
+    addAndMakeVisible(chButton);
+
+
+    checkEnabledState();
+
+}
+
+LfpTrigAvgEventInterface::~LfpTrigAvgEventInterface()
+{
+
+}
+
+void LfpTrigAvgEventInterface::checkEnabledState()
+{
+    isEnabled = display->getEventDisplayState(channelNumber);
+
+    //repaint();
+}
+
+void LfpTrigAvgEventInterface::buttonClicked(Button* button)
+{
+    checkEnabledState();
+    if (isEnabled)
+    {
+        display->setEventDisplayState(channelNumber, false);
+    }
+    else
+    {
+        display->setEventDisplayState(channelNumber, true);
+    }
+
+    repaint();
+
+}
+
+
+void LfpTrigAvgEventInterface::paint(Graphics& g)
+{
+
+    checkEnabledState();
+
+    if (isEnabled)
+    {
+        g.setColour(display->channelColours[channelNumber*2]);
+        g.fillRoundedRectangle(2,2,18,18,5.0f);
+    }
+
+
+    //g.drawText(String(channelNumber), 8, 2, 200, 15, Justification::left, false);
+
+}
diff --git a/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h
new file mode 100755
index 0000000000000000000000000000000000000000..982a6cf98e2d0588d17402d19e2ddb1d9b8d152a
--- /dev/null
+++ b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h
@@ -0,0 +1,294 @@
+/*
+    ------------------------------------------------------------------
+
+    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 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 __LFPTRIGAVGCAVCAS_H_B711873A__
+#define __LFPTRIGAVGCAVCAS_H_B711873A__
+
+#include "../../../JuceLibraryCode/JuceHeader.h"
+#include "../LfpTriggeredAverageNode.h"
+#include "Visualizer.h"
+
+class LfpTrigAvgNode;
+
+class LfpTrigAvgTimescale;
+class LfpTrigAvgDisplay;
+class LfpTrigAvgChannelDisplay;
+class LfpTrigAvgChannelDisplayInfo;
+class LfpTrigAvgEventInterface;
+
+/**
+
+  Displays multiple channels of continuous data.
+
+  @see LfpTrigAvgNode, LfpTrigAvgDisplayEditor
+
+*/
+
+class LfpTrigAvgCanvas : public Visualizer,
+    public ComboBox::Listener
+
+{
+public:
+    LfpTrigAvgCanvas(LfpTrigAvgNode* n);
+    ~LfpTrigAvgCanvas();
+
+    void beginAnimation();
+    void endAnimation();
+
+    void refreshState();
+
+    void update();
+
+    void setParameter(int, float);
+    void setParameter(int, int, int, float) {}
+
+    void paint(Graphics& g);
+
+    void refresh();
+
+    void resized();
+
+    int getChannelHeight();
+
+    int getNumChannels();
+
+    float getXCoord(int chan, int samp);
+    float getYCoord(int chan, int samp);
+
+    int screenBufferIndex;
+    int lastScreenBufferIndex;
+
+    void comboBoxChanged(ComboBox* cb);
+
+    void saveVisualizerParameters(XmlElement* xml);
+
+    void loadVisualizerParameters(XmlElement* xml);
+
+    //void scrollBarMoved(ScrollBar *scrollBarThatHasMoved, double newRangeStart);
+
+    bool fullredraw; // used to indicate that a full redraw is required. is set false after each full redraw, there is a similar switch for ach ch display;
+    static const int leftmargin=50; // left margin for lfp plots (so the ch number text doesnt overlap)
+
+private:
+
+    float sampleRate;
+    float timebase;
+    float displayGain;
+    float timeOffset;
+    //int spread ; // vertical spacing between channels
+
+    static const int MAX_N_CHAN = 256;  // maximum number of channels
+    static const int MAX_N_SAMP = 5000; // maximum display size in pixels
+    //float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample
+
+    LfpTrigAvgNode* processor;
+    AudioSampleBuffer* displayBuffer;
+    AudioSampleBuffer* screenBuffer;
+    MidiBuffer* eventBuffer;
+
+    ScopedPointer<LfpTrigAvgTimescale> timescale;
+    ScopedPointer<LfpTrigAvgDisplay> display;
+    ScopedPointer<Viewport> viewport;
+
+    ScopedPointer<ComboBox> timebaseSelection;
+    ScopedPointer<ComboBox> rangeSelection;
+    ScopedPointer<ComboBox> spreadSelection;
+
+    StringArray voltageRanges;
+    StringArray timebases;
+    StringArray spreads; // option for vertical spacing between channels
+
+    OwnedArray<LfpTrigAvgEventInterface> LfpTrigAvgEventInterfaces;
+
+    void refreshScreenBuffer();
+    void updateScreenBuffer();
+
+    int displayBufferIndex;
+    int displayBufferSize;
+
+    int scrollBarThickness;
+
+    int nChans;
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgCanvas);
+
+};
+
+class LfpTrigAvgTimescale : public Component
+{
+public:
+    LfpTrigAvgTimescale(LfpTrigAvgCanvas*);
+    ~LfpTrigAvgTimescale();
+
+    void paint(Graphics& g);
+
+    void setTimebase(float t);
+
+private:
+
+    LfpTrigAvgCanvas* canvas;
+
+    float timebase;
+
+    Font font;
+
+    StringArray labels;
+
+};
+
+class LfpTrigAvgDisplay : public Component
+{
+public:
+    LfpTrigAvgDisplay(LfpTrigAvgCanvas*, Viewport*);
+    ~LfpTrigAvgDisplay();
+
+    void setNumChannels(int numChannels);
+    int getNumChannels();
+
+    int getTotalHeight();
+
+    void paint(Graphics& g);
+
+    void refresh();
+
+    void resized();
+
+    void mouseDown(const MouseEvent& event);
+    void mouseWheelMove(const MouseEvent&  event, const MouseWheelDetails&   wheel) ;
+
+
+    void setRange(float range);
+    int getRange();
+
+    void setChannelHeight(int r);
+    int getChannelHeight();
+
+
+    bool setEventDisplayState(int ch, bool state);
+    bool getEventDisplayState(int ch);
+
+
+    Array<Colour> channelColours;
+
+    Array<LfpTrigAvgChannelDisplay*> channels;
+    Array<LfpTrigAvgChannelDisplayInfo*> channelInfo;
+
+    bool eventDisplayEnabled[8];
+
+private:
+    int numChans;
+
+    int totalHeight;
+
+    LfpTrigAvgCanvas* canvas;
+    Viewport* viewport;    
+
+    float range;
+
+};
+
+class LfpTrigAvgChannelDisplay : public Component
+{
+public:
+    LfpTrigAvgChannelDisplay(LfpTrigAvgCanvas*, LfpTrigAvgDisplay*, int channelNumber);
+    ~LfpTrigAvgChannelDisplay();
+
+    void paint(Graphics& g);
+
+    void select();
+    void deselect();
+
+    void setName(String);
+
+    void setColour(Colour c);
+
+    void setChannelHeight(int);
+    int getChannelHeight();
+
+    void setChannelOverlap(int);
+    int getChannelOverlap();
+
+    void setRange(float range);
+    int getRange();
+
+    bool fullredraw; // used to indicate that a full redraw is required. is set false after each full redraw
+
+protected:
+
+    LfpTrigAvgCanvas* canvas;
+    LfpTrigAvgDisplay* display;
+
+    bool isSelected;
+
+    int chan;
+
+    String name;
+
+    Font channelFont;
+
+    Colour lineColour;
+
+    int channelOverlap;
+    int channelHeight;
+    float channelHeightFloat;
+
+    float range;
+
+};
+
+class LfpTrigAvgChannelDisplayInfo : public LfpTrigAvgChannelDisplay
+{
+public:
+    LfpTrigAvgChannelDisplayInfo(LfpTrigAvgCanvas*, LfpTrigAvgDisplay*, int channelNumber);
+
+    void paint(Graphics& g);
+
+};
+
+class LfpTrigAvgEventInterface : public Component,
+    public Button::Listener
+{
+public:
+    LfpTrigAvgEventInterface(LfpTrigAvgDisplay*, LfpTrigAvgCanvas*, int chNum);
+    ~LfpTrigAvgEventInterface();
+
+    void paint(Graphics& g);
+
+    void buttonClicked(Button* button);
+
+    void checkEnabledState();
+
+    bool isEnabled;
+
+private:
+
+    int channelNumber;
+
+    LfpTrigAvgDisplay* display;
+    LfpTrigAvgCanvas* canvas;
+
+    ScopedPointer<UtilityButton> chButton;
+
+};
+
+
+#endif  // __LFPTRIGAVGCAVCAS_H_B711873A__
diff --git a/Source/UI/ProcessorList.cpp b/Source/UI/ProcessorList.cpp
index 2b0986e5929b5c03e059c447ccf66f7f9890dea2..e6dcb7d97fb1c7277e64b1036859d8ba8c4500ca 100755
--- a/Source/UI/ProcessorList.cpp
+++ b/Source/UI/ProcessorList.cpp
@@ -69,6 +69,7 @@ ProcessorList::ProcessorList()
 
     ProcessorListItem* sinks = new ProcessorListItem("Sinks");
     sinks->addSubItem(new ProcessorListItem("LFP Viewer"));
+    //sinks->addSubItem(new ProcessorListItem("LFP Trig. Avg."));
     sinks->addSubItem(new ProcessorListItem("Spike Viewer"));
     //sinks->addSubItem(new ProcessorListItem("WiFi Output"));
     //sinks->addSubItem(new ProcessorListItem("Arduino Output"));
diff --git a/open-ephys.jucer b/open-ephys.jucer
index fd93835c60aa5d598a83af886f18a286325ffe30..23a132f80f6d14e34c4ca66e47f738dfde556c78 100644
--- a/open-ephys.jucer
+++ b/open-ephys.jucer
@@ -230,6 +230,10 @@
               file="Source/Audio/AudioComponent.h"/>
       </GROUP>
       <GROUP id="yQmqZWk" name="Processors">
+        <FILE id="MPPLs5" name="LfpTriggeredAverageNode.cpp" compile="1" resource="0"
+              file="Source/Processors/LfpTriggeredAverageNode.cpp"/>
+        <FILE id="SKve8N" name="LfpTriggeredAverageNode.h" compile="0" resource="0"
+              file="Source/Processors/LfpTriggeredAverageNode.h"/>
         <FILE id="M6nCIs" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader.cpp"/>
         <FILE id="VU1bQ0" name="FileReader.h" compile="0" resource="0" file="Source/Processors/FileReader.h"/>
         <FILE id="e7QoyI" name="ChannelMappingNode.cpp" compile="1" resource="0"
@@ -296,6 +300,10 @@
           <FILE id="DXYynnz" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Utilities/Splitter.h"/>
         </GROUP>
         <GROUP id="W4eqkOy" name="Visualization">
+          <FILE id="hQVEUi" name="LfpTriggeredAverageCanvas.cpp" compile="1"
+                resource="0" file="Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp"/>
+          <FILE id="zbsYsH" name="LfpTriggeredAverageCanvas.h" compile="0" resource="0"
+                file="Source/Processors/Visualization/LfpTriggeredAverageCanvas.h"/>
           <FILE id="ajAJi" name="SpikeObject.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.cpp"/>
           <FILE id="xqF5zL" name="SpikeObject.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/>
           <FILE id="jGEqDp" name="SpikeDisplayCanvas.cpp" compile="1" resource="0"
@@ -322,6 +330,10 @@
         <FILE id="hGnGAjh" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode.cpp"/>
         <FILE id="dUtRN6" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode.h"/>
         <GROUP id="AqvwO6w" name="Editors">
+          <FILE id="CfwbqI" name="LfpTriggeredAverageEditor.cpp" compile="1"
+                resource="0" file="Source/Processors/Editors/LfpTriggeredAverageEditor.cpp"/>
+          <FILE id="hQoogh" name="LfpTriggeredAverageEditor.h" compile="0" resource="0"
+                file="Source/Processors/Editors/LfpTriggeredAverageEditor.h"/>
           <FILE id="g1ki17" name="ChannelMappingEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Editors/ChannelMappingEditor.cpp"/>
           <FILE id="KLhI0Q" name="ChannelMappingEditor.h" compile="0" resource="0"