diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index ade31750e62655e49440e6decbdb79c491ae136a..fed02a124cf915eb93054787d945aae751d76c86 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -73,6 +73,7 @@ OBJECTS := \
   $(OBJDIR)/SpikeDetector_300d85e7.o \
   $(OBJDIR)/AudioNode_94606ff3.o \
   $(OBJDIR)/EventNode_95c842b7.o \
+  $(OBJDIR)/VisualizerEditor_3672b003.o \
   $(OBJDIR)/MergerEditor_d1fcc0df.o \
   $(OBJDIR)/ImageIcon_c89b23a6.o \
   $(OBJDIR)/WiFiOutputEditor_1d3ba5bb.o \
@@ -283,6 +284,11 @@ $(OBJDIR)/EventNode_95c842b7.o: ../../Source/Processors/EventNode.cpp
 	@echo "Compiling EventNode.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/VisualizerEditor_3672b003.o: ../../Source/Processors/Editors/VisualizerEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling VisualizerEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/MergerEditor_d1fcc0df.o: ../../Source/Processors/Editors/MergerEditor.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling MergerEditor.cpp"
diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
index cc8e44707063c1fe600def6b1003e6ad1f36c2a1..ee69144acc43aad435966f07e4be818c9e6e6d77 100644
--- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
@@ -47,6 +47,7 @@
 		4BE0DDA01B73223EF0BD934A = { isa = PBXBuildFile; fileRef = 3DD0741FCFBC7563EC722D9B; };
 		08B501E0D7764C6B613AF529 = { isa = PBXBuildFile; fileRef = B7750B27E4F3748ECCCCF69D; };
 		9CBA3837CC8CAA03A03F2D9C = { isa = PBXBuildFile; fileRef = FA57CE4F63FF1592D6B3F9B5; };
+		F4CEF74DDCD7EFA0891249B5 = { isa = PBXBuildFile; fileRef = 9A3976537C96B39716B5312D; };
 		93A3E6284F2DAED3F491332B = { isa = PBXBuildFile; fileRef = AD73EA6B24378294003DC2D0; };
 		CB77C89226102EF30F85E3EC = { isa = PBXBuildFile; fileRef = 544DA1EF90EBBDB6FF2DE0A5; };
 		A126280FF39A61DEFD3ABFE5 = { isa = PBXBuildFile; fileRef = 2B11714BCE362D4EA7E377F5; };
@@ -187,6 +188,7 @@
 		7977CAB4A151C41F4140FE1A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Merger.h; path = ../../Source/Processors/Utilities/Merger.h; sourceTree = SOURCE_ROOT; };
 		9A47B52E5E1CD17DC9C72B53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Splitter.cpp; path = ../../Source/Processors/Utilities/Splitter.cpp; sourceTree = SOURCE_ROOT; };
 		B92E8189F69E0B926C73B654 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Splitter.h; path = ../../Source/Processors/Utilities/Splitter.h; sourceTree = SOURCE_ROOT; };
+		9ACFB6A181D09434268CE006 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Visualizer.h; path = ../../Source/Processors/Visualization/Visualizer.h; sourceTree = SOURCE_ROOT; };
 		ED179D5A10DD051DDB3ECB8B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataWindow.cpp; path = ../../Source/Processors/Visualization/DataWindow.cpp; sourceTree = SOURCE_ROOT; };
 		63C18F4066C75D3C312877D8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataWindow.h; path = ../../Source/Processors/Visualization/DataWindow.h; sourceTree = SOURCE_ROOT; };
 		2E96DA81EE37A0ECE471A928 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/LfpDisplayCanvas.cpp; sourceTree = SOURCE_ROOT; };
@@ -199,6 +201,8 @@
 		12866D44BE115E8837468F48 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioNode.h; path = ../../Source/Processors/AudioNode.h; sourceTree = SOURCE_ROOT; };
 		FA57CE4F63FF1592D6B3F9B5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNode.cpp; path = ../../Source/Processors/EventNode.cpp; sourceTree = SOURCE_ROOT; };
 		32163C956C8A6F5C1DD7FE7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNode.h; path = ../../Source/Processors/EventNode.h; sourceTree = SOURCE_ROOT; };
+		9A3976537C96B39716B5312D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = VisualizerEditor.cpp; path = ../../Source/Processors/Editors/VisualizerEditor.cpp; sourceTree = SOURCE_ROOT; };
+		C546D55EDE65ADDD95C6A6F5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VisualizerEditor.h; path = ../../Source/Processors/Editors/VisualizerEditor.h; sourceTree = SOURCE_ROOT; };
 		AD73EA6B24378294003DC2D0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MergerEditor.cpp; path = ../../Source/Processors/Editors/MergerEditor.cpp; sourceTree = SOURCE_ROOT; };
 		B7FD86B9DA02771D3519FAA0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MergerEditor.h; path = ../../Source/Processors/Editors/MergerEditor.h; sourceTree = SOURCE_ROOT; };
 		544DA1EF90EBBDB6FF2DE0A5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ImageIcon.cpp; path = ../../Source/Processors/Editors/ImageIcon.cpp; sourceTree = SOURCE_ROOT; };
@@ -376,6 +380,7 @@
 				9A47B52E5E1CD17DC9C72B53,
 				B92E8189F69E0B926C73B654 ); name = Utilities; sourceTree = "<group>"; };
 		15543D7982B26B70879960F4 = { isa = PBXGroup; children = (
+				9ACFB6A181D09434268CE006,
 				ED179D5A10DD051DDB3ECB8B,
 				63C18F4066C75D3C312877D8,
 				2E96DA81EE37A0ECE471A928,
@@ -383,6 +388,8 @@
 				0C5335B0E57C9DC92FC57E5F,
 				7738F51AE0EC63D76EE0F761 ); name = Visualization; sourceTree = "<group>"; };
 		953CC35B9116404D6AA8D1C7 = { isa = PBXGroup; children = (
+				9A3976537C96B39716B5312D,
+				C546D55EDE65ADDD95C6A6F5,
 				AD73EA6B24378294003DC2D0,
 				B7FD86B9DA02771D3519FAA0,
 				544DA1EF90EBBDB6FF2DE0A5,
@@ -618,6 +625,7 @@
 				4BE0DDA01B73223EF0BD934A,
 				08B501E0D7764C6B613AF529,
 				9CBA3837CC8CAA03A03F2D9C,
+				F4CEF74DDCD7EFA0891249B5,
 				93A3E6284F2DAED3F491332B,
 				CB77C89226102EF30F85E3EC,
 				A126280FF39A61DEFD3ABFE5,
diff --git a/Source/Processors/Editors/LfpDisplayEditor.h b/Source/Processors/Editors/LfpDisplayEditor.h
index 9afc37c749ca3e7b2f3524bce3dfcb3fbe36a814..934cf40dc9f802ea9999335c620ca83a28501926 100644
--- a/Source/Processors/Editors/LfpDisplayEditor.h
+++ b/Source/Processors/Editors/LfpDisplayEditor.h
@@ -31,6 +31,7 @@
 #include "../Visualization/DataWindow.h"
 #include "../LfpDisplayNode.h"
 #include "../Visualization/LfpDisplayCanvas.h"
+#include "VisualizerEditor.h"
 
 class Visualizer;
 
diff --git a/Source/Processors/Editors/VisualizerEditor.cpp b/Source/Processors/Editors/VisualizerEditor.cpp
index 0f2ad79929e19ac1b8faea83b219edd62622c541..5af749cf2888006ac1b31aca9d5c6e6166db2a02 100644
--- a/Source/Processors/Editors/VisualizerEditor.cpp
+++ b/Source/Processors/Editors/VisualizerEditor.cpp
@@ -52,7 +52,9 @@ void SelectorButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDow
    		g.fillRect(0,0,getWidth(),3.0);
    	} else {
    		// tab icon
-   		g.drawRect(0,0,10,getHeight());
+   		g.drawVerticalLine(5,0,getHeight());
+   		g.fillRoundedRectangle(5,2,4,getHeight()-4,4.0f);
+   		g.fillRect(5,2,4,getHeight()-4);
    	}
   
 }
@@ -72,14 +74,14 @@ VisualizerEditor::VisualizerEditor (GenericProcessor* parentNode)
 
 	windowSelector = new SelectorButton("window");
 	windowSelector->addListener(this);
-	windowSelector->setBounds(190,5,15,10);
+	windowSelector->setBounds(190,7,14,10);
 
 	windowSelector->setToggleState(false,false);
 	addAndMakeVisible(windowSelector);
 
 	tabSelector = new SelectorButton("tab");
 	tabSelector->addListener(this);
-	tabSelector->setBounds(210,5,15,10);
+	tabSelector->setBounds(210,7,15,10);
 	
 	addAndMakeVisible(tabSelector);
 	tabSelector->setToggleState(false,false);
diff --git a/Source/Processors/Editors/VisualizerEditor.h b/Source/Processors/Editors/VisualizerEditor.h
index 257f0c81d633a522f5d27184c64626a81fa48dd7..f31a553faf8c98bf391777a3de45e401df764ed3 100644
--- a/Source/Processors/Editors/VisualizerEditor.h
+++ b/Source/Processors/Editors/VisualizerEditor.h
@@ -62,11 +62,14 @@ public:
 
 	virtual Visualizer* createNewCanvas() = 0;
 
-	void enable();
-	void disable();
+	virtual void enable();
+	virtual void disable();
 
 	void updateVisualizer();
 
+	ScopedPointer <DataWindow> dataWindow;
+	ScopedPointer <Visualizer> canvas;
+
 private:	
 
 	bool isPlaying;
@@ -74,9 +77,6 @@ private:
 	SelectorButton* windowSelector;
 	SelectorButton* tabSelector;
 
-	ScopedPointer <DataWindow> dataWindow;
-	ScopedPointer <Visualizer> canvas;
-
 	int tabIndex;
 
 	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VisualizerEditor);
diff --git a/Source/Processors/LfpDisplayNode.h b/Source/Processors/LfpDisplayNode.h
index 898cf978aedbacbcf6caad04ce5463fa999b95be..8fb4439cd9614e7ed5b8998cd00b6c7c3dcee0db 100644
--- a/Source/Processors/LfpDisplayNode.h
+++ b/Source/Processors/LfpDisplayNode.h
@@ -26,6 +26,7 @@
 
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include "Editors/LfpDisplayEditor.h"
+#include "Editors/VisualizerEditor.h"
 #include "GenericProcessor.h"
 
 /**
diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.h b/Source/Processors/Visualization/LfpDisplayCanvas.h
index 87a918ab383461e8d6b30e8127ac089cf9247af9..60f6b8075e829a0634941f54b5e4c81c7f2ae1c5 100644
--- a/Source/Processors/Visualization/LfpDisplayCanvas.h
+++ b/Source/Processors/Visualization/LfpDisplayCanvas.h
@@ -23,15 +23,13 @@
 #ifndef __LFPDISPLAYCANVAS_H_B711873A__
 #define __LFPDISPLAYCANVAS_H_B711873A__
 
-
 #include "../../../JuceLibraryCode/JuceHeader.h"
-#include "OpenGLCanvas.h"
-#include "../../UI/Configuration.h"
 #include "../LfpDisplayNode.h"
+#include "Visualizer.h"
 
 class LfpDisplayNode;
 
-class LfpDisplayCanvas : public OpenGLCanvas
+class LfpDisplayCanvas : public Visualizer
 
 {
 public: 
@@ -56,7 +54,6 @@ private:
 	float sampleRate;
 	float timebase;
 	float displayGain;
-	//float ratio;
 
 	LfpDisplayNode* processor;
 	AudioSampleBuffer* displayBuffer;
@@ -72,8 +69,6 @@ private:
 
 	bool checkBounds(int chan);
 
-
-
 	void updateScreenBuffer();
 	int screenBufferIndex;
 	int displayBufferIndex;
diff --git a/Source/Processors/Visualization/Visualizer.h b/Source/Processors/Visualization/Visualizer.h
index 28ca53b8f357b76a3f797e51716c5d4436c0d029..f037917ceccdbba0bd4b5524a688b54a2d158926 100644
--- a/Source/Processors/Visualization/Visualizer.h
+++ b/Source/Processors/Visualization/Visualizer.h
@@ -36,6 +36,7 @@ public:
 
 	virtual void newOpenGLContextCreated() = 0;
 	virtual void renderOpenGL() = 0;
+
 	virtual void refreshState() = 0;
 
 	virtual void update() = 0;
@@ -44,11 +45,8 @@ public:
 	virtual void beginAnimation() = 0;
 	virtual void endAnimation() = 0;
 
-private:
-
+	virtual void setParameter(int, float) = 0;
 
-	JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Visualizer);
-	
 };
 
 
diff --git a/open-ephys.jucer b/open-ephys.jucer
index 58e9e746e724640d85ae26ac05ad361384237962..78f67747a72f22c8c6a027b0607e293444fc1648 100644
--- a/open-ephys.jucer
+++ b/open-ephys.jucer
@@ -150,6 +150,7 @@
           <FILE id="DXYynnz" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Utilities/Splitter.h"/>
         </GROUP>
         <GROUP id="W4eqkOy" name="Visualization">
+          <FILE id="yDPZGpt" name="Visualizer.h" compile="0" resource="0" file="Source/Processors/Visualization/Visualizer.h"/>
           <FILE id="BX1Vj3V" name="DataWindow.cpp" compile="1" resource="0" file="Source/Processors/Visualization/DataWindow.cpp"/>
           <FILE id="l2VKLuP" name="DataWindow.h" compile="0" resource="0" file="Source/Processors/Visualization/DataWindow.h"/>
           <FILE id="2rXPco7" name="LfpDisplayCanvas.cpp" compile="1" resource="0"
@@ -169,6 +170,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="2XqqPOS" name="VisualizerEditor.cpp" compile="1" resource="0"
+                file="Source/Processors/Editors/VisualizerEditor.cpp"/>
+          <FILE id="CUHGPJF" name="VisualizerEditor.h" compile="0" resource="0"
+                file="Source/Processors/Editors/VisualizerEditor.h"/>
           <FILE id="bsIZbuu" name="MergerEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Editors/MergerEditor.cpp"/>
           <FILE id="vfmEY5L" name="MergerEditor.h" compile="0" resource="0" file="Source/Processors/Editors/MergerEditor.h"/>