diff --git a/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj b/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
index ed697f7b9bb9e8761a31cc61b35e8d675d3519ec..32f1e3b48bc5e968296cbf52d3919f0e31bbf7e2 100644
--- a/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
+++ b/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
@@ -140,6 +140,7 @@
 		0CF77ACFDAFCBE9D3666A32F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inftrees.h; path = "../../../JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h"; sourceTree = "SOURCE_ROOT"; };
 		0D4D508C638BC74943B9976D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AutoUpdater.cpp"; path = "../../Source/Application/jucer_AutoUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0D53EA2736A24AE34EC09D6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngset.c; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c"; sourceTree = "SOURCE_ROOT"; };
+		0D70B8124A5A5B3E08C14AE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "openEphys_ProcessorVisualizerCanvasTemplate.cpp"; path = "../../../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0DB0A9E30EEDDEA720BC5A03 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_StaticLibrary.svg"; path = "../../Source/BinaryData/wizard_StaticLibrary.svg"; sourceTree = "SOURCE_ROOT"; };
 		0E06FB23B05CE46487F509C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyPanel.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0E24C59E408559F9DF1DC31A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; };
@@ -448,6 +449,7 @@
 		513AF2A4DB37CC6F47E6CEF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; };
 		514B0E8E2796ACE7385F6717 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; };
 		515FF6E74826E3E3F7273621 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_Icons.h"; path = "../../Source/Utility/jucer_Icons.h"; sourceTree = "SOURCE_ROOT"; };
+		5169E5906E00B86B7E927AA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "openEphys_ProcessorVisualizerEditorPluginTemplate.h"; path = "../../../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.h"; sourceTree = "SOURCE_ROOT"; };
 		519269C6218CA35F731ECA61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; };
 		51D9906830CE2006B74DBFCC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
 		51DAFE574A52F68CC4A10274 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferedInputStream.h"; path = "../../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h"; sourceTree = "SOURCE_ROOT"; };
@@ -654,6 +656,7 @@
 		80D62B907248523E6943298B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
 		80D69EB4D88168D9AC43C308 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jidctflt.c; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c"; sourceTree = "SOURCE_ROOT"; };
 		8138A55052E9FC27284B74DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FontPropertyComponent.h"; path = "../../Source/ComponentEditor/properties/jucer_FontPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		814C715C65FB4712BBA5AEC0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "openEphys_ProcessorVisualizerEditorPluginTemplate.cpp"; path = "../../../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
 		81704510C0CA45994B69AF05 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; };
 		81A3DED7F13085DF8C8190AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; };
 		820291543BF93243B718F0EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerTreeViewBase.h"; path = "../../Source/Utility/jucer_JucerTreeViewBase.h"; sourceTree = "SOURCE_ROOT"; };
@@ -931,6 +934,7 @@
 		C4B158D37FF6B3125BEED598 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; };
 		C5424781C756A8FF3D66670D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemTrayIcon.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C5A62F48BC721FE95066FD13 = {isa = PBXFileReference; lastKnownFileType = text.txt; name = "libpng_readme.txt"; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt"; sourceTree = "SOURCE_ROOT"; };
+		C5D10F3C8EDB3F778D36439E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "openEphys_ProcessorVisualizerCanvasTemplate.h"; path = "../../../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.h"; sourceTree = "SOURCE_ROOT"; };
 		C63233C27ED46CECF10EC7C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "projucer_MessageIDs.h"; path = "../../Source/LiveBuildEngine/projucer_MessageIDs.h"; sourceTree = "SOURCE_ROOT"; };
 		C68D8C25B8BD332BA1DFB32E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LiveConstantEditor.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C695512ADA3E687DD1E55C0E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1447,6 +1451,10 @@
 					8A3E1306FF5605198E628229,
 					09207B2EED2B7CA3EF7007E5,
 					6EF5695A4541F676CAA6275E,
+					0D70B8124A5A5B3E08C14AE2,
+					C5D10F3C8EDB3F778D36439E,
+					814C715C65FB4712BBA5AEC0,
+					5169E5906E00B86B7E927AA6,
 					EB359D1C95087D5CE425B0AA,
 					55E910BC40F2F84C7BEC7441, ); name = OpenEphys; sourceTree = "<group>"; };
 		C76CE0579AC77DF56E755836 = {isa = PBXGroup; children = (
diff --git a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
index 6376b5ff7fdd284888ac57a819339e9c20c38bcb..4adad8c9735994d5acbde2b3738d2b23460f9e52 100644
--- a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
+++ b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
@@ -215,6 +215,12 @@
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.cpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.cpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
@@ -1527,6 +1533,8 @@
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorContentComponentTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorEditorPluginTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.h"/>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.h"/>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.h"/>
     <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"/>
     <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"/>
diff --git a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
index 9de0188ed367f8fda1bbee03931d51312f0146b4..6d43516fad8524302fbc53a38d193ae0bbf071cd 100644
--- a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
+++ b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
@@ -484,6 +484,12 @@
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.cpp">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.cpp">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.cpp">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.cpp">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClCompile>
@@ -2241,6 +2247,12 @@
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.h">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.h">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.h">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.h">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClInclude>
diff --git a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
index 79fd87700ded44a62918f55ff710754b68d4a336..65e6c50317ed1bcb93b2c3bfbf9aef4c0a60dd86 100644
--- a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
+++ b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
@@ -215,6 +215,12 @@
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.cpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.cpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.cpp">
       <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
@@ -1527,6 +1533,8 @@
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorContentComponentTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorEditorPluginTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.h"/>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.h"/>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.h"/>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.h"/>
     <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginEditorTemplate.h"/>
     <ClInclude Include="..\..\Source\BinaryData\jucer_AudioPluginFilterTemplate.h"/>
diff --git a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
index 3d443e27e62031b6f9dc9502e99c3610d50a7c13..c1d72c9a22a7737cbd4dfd919f679b668586006b 100644
--- a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
+++ b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
@@ -484,6 +484,12 @@
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.cpp">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.cpp">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.cpp">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.cpp">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClCompile>
@@ -2241,6 +2247,12 @@
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorPluginTemplate.h">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerCanvasTemplate.h">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_ProcessorVisualizerEditorPluginTemplate.h">
+      <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\Source\Processors\PluginManager\Templates\openEphys_RecordEnginePluginTemplate.h">
       <Filter>OpenEphys_PluginGenerator\BinaryData\templates\OpenEphys</Filter>
     </ClInclude>
diff --git a/PluginGenerator/JuceLibraryCode/BinaryData.cpp b/PluginGenerator/JuceLibraryCode/BinaryData.cpp
index cd70760e9cdbe00e00423ebf7fa73b78a4d72a07..f3601f70858d2b297200ffe362fd7f07dd8f2021 100644
--- a/PluginGenerator/JuceLibraryCode/BinaryData.cpp
+++ b/PluginGenerator/JuceLibraryCode/BinaryData.cpp
@@ -832,7 +832,7 @@ static const unsigned char temp_binary_data_8[] =
 "<JUCER_COMPONENT documentType=\"Component\" className=\"CONTENTCOMPONENTCLASSNAME\" componentName=\"\"\r\n"
 "                 parentClasses=\"public Component\" constructorParams=\"\" variableInitialisers=\"\"\r\n"
 "                 snapPixels=\"8\" snapActive=\"1\" snapShown=\"1\" overlayOpacity=\"0.330\"\r\n"
-"                 fixedSize=\"0\" initialWidth=\"150\" initialHeight=\"200\">\r\n"
+"                 fixedSize=\"1\" initialWidth=\"150\" initialHeight=\"200\">\r\n"
 "  <BACKGROUND backgroundColour=\"ffffff\"/>\r\n"
 "</JUCER_COMPONENT>\r\n"
 "\r\n"
@@ -1372,9 +1372,404 @@ static const unsigned char temp_binary_data_13[] =
 
 const char* openEphys_ProcessorPluginTemplate_h = (const char*) temp_binary_data_13;
 
-//================== openEphys_RecordEnginePluginTemplate.cpp ==================
+//================== openEphys_ProcessorVisualizerCanvasTemplate.cpp ==================
 static const unsigned char temp_binary_data_14[] =
 "/*\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This file is part of the Open Ephys GUI\n"
+"   Copyright (C) 2016 Open Ephys\n"
+"\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This program is free software: you can redistribute it and/or modify\n"
+"   it under the terms of the GNU General Public License as published by\n"
+"   the Free Software Foundation, either version 3 of the License, or\n"
+"   (at your option) any later version.\n"
+"\n"
+"   This program is distributed in the hope that it will be useful,\n"
+"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"   GNU General Public License for more details.\n"
+"\n"
+"   You should have received a copy of the GNU General Public License\n"
+"   along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+"*/\n"
+"\n"
+"#include \"EDITORCANVASCLASSNAME.h\"\n"
+"#include \"PROCESSORCLASSNAME.h\"\n"
+"\n"
+"\n"
+"EDITORCANVASCLASSNAME::EDITORCANVASCLASSNAME (PROCESSORCLASSNAME* procesor)\n"
+"{\n"
+"    // Open Ephys Plugin Generator will insert generated code for editor here. Don't edit this section.\n"
+"    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_BEGIN]\n"
+"\n"
+"    addAndMakeVisible (&content);\n"
+"\n"
+"    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_END]\n"
+"}\n"
+"\n"
+"\n"
+"EDITORCANVASCLASSNAME::~EDITORCANVASCLASSNAME()\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::resized()\n"
+"{\n"
+"    content.setBounds (getLocalBounds());\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::refreshState()\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::update()\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::refresh()\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::beginAnimation()\n"
+"{\n"
+"    startCallbacks();\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::endAnimation()\n"
+"{\n"
+"    stopCallbacks();\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::setParameter (int parameter, float newValue)\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCANVASCLASSNAME::setParameter (int parameter, int val1, int val2, float newValue)\n"
+"{\n"
+"}\n";
+
+const char* openEphys_ProcessorVisualizerCanvasTemplate_cpp = (const char*) temp_binary_data_14;
+
+//================== openEphys_ProcessorVisualizerCanvasTemplate.h ==================
+static const unsigned char temp_binary_data_15[] =
+"/*\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This file is part of the Open Ephys GUI\n"
+"   Copyright (C) 2016 Open Ephys\n"
+"\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This program is free software: you can redistribute it and/or modify\n"
+"   it under the terms of the GNU General Public License as published by\n"
+"   the Free Software Foundation, either version 3 of the License, or\n"
+"   (at your option) any later version.\n"
+"\n"
+"   This program is distributed in the hope that it will be useful,\n"
+"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"   GNU General Public License for more details.\n"
+"\n"
+"   You should have received a copy of the GNU General Public License\n"
+"   along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+"*/\n"
+"\n"
+"#ifndef HEADERGUARD\n"
+"#define HEADERGUARD\n"
+"\n"
+"#include <VisualizerEditorHeaders.h>\n"
+"\n"
+"#include \"PROCESSORCLASSNAME.h\"\n"
+"#include \"CONTENTCOMPONENTCLASSNAME.h\"\n"
+"\n"
+"/**\n"
+"    Class for displaying data in any subclasses of VisualizerEditor either in the tab or separate window.\n"
+"\n"
+"    @see Visualizer, LfpDisplayCanvas, SpikeDisplayCanvas\n"
+"*/\n"
+"class EDITORCANVASCLASSNAME : public Visualizer\n"
+"{\n"
+"public:\n"
+"    /** The class constructor, used to initialize any members. */\n"
+"    EDITORCANVASCLASSNAME (PROCESSORCLASSNAME* processor);\n"
+"\n"
+"    /** The class destructor, used to deallocate memory */\n"
+"    ~EDITORCANVASCLASSNAME();\n"
+"\n"
+"    /** Called every time when canvas is resized or moved. */\n"
+"    void resized() override;\n"
+"\n"
+"    /** Called when the component's tab becomes visible again.*/\n"
+"    void refreshState() override;\n"
+"\n"
+"    /** Called when parameters of underlying data processor are changed.*/\n"
+"    void update() override;\n"
+"\n"
+"    /** Called instead of \"repaint\" to avoid redrawing underlying components if not necessary.*/\n"
+"    void refresh() override;\n"
+"\n"
+"    /** Called when data acquisition is active.*/\n"
+"    void beginAnimation() override;\n"
+"\n"
+"    /** Called when data acquisition ends.*/\n"
+"    void endAnimation() override;\n"
+"\n"
+"    /** Called by an editor to initiate a parameter change.*/\n"
+"    void setParameter (int, float) override;\n"
+"\n"
+"    /** Called by an editor to initiate a parameter change.*/\n"
+"    void setParameter (int, int, int, float) override;\n"
+"\n"
+"private:\n"
+"    PROCESSORCLASSNAME* processor;\n"
+"\n"
+"    // This component contains all components and graphics that were added using Projucer.\n"
+"    // It's bounds initially have same bounds as the canvas itself.\n"
+"    CONTENTCOMPONENTCLASSNAME content;\n"
+"\n"
+"    // ========================================================================\n"
+"    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EDITORCANVASCLASSNAME);\n"
+"};\n"
+"\n"
+"\n"
+"#endif // HEADERGUARD\n";
+
+const char* openEphys_ProcessorVisualizerCanvasTemplate_h = (const char*) temp_binary_data_15;
+
+//================== openEphys_ProcessorVisualizerEditorPluginTemplate.cpp ==================
+static const unsigned char temp_binary_data_16[] =
+"/*\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This file is part of the Open Ephys GUI\n"
+"   Copyright (C) 2016 Open Ephys\n"
+"\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This program is free software: you can redistribute it and/or modify\n"
+"   it under the terms of the GNU General Public License as published by\n"
+"   the Free Software Foundation, either version 3 of the License, or\n"
+"   (at your option) any later version.\n"
+"\n"
+"   This program is distributed in the hope that it will be useful,\n"
+"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"   GNU General Public License for more details.\n"
+"\n"
+"   You should have received a copy of the GNU General Public License\n"
+"   along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+"*/\n"
+"\n"
+"#include \"EDITORCLASSNAME.h\"\n"
+"#include \"PROCESSORCLASSNAME.h\"\n"
+"#include \"EDITORCANVASCLASSNAME.h\"\n"
+"\n"
+"static const int EDITOR_DESIRED_WIDTH = 150;\n"
+"\n"
+"\n"
+"EDITORCLASSNAME::EDITORCLASSNAME (GenericProcessor* parentNode, bool useDefaultParameterEditors = true)\n"
+"    : GenericEditor (parentNode, useDefaultParameterEditors)\n"
+"{\n"
+"    tabText = \"PLUGINGUINAME\";\n"
+"\n"
+"    // Open Ephys Plugin Generator will insert generated code for editor here. Don't edit this section.\n"
+"    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_BEGIN]\n"
+"\n"
+"    addAndMakeVisible (&content);\n"
+"    setDesiredWidth (EDITOR_DESIRED_WIDTH);\n"
+"\n"
+"    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_END]\n"
+"\n"
+"\n"
+"    ////Most used buttons are UtilityButton, which shows a simple button with text and ElectrodeButton, which is an on-off button which displays a channel.\n"
+"    //exampleButton = new UtilityButton (\"Button text\", Font (\"Default\", 15, Font::plain));\n"
+"    //exampleButton->setBounds (10, 30, 50, 50); //Set position and size (X, Y, XSize, YSize)\n"
+"    //exampleButton->addListener (this); //Specify which class will implement the listener methods, in the case of editors, always make the editor the listener\n"
+"    //exampleButton->setClickingTogglesState (true); //True for a on-off toggleable button, false for a single-click monostable button\n"
+"    //exampleButton->setTooltip (\"Mouseover tooltip text\");\n"
+"    //addAndMakeVisible (exampleButton);\n"
+"}\n"
+"\n"
+"\n"
+"EDITORCLASSNAME::~EDITORCLASSNAME()\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"void EDITORCLASSNAME::resized()\n"
+"{\n"
+"    // Don't edit this section.\n"
+"    //[OPENEPHYS_EDITOR_PRE_RESIZE_SECTION_BEGIN]\n"
+"\n"
+"    GenericEditor::resized();\n"
+"\n"
+"    const int xPosInitial = 2;\n"
+"    const int yPosIntiial = 23;\n"
+"    const int contentWidth = (isMerger() || isSplitter() || isUtility())\n"
+"                                    ? getWidth() - xPosInitial * 2\n"
+"                                    : channelSelector->isVisible()\n"
+"                                        ? channelSelector->getX() - xPosInitial * 2 - 5\n"
+"                                        : drawerButton->getX() - xPosInitial * 2;\n"
+"    content.setBounds (xPosInitial, yPosIntiial,\n"
+"                       contentWidth, getHeight() - yPosIntiial - 7);\n"
+"\n"
+"    //[OPENEPHYS_EDITOR_PRE_RESIZE_SECTION_END]\n"
+"}\n"
+"\n"
+"\n"
+"/**\n"
+"    The listener method that reacts to the button click. The same method is called for all buttons\n"
+"    on the editor, so the button variable, which cointains a pointer to the button that called the method\n"
+"    has to be checked to know which function to perform.\n"
+"*/\n"
+"void EDITORCLASSNAME::buttonEvent (Button* button)\n"
+"{\n"
+"    //if (button == exampleButton)\n"
+"    //{\n"
+"    //    //Do Stuff\n"
+"\n"
+"    //    //a typical  example:\n"
+"    //    if (button->getToggleState()) //Button is pressed\n"
+"    //    {\n"
+"    //        getProcessor()->setParameter(0, 1);\n"
+"    //    }\n"
+"    //    else\n"
+"    //    {\n"
+"    //        getProcessor()->setParameter(0, 0);\n"
+"    //    }\n"
+"    //}\n"
+"}\n"
+"\n"
+"\n"
+"/**\n"
+"    The listener method that reacts to the changes of the particular slider of the editor.\n"
+"    We should check which slider was changed and perofrm appropriate functions.\n"
+"*/\n"
+"void EDITORCLASSNAME::sliderEvent (Slider* slider)\n"
+"{\n"
+"}\n"
+"\n"
+"\n"
+"Visualizer* EDITORCLASSNAME::createNewCanvas()\n"
+"{\n"
+"    auto processor = dynamic_cast<PROCESSORCLASSNAME*> (getProcessor());\n"
+"    return new EDITORCANVASCLASSNAME (processor);\n"
+"}\n";
+
+const char* openEphys_ProcessorVisualizerEditorPluginTemplate_cpp = (const char*) temp_binary_data_16;
+
+//================== openEphys_ProcessorVisualizerEditorPluginTemplate.h ==================
+static const unsigned char temp_binary_data_17[] =
+"/*\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This file is part of the Open Ephys GUI\n"
+"   Copyright (C) 2016 Open Ephys\n"
+"\n"
+"   ------------------------------------------------------------------\n"
+"\n"
+"   This program is free software: you can redistribute it and/or modify\n"
+"   it under the terms of the GNU General Public License as published by\n"
+"   the Free Software Foundation, either version 3 of the License, or\n"
+"   (at your option) any later version.\n"
+"\n"
+"   This program is distributed in the hope that it will be useful,\n"
+"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"   GNU General Public License for more details.\n"
+"\n"
+"   You should have received a copy of the GNU General Public License\n"
+"   along with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
+"*/\n"
+"\n"
+"#ifndef HEADERGUARD\n"
+"#define HEADERGUARD\n"
+"\n"
+"#include <VisualizerEditorHeaders.h>\n"
+"#include \"CONTENTCOMPONENTCLASSNAME.h\"\n"
+"\n"
+"\n"
+"/**\n"
+"    This class serves as a template for creating new editors.\n"
+"\n"
+"    If this were a real editor, this comment section would be used to\n"
+"    describe the editor's structure. In this example, the editor will\n"
+"    have a single button which will set a parameter in the processor.\n"
+"\n"
+"    @see VisualizerEditor, GenericEditor\n"
+"*/\n"
+"class EDITORCLASSNAME : public VisualizerEditor\n"
+"{\n"
+"public:\n"
+"    /** The class constructor, used to initialize any members. */\n"
+"    EDITORCLASSNAME (GenericProcessor* parentNode, bool useDefaultParameterEditors);\n"
+"\n"
+"    /** The class destructor, used to deallocate memory */\n"
+"    ~EDITORCLASSNAME();\n"
+"\n"
+"    /**\n"
+"        Unlike processors, which have a minimum set of required methods,\n"
+"        editor are completely customized. There are still a couple of\n"
+"        sometimes useful overloaded methods, which will appear here\n"
+"    */\n"
+"\n"
+"    /** This method executes each time editor is resized. */\n"
+"    void resized() override;\n"
+"\n"
+"    /** This method executes whenever a custom button is pressed */\n"
+"    void buttonEvent (Button* button) override;\n"
+"\n"
+"    /** This method executes whenever a custom slider's value has been changed. */\n"
+"    void sliderEvent (Slider* slider) override;\n"
+"\n"
+"    /** Creates new canvas for visualizer editor. */\n"
+"    Visualizer* createNewCanvas() override;\n"
+"\n"
+"    /** Called to inform the editor that acquisition is about to start*/\n"
+"    //void startAcquisition();\n"
+"\n"
+"    /** Called to inform the editor that acquisition has just stopped*/\n"
+"    //void stopAcquisition();\n"
+"\n"
+"    /** Called whenever there is a change in the signal chain or it refreshes.\n"
+"      It's called after the processors' same named method.\n"
+"      */\n"
+"    //void updateSettings();\n"
+"\n"
+"\n"
+"private:\n"
+"    // This component contains all components and graphics that were added using Projucer.\n"
+"    // It's bounds initially the same bounds as the gray workspace (but only till the drawerButton for X)\n"
+"    CONTENTCOMPONENTCLASSNAME content;\n"
+"\n"
+"    /**\n"
+"        Here would be all the required internal variables.\n"
+"        In this case, we have a single button.\n"
+"    */\n"
+"    //Always use JUCE RAII classes instead of pure pointers.\n"
+"    //ScopedPointer<Button> exampleButton;\n"
+"\n"
+"\n"
+"    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EDITORCLASSNAME);\n"
+"};\n"
+"\n"
+"#endif // HEADERGUARD\n";
+
+const char* openEphys_ProcessorVisualizerEditorPluginTemplate_h = (const char*) temp_binary_data_17;
+
+//================== openEphys_RecordEnginePluginTemplate.cpp ==================
+static const unsigned char temp_binary_data_18[] =
+"/*\n"
 "    ------------------------------------------------------------------\n"
 "\n"
 "    This file is part of the Open Ephys GUI\n"
@@ -1476,10 +1871,10 @@ static const unsigned char temp_binary_data_14[] =
 "    return man;\n"
 "}\n";
 
-const char* openEphys_RecordEnginePluginTemplate_cpp = (const char*) temp_binary_data_14;
+const char* openEphys_RecordEnginePluginTemplate_cpp = (const char*) temp_binary_data_18;
 
 //================== openEphys_RecordEnginePluginTemplate.h ==================
-static const unsigned char temp_binary_data_15[] =
+static const unsigned char temp_binary_data_19[] =
 "/*\n"
 "    ------------------------------------------------------------------\n"
 "\n"
@@ -1542,10 +1937,10 @@ static const unsigned char temp_binary_data_15[] =
 "\n"
 "#endif // HEADERGUARD\n";
 
-const char* openEphys_RecordEnginePluginTemplate_h = (const char*) temp_binary_data_15;
+const char* openEphys_RecordEnginePluginTemplate_h = (const char*) temp_binary_data_19;
 
 //================== jucer_AnimatedComponentTemplate.cpp ==================
-static const unsigned char temp_binary_data_16[] =
+static const unsigned char temp_binary_data_20[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -1618,10 +2013,10 @@ static const unsigned char temp_binary_data_16[] =
 "\r\n"
 "#endif  // MAINCOMPONENT_H_INCLUDED\r\n";
 
-const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_16;
+const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_20;
 
 //================== jucer_AudioComponentTemplate.cpp ==================
-static const unsigned char temp_binary_data_17[] =
+static const unsigned char temp_binary_data_21[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -1722,10 +2117,10 @@ static const unsigned char temp_binary_data_17[] =
 "\r\n"
 "#endif  // MAINCOMPONENT_H_INCLUDED\r\n";
 
-const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_17;
+const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_21;
 
 //================== jucer_AudioPluginEditorTemplate.cpp ==================
-static const unsigned char temp_binary_data_18[] =
+static const unsigned char temp_binary_data_22[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -1768,10 +2163,10 @@ static const unsigned char temp_binary_data_18[] =
 "    // subcomponents in your editor..\r\n"
 "}\r\n";
 
-const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_18;
+const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_22;
 
 //================== jucer_AudioPluginEditorTemplate.h ==================
-static const unsigned char temp_binary_data_19[] =
+static const unsigned char temp_binary_data_23[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -1812,10 +2207,10 @@ static const unsigned char temp_binary_data_19[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_19;
+const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_23;
 
 //================== jucer_AudioPluginFilterTemplate.cpp ==================
-static const unsigned char temp_binary_data_20[] =
+static const unsigned char temp_binary_data_24[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -1985,10 +2380,10 @@ static const unsigned char temp_binary_data_20[] =
 "    return new FILTERCLASSNAME();\r\n"
 "}\r\n";
 
-const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_20;
+const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_24;
 
 //================== jucer_AudioPluginFilterTemplate.h ==================
-static const unsigned char temp_binary_data_21[] =
+static const unsigned char temp_binary_data_25[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2055,10 +2450,10 @@ static const unsigned char temp_binary_data_21[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_21;
+const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_25;
 
 //================== jucer_ComponentTemplate.cpp ==================
-static const unsigned char temp_binary_data_22[] =
+static const unsigned char temp_binary_data_26[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2134,10 +2529,10 @@ static const unsigned char temp_binary_data_22[] =
 "//[EndFile] You can add extra defines here...\r\n"
 "//[/EndFile]\r\n";
 
-const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_22;
+const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_26;
 
 //================== jucer_ComponentTemplate.h ==================
-static const unsigned char temp_binary_data_23[] =
+static const unsigned char temp_binary_data_27[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2203,10 +2598,10 @@ static const unsigned char temp_binary_data_23[] =
 "\r\n"
 "#endif   // %%headerGuard%%\r\n";
 
-const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_23;
+const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_27;
 
 //================== jucer_ContentCompTemplate.cpp ==================
-static const unsigned char temp_binary_data_24[] =
+static const unsigned char temp_binary_data_28[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2244,10 +2639,10 @@ static const unsigned char temp_binary_data_24[] =
 "    // update their positions.\r\n"
 "}\r\n";
 
-const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_24;
+const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_28;
 
 //================== jucer_ContentCompTemplate.h ==================
-static const unsigned char temp_binary_data_25[] =
+static const unsigned char temp_binary_data_29[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2285,10 +2680,10 @@ static const unsigned char temp_binary_data_25[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_25;
+const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_29;
 
 //================== jucer_InlineComponentTemplate.h ==================
-static const unsigned char temp_binary_data_26[] =
+static const unsigned char temp_binary_data_30[] =
 "//==============================================================================\r\n"
 "class COMPONENTCLASS    : public Component\r\n"
 "{\r\n"
@@ -2330,10 +2725,10 @@ static const unsigned char temp_binary_data_26[] =
 "    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (COMPONENTCLASS)\r\n"
 "};\r\n";
 
-const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_26;
+const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_30;
 
 //================== jucer_MainConsoleAppTemplate.cpp ==================
-static const unsigned char temp_binary_data_27[] =
+static const unsigned char temp_binary_data_31[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2357,10 +2752,10 @@ static const unsigned char temp_binary_data_27[] =
 "    return 0;\r\n"
 "}\r\n";
 
-const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_27;
+const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_31;
 
 //================== jucer_MainTemplate_NoWindow.cpp ==================
-static const unsigned char temp_binary_data_28[] =
+static const unsigned char temp_binary_data_32[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2416,10 +2811,10 @@ static const unsigned char temp_binary_data_28[] =
 "// This macro generates the main() routine that launches the app.\r\n"
 "START_JUCE_APPLICATION (APPCLASSNAME)\r\n";
 
-const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_28;
+const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_32;
 
 //================== jucer_MainTemplate_SimpleWindow.cpp ==================
-static const unsigned char temp_binary_data_29[] =
+static const unsigned char temp_binary_data_33[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2522,10 +2917,10 @@ static const unsigned char temp_binary_data_29[] =
 "// This macro generates the main() routine that launches the app.\r\n"
 "START_JUCE_APPLICATION (APPCLASSNAME)\r\n";
 
-const char* jucer_MainTemplate_SimpleWindow_cpp = (const char*) temp_binary_data_29;
+const char* jucer_MainTemplate_SimpleWindow_cpp = (const char*) temp_binary_data_33;
 
 //================== jucer_MainTemplate_Window.cpp ==================
-static const unsigned char temp_binary_data_30[] =
+static const unsigned char temp_binary_data_34[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2626,10 +3021,10 @@ static const unsigned char temp_binary_data_30[] =
 "// This macro generates the main() routine that launches the app.\r\n"
 "START_JUCE_APPLICATION (APPCLASSNAME)\r\n";
 
-const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_30;
+const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_34;
 
 //================== jucer_NewComponentTemplate.cpp ==================
-static const unsigned char temp_binary_data_31[] =
+static const unsigned char temp_binary_data_35[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2682,10 +3077,10 @@ static const unsigned char temp_binary_data_31[] =
 "\r\n"
 "}\r\n";
 
-const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_31;
+const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_35;
 
 //================== jucer_NewComponentTemplate.h ==================
-static const unsigned char temp_binary_data_32[] =
+static const unsigned char temp_binary_data_36[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2720,10 +3115,10 @@ static const unsigned char temp_binary_data_32[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_32;
+const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_36;
 
 //================== jucer_NewCppFileTemplate.cpp ==================
-static const unsigned char temp_binary_data_33[] =
+static const unsigned char temp_binary_data_37[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2736,10 +3131,10 @@ static const unsigned char temp_binary_data_33[] =
 "\r\n"
 "INCLUDE_CORRESPONDING_HEADER\r\n";
 
-const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_33;
+const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_37;
 
 //================== jucer_NewCppFileTemplate.h ==================
-static const unsigned char temp_binary_data_34[] =
+static const unsigned char temp_binary_data_38[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2759,10 +3154,10 @@ static const unsigned char temp_binary_data_34[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_34;
+const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_38;
 
 //================== jucer_NewInlineComponentTemplate.h ==================
-static const unsigned char temp_binary_data_35[] =
+static const unsigned char temp_binary_data_39[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2829,10 +3224,10 @@ static const unsigned char temp_binary_data_35[] =
 "\r\n"
 "#endif  // HEADERGUARD\r\n";
 
-const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_35;
+const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_39;
 
 //================== jucer_OpenGLComponentTemplate.cpp ==================
-static const unsigned char temp_binary_data_36[] =
+static const unsigned char temp_binary_data_40[] =
 "/*\r\n"
 "  ==============================================================================\r\n"
 "\r\n"
@@ -2910,10 +3305,10 @@ static const unsigned char temp_binary_data_36[] =
 "\r\n"
 "#endif  // MAINCOMPONENT_H_INCLUDED\r\n";
 
-const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_36;
+const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_40;
 
 //================== background_logo.svg ==================
-static const unsigned char temp_binary_data_37[] =
+static const unsigned char temp_binary_data_41[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\r\n"
 "\t viewBox=\"0 0 451.7 451.7\" enable-background=\"new 0 0 451.7 451.7\" xml:space=\"preserve\">\r\n"
@@ -2952,17 +3347,17 @@ static const unsigned char temp_binary_data_37[] =
 "</g>\r\n"
 "</svg>\r\n";
 
-const char* background_logo_svg = (const char*) temp_binary_data_37;
+const char* background_logo_svg = (const char*) temp_binary_data_41;
 
 //================== background_tile.png ==================
-static const unsigned char temp_binary_data_38[] =
+static const unsigned char temp_binary_data_42[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,7,0,0,0,7,8,6,0,0,0,196,82,87,211,0,0,0,94,73,68,65,84,120,218,85,141,73,14,0,33,8,4,253,137,226,18,19,245,234,255,127,70,75,155,232,56,135,10,132,94,112,33,4,37,222,123,205,57,107,74,105,239,196,137,
 8,72,239,29,99,12,204,57,209,90,227,237,19,45,113,161,209,12,234,172,18,49,70,88,229,134,34,103,173,245,159,60,134,82,10,238,79,166,223,106,238,91,100,229,73,191,80,92,47,179,68,223,148,158,98,226,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* background_tile_png = (const char*) temp_binary_data_38;
+const char* background_tile_png = (const char*) temp_binary_data_42;
 
 //================== colourscheme_dark.xml ==================
-static const unsigned char temp_binary_data_39[] =
+static const unsigned char temp_binary_data_43[] =
 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
 "\r\n"
 "<COLOUR_SCHEME font=\"&lt;Monospaced&gt;; 13.0\">\r\n"
@@ -2987,10 +3382,10 @@ static const unsigned char temp_binary_data_39[] =
 "  <COLOUR name=\"Error\" colour=\"FFE60000\"/>\r\n"
 "</COLOUR_SCHEME>\r\n";
 
-const char* colourscheme_dark_xml = (const char*) temp_binary_data_39;
+const char* colourscheme_dark_xml = (const char*) temp_binary_data_43;
 
 //================== colourscheme_light.xml ==================
-static const unsigned char temp_binary_data_40[] =
+static const unsigned char temp_binary_data_44[] =
 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
 "\r\n"
 "<COLOUR_SCHEME font=\"&lt;Monospaced&gt;; 13.0\">\r\n"
@@ -3015,10 +3410,10 @@ static const unsigned char temp_binary_data_40[] =
 "  <COLOUR name=\"Error\" colour=\"ffcc0000\"/>\r\n"
 "</COLOUR_SCHEME>\r\n";
 
-const char* colourscheme_light_xml = (const char*) temp_binary_data_40;
+const char* colourscheme_light_xml = (const char*) temp_binary_data_44;
 
 //================== juce_icon.png ==================
-static const unsigned char temp_binary_data_41[] =
+static const unsigned char temp_binary_data_45[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,0,0,0,2,0,8,6,0,0,0,244,120,212,250,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,3,40,105,84,88,116,88,77,76,58,
 99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,120,
 58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,54,55,32,55,57,46,49,53,55,
@@ -3664,10 +4059,10 @@ static const unsigned char temp_binary_data_41[] =
 0,0,0,2,0,0,16,0,0,128,0,0,0,4,0,0,32,0,0,0,1,0,0,8,0,0,64,0,0,0,2,0,0,16,0,0,128,0,0,0,4,0,0,32,0,0,0,1,0,0,8,0,0,64,0,0,128,0,0,0,4,0,0,32,0,0,0,1,0,0,8,0,0,64,0,0,0,2,0,0,16,0,0,128,0,0,0,4,0,0,32,0,0,128,191,246,33,192,0,100,235,173,153,70,62,64,
 37,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* juce_icon_png = (const char*) temp_binary_data_41;
+const char* juce_icon_png = (const char*) temp_binary_data_45;
 
 //================== projectIconAndroid.png ==================
-static const unsigned char temp_binary_data_42[] =
+static const unsigned char temp_binary_data_46[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,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,3,134,105,84,88,116,88,77,76,
 58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
 120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -3784,10 +4179,10 @@ static const unsigned char temp_binary_data_42[] =
 139,240,165,4,64,57,166,132,157,54,246,220,165,230,39,27,156,211,4,232,176,247,44,193,125,203,174,137,229,132,198,114,231,150,74,124,238,9,19,9,244,154,7,0,175,121,0,240,154,7,0,175,121,0,240,154,7,0,175,121,0,240,154,7,0,175,189,235,246,255,2,12,0,158,
 137,39,54,252,6,9,64,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconAndroid_png = (const char*) temp_binary_data_42;
+const char* projectIconAndroid_png = (const char*) temp_binary_data_46;
 
 //================== projectIconCodeblocks.png ==================
-static const unsigned char temp_binary_data_43[] =
+static const unsigned char temp_binary_data_47[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,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,3,134,105,84,88,116,88,77,76,
 58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
 120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -3957,10 +4352,10 @@ static const unsigned char temp_binary_data_43[] =
 202,84,15,91,2,120,13,161,41,237,191,111,130,252,4,17,176,224,208,111,140,253,56,221,147,207,16,11,238,233,234,37,192,250,248,241,59,248,122,10,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,
 62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,214,12,176,62,126,28,143,255,39,192,0,238,147,31,89,162,25,31,21,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconCodeblocks_png = (const char*) temp_binary_data_43;
+const char* projectIconCodeblocks_png = (const char*) temp_binary_data_47;
 
 //================== projectIconLinuxMakefile.png ==================
-static const unsigned char temp_binary_data_44[] =
+static const unsigned char temp_binary_data_48[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,110,0,0,0,128,8,6,0,0,0,234,21,92,9,0,0,10,65,105,67,67,80,73,67,67,32,80,114,111,102,105,108,101,0,0,72,13,157,150,119,84,83,217,22,135,207,189,55,189,208,18,34,32,37,244,26,122,9,32,210,59,72,21,4,
 81,137,73,128,80,2,134,132,38,118,68,5,70,20,17,41,86,100,84,192,1,71,135,34,99,69,20,11,131,130,98,215,9,242,16,80,198,193,81,68,69,229,221,140,107,9,239,173,53,243,222,154,253,199,89,223,217,231,183,215,217,103,239,125,215,186,0,80,252,130,4,194,116,
 88,1,128,52,161,88,20,238,235,193,92,18,19,203,196,247,2,24,16,1,14,88,1,192,225,102,102,4,71,248,68,2,212,252,189,61,153,153,168,72,198,179,246,238,46,128,100,187,219,44,191,80,38,115,214,255,127,145,34,55,67,36,6,0,10,69,213,54,60,126,38,23,229,2,148,
@@ -4196,10 +4591,10 @@ static const unsigned char temp_binary_data_44[] =
 194,72,142,254,249,31,79,111,60,173,241,241,124,82,34,189,246,233,251,163,179,223,129,178,15,181,97,103,68,217,251,253,17,198,63,35,254,218,150,109,129,235,236,183,141,63,16,97,60,125,157,93,199,211,219,217,245,128,211,250,223,12,238,70,210,82,169,25,
 10,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconLinuxMakefile_png = (const char*) temp_binary_data_44;
+const char* projectIconLinuxMakefile_png = (const char*) temp_binary_data_48;
 
 //================== projectIconVisualStudio.png ==================
-static const unsigned char temp_binary_data_45[] =
+static const unsigned char temp_binary_data_49[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,4,166,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,120,58,120,109,112,109,101,
 116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,88,77,80,32,67,111,114,101,32,53,46,52,46,48,34,62,10,32,32,32,60,114,100,102,58,82,68,70,32,120,109,108,110,115,58,114,
 100,102,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,48,50,47,50,50,45,114,100,102,45,115,121,110,116,97,120,45,110,115,35,34,62,10,32,32,32,32,32,32,60,114,100,102,58,68,101,115,99,114,105,112,116,105,111,110,
@@ -4302,10 +4697,10 @@ static const unsigned char temp_binary_data_45[] =
 60,9,167,156,184,49,164,154,223,25,2,227,183,193,73,245,49,24,79,213,175,147,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,128,166,192,129,64,
 129,255,7,47,12,150,8,60,209,161,194,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconVisualStudio_png = (const char*) temp_binary_data_45;
+const char* projectIconVisualStudio_png = (const char*) temp_binary_data_49;
 
 //================== projectIconXcode.png ==================
-static const unsigned char temp_binary_data_46[] =
+static const unsigned char temp_binary_data_50[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,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,3,40,105,84,88,116,88,77,76,58,
 99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,120,
 58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,54,
@@ -4565,10 +4960,10 @@ static const unsigned char temp_binary_data_46[] =
 94,156,0,232,23,120,134,102,179,249,235,17,128,9,19,38,192,59,223,249,206,152,182,172,169,75,67,169,119,178,110,237,223,246,242,196,143,188,48,28,50,88,157,63,127,254,175,124,82,161,71,186,231,200,203,63,99,234,231,229,216,252,127,248,207,255,19,96,0,
 221,83,18,25,240,8,112,38,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconXcode_png = (const char*) temp_binary_data_46;
+const char* projectIconXcode_png = (const char*) temp_binary_data_50;
 
 //================== projectIconXcodeIOS.png ==================
-static const unsigned char temp_binary_data_47[] =
+static const unsigned char temp_binary_data_51[] =
 { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,128,0,0,0,128,8,6,0,0,0,195,62,97,203,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,3,134,105,84,88,116,88,77,76,
 58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112,67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,32,60,
 120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,65,100,111,98,101,32,88,77,80,32,67,111,114,101,32,53,46,54,45,99,48,49,52,32,55,57,46,49,53,
@@ -4826,10 +5221,10 @@ static const unsigned char temp_binary_data_47[] =
 4,97,9,162,191,203,0,199,198,0,162,157,87,213,105,220,35,12,64,131,146,62,249,201,79,186,117,103,130,86,133,76,84,14,16,185,67,123,223,37,252,241,103,134,146,206,234,228,201,147,143,250,164,172,171,29,174,239,254,252,101,253,188,235,155,255,31,255,249,
 255,2,12,0,235,154,52,248,249,240,115,28,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
 
-const char* projectIconXcodeIOS_png = (const char*) temp_binary_data_47;
+const char* projectIconXcodeIOS_png = (const char*) temp_binary_data_51;
 
 //================== projucer_EULA.txt ==================
-static const unsigned char temp_binary_data_48[] =
+static const unsigned char temp_binary_data_52[] =
 "\r\n"
 "IMPORTANT NOTICE: PLEASE READ CAREFULLY BEFORE INSTALLING THE SOFTWARE:\r\n"
 "\r\n"
@@ -4993,10 +5388,10 @@ static const unsigned char temp_binary_data_48[] =
 "\r\n"
 "10.6. Please note that this Licence, its subject matter and its formation, are governed by English law. You and we both agree to that the courts of England and Wales will have exclusive jurisdiction. \r\n";
 
-const char* projucer_EULA_txt = (const char*) temp_binary_data_48;
+const char* projucer_EULA_txt = (const char*) temp_binary_data_52;
 
 //================== projucer_login_bg.svg ==================
-static const unsigned char temp_binary_data_49[] =
+static const unsigned char temp_binary_data_53[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\r\n"
@@ -5060,10 +5455,10 @@ static const unsigned char temp_binary_data_49[] =
 "\tc7.6,0,12,4.8,12,11c0,5.4-4,9.8-9,10l13,15.5H343.9z\"/>\r\n"
 "</svg>\r\n";
 
-const char* projucer_login_bg_svg = (const char*) temp_binary_data_49;
+const char* projucer_login_bg_svg = (const char*) temp_binary_data_53;
 
 //================== RecentFilesMenuTemplate.nib ==================
-static const unsigned char temp_binary_data_50[] =
+static const unsigned char temp_binary_data_54[] =
 { 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50,
 0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226,
 0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,
@@ -5100,10 +5495,10 @@ static const unsigned char temp_binary_data_50[] =
 7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8,
 41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 };
 
-const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_50;
+const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_54;
 
 //================== wizard_AnimatedApp.svg ==================
-static const unsigned char temp_binary_data_51[] =
+static const unsigned char temp_binary_data_55[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5150,10 +5545,10 @@ static const unsigned char temp_binary_data_51[] =
 "<line opacity=\"0.7\" fill=\"none\" stroke=\"#F29100\" stroke-width=\"1.3469\" stroke-miterlimit=\"10\" x1=\"57.7\" y1=\"48.4\" x2=\"34.2\" y2=\"48.4\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_51;
+const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_55;
 
 //================== wizard_AudioApp.svg ==================
-static const unsigned char temp_binary_data_52[] =
+static const unsigned char temp_binary_data_56[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5227,10 +5622,10 @@ static const unsigned char temp_binary_data_52[] =
 "<line fill=\"none\" stroke=\"#F29300\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"118.8\" y1=\"43.8\" x2=\"118.8\" y2=\"44.5\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_AudioApp_svg = (const char*) temp_binary_data_52;
+const char* wizard_AudioApp_svg = (const char*) temp_binary_data_56;
 
 //================== wizard_AudioPlugin.svg ==================
-static const unsigned char temp_binary_data_53[] =
+static const unsigned char temp_binary_data_57[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5341,10 +5736,10 @@ static const unsigned char temp_binary_data_53[] =
 "</g>\r\n"
 "</svg>\r\n";
 
-const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_53;
+const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_57;
 
 //================== wizard_ConsoleApp.svg ==================
-static const unsigned char temp_binary_data_54[] =
+static const unsigned char temp_binary_data_58[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5367,10 +5762,10 @@ static const unsigned char temp_binary_data_54[] =
 "</g>\r\n"
 "</svg>\r\n";
 
-const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_54;
+const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_58;
 
 //================== wizard_DLL.svg ==================
-static const unsigned char temp_binary_data_55[] =
+static const unsigned char temp_binary_data_59[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5413,10 +5808,10 @@ static const unsigned char temp_binary_data_55[] =
 "\tl-7.7,5.3c-0.7,0.5-1.7,0.3-2.2-0.4L70.1,31\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_DLL_svg = (const char*) temp_binary_data_55;
+const char* wizard_DLL_svg = (const char*) temp_binary_data_59;
 
 //================== wizard_GUI.svg ==================
-static const unsigned char temp_binary_data_56[] =
+static const unsigned char temp_binary_data_60[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5467,10 +5862,10 @@ static const unsigned char temp_binary_data_56[] =
 "\tC0,3.1,3.1,0,6.9,0H130c3.8,0,6.9,3.1,6.9,6.9v101.1C136.9,111.7,133.9,114.8,130,114.8z\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_GUI_svg = (const char*) temp_binary_data_56;
+const char* wizard_GUI_svg = (const char*) temp_binary_data_60;
 
 //================== wizard_Highlight.svg ==================
-static const unsigned char temp_binary_data_57[] =
+static const unsigned char temp_binary_data_61[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5480,10 +5875,10 @@ static const unsigned char temp_binary_data_57[] =
 "\tV108C136.9,111.8,133.9,114.8,130.1,114.8z\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_Highlight_svg = (const char*) temp_binary_data_57;
+const char* wizard_Highlight_svg = (const char*) temp_binary_data_61;
 
 //================== wizard_Openfile.svg ==================
-static const unsigned char temp_binary_data_58[] =
+static const unsigned char temp_binary_data_62[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5493,10 +5888,10 @@ static const unsigned char temp_binary_data_58[] =
 "\tc0-3.8,3.1-6.9,6.9-6.9h151.5c3.8,0,6.9,3.1,6.9,6.9v20.9C171.6,68.3,168.5,71.4,164.7,71.4z\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_Openfile_svg = (const char*) temp_binary_data_58;
+const char* wizard_Openfile_svg = (const char*) temp_binary_data_62;
 
 //================== wizard_OpenGL.svg ==================
-static const unsigned char temp_binary_data_59[] =
+static const unsigned char temp_binary_data_63[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5524,10 +5919,10 @@ static const unsigned char temp_binary_data_59[] =
 "\ts-13.4-19.6-6.9-30\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_OpenGL_svg = (const char*) temp_binary_data_59;
+const char* wizard_OpenGL_svg = (const char*) temp_binary_data_63;
 
 //================== wizard_StaticLibrary.svg ==================
-static const unsigned char temp_binary_data_60[] =
+static const unsigned char temp_binary_data_64[] =
 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
 "<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r\n"
 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n"
@@ -5570,7 +5965,7 @@ static const unsigned char temp_binary_data_60[] =
 "\tc-1,0-1.8-0.8-1.8-1.8V20.8\"/>\r\n"
 "</svg>\r\n";
 
-const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_60;
+const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_64;
 
 
 const char* getNamedResource (const char*, int&) throw();
@@ -5597,6 +5992,10 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw
         case 0x229158a3:  numBytes = 3369; return openEphys_ProcessorEditorPluginTemplate_h;
         case 0xfca5b2d1:  numBytes = 3846; return openEphys_ProcessorPluginTemplate_cpp;
         case 0x40baa516:  numBytes = 3502; return openEphys_ProcessorPluginTemplate_h;
+        case 0x1d379af4:  numBytes = 1862; return openEphys_ProcessorVisualizerCanvasTemplate_cpp;
+        case 0x9bde39f9:  numBytes = 2706; return openEphys_ProcessorVisualizerCanvasTemplate_h;
+        case 0x7a3e121c:  numBytes = 4111; return openEphys_ProcessorVisualizerEditorPluginTemplate_cpp;
+        case 0x92e85b21:  numBytes = 3221; return openEphys_ProcessorVisualizerEditorPluginTemplate_h;
         case 0x7e820c56:  numBytes = 2169; return openEphys_RecordEnginePluginTemplate_cpp;
         case 0x36799bdb:  numBytes = 2052; return openEphys_RecordEnginePluginTemplate_h;
         case 0x6cf2645e:  numBytes = 1949; return jucer_AnimatedComponentTemplate_cpp;
@@ -5667,6 +6066,10 @@ const char* namedResourceList[] =
     "openEphys_ProcessorEditorPluginTemplate_h",
     "openEphys_ProcessorPluginTemplate_cpp",
     "openEphys_ProcessorPluginTemplate_h",
+    "openEphys_ProcessorVisualizerCanvasTemplate_cpp",
+    "openEphys_ProcessorVisualizerCanvasTemplate_h",
+    "openEphys_ProcessorVisualizerEditorPluginTemplate_cpp",
+    "openEphys_ProcessorVisualizerEditorPluginTemplate_h",
     "openEphys_RecordEnginePluginTemplate_cpp",
     "openEphys_RecordEnginePluginTemplate_h",
     "jucer_AnimatedComponentTemplate_cpp",
diff --git a/PluginGenerator/JuceLibraryCode/BinaryData.h b/PluginGenerator/JuceLibraryCode/BinaryData.h
index cb0d4affdd3a604a884592cca44d35efc0763645..99ead93f561c9e37437180c1676ebefed16461eb 100644
--- a/PluginGenerator/JuceLibraryCode/BinaryData.h
+++ b/PluginGenerator/JuceLibraryCode/BinaryData.h
@@ -51,6 +51,18 @@ namespace BinaryData
     extern const char*   openEphys_ProcessorPluginTemplate_h;
     const int            openEphys_ProcessorPluginTemplate_hSize = 3502;
 
+    extern const char*   openEphys_ProcessorVisualizerCanvasTemplate_cpp;
+    const int            openEphys_ProcessorVisualizerCanvasTemplate_cppSize = 1862;
+
+    extern const char*   openEphys_ProcessorVisualizerCanvasTemplate_h;
+    const int            openEphys_ProcessorVisualizerCanvasTemplate_hSize = 2706;
+
+    extern const char*   openEphys_ProcessorVisualizerEditorPluginTemplate_cpp;
+    const int            openEphys_ProcessorVisualizerEditorPluginTemplate_cppSize = 4111;
+
+    extern const char*   openEphys_ProcessorVisualizerEditorPluginTemplate_h;
+    const int            openEphys_ProcessorVisualizerEditorPluginTemplate_hSize = 3221;
+
     extern const char*   openEphys_RecordEnginePluginTemplate_cpp;
     const int            openEphys_RecordEnginePluginTemplate_cppSize = 2169;
 
@@ -196,7 +208,7 @@ namespace BinaryData
     extern const char* namedResourceList[];
 
     // Number of elements in the namedResourceList array.
-    const int namedResourceListSize = 61;
+    const int namedResourceListSize = 65;
 
     // If you provide the name of one of the binary resource variables above, this function will
     // return the corresponding data and its size (or a null pointer if the name isn't found).
diff --git a/PluginGenerator/Projucer.jucer b/PluginGenerator/Projucer.jucer
index 044a5fe42402c6baee1b4e9bde5682e774ab2f2c..dc8b6d2f199008b3ada291d0fb6274ca7b88a10f 100644
--- a/PluginGenerator/Projucer.jucer
+++ b/PluginGenerator/Projucer.jucer
@@ -606,6 +606,15 @@
                 resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorPluginTemplate.cpp"/>
           <FILE id="dOxspy" name="openEphys_ProcessorPluginTemplate.h" compile="0"
                 resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorPluginTemplate.h"/>
+          <FILE id="xcFQQt" name="openEphys_ProcessorVisualizerCanvasTemplate.cpp"
+                compile="0" resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.cpp"
+                xcodeResource="0"/>
+          <FILE id="mReCie" name="openEphys_ProcessorVisualizerCanvasTemplate.h"
+                compile="0" resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.h"/>
+          <FILE id="rWHazB" name="openEphys_ProcessorVisualizerEditorPluginTemplate.cpp"
+                compile="0" resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.cpp"/>
+          <FILE id="G9iq5j" name="openEphys_ProcessorVisualizerEditorPluginTemplate.h"
+                compile="0" resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.h"/>
           <FILE id="QVd832" name="openEphys_RecordEnginePluginTemplate.cpp" compile="0"
                 resource="1" file="../Source/Processors/PluginManager/Templates/openEphys_RecordEnginePluginTemplate.cpp"/>
           <FILE id="IIuSzd" name="openEphys_RecordEnginePluginTemplate.h" compile="0"
diff --git a/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.cpp b/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.cpp
index b3ec77ef8249cbcd625e46d230bf235474b94159..8798900bce57890207b9ee136427750e5146e555 100644
--- a/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.cpp
+++ b/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.cpp
@@ -200,7 +200,12 @@ void PluginTemplatesPageComponent::buttonClicked (Button* buttonThatWasClicked)
     }
     else if (auto selectedTemplateComponent = dynamic_cast<EditorTemplateComponent*> (buttonThatWasClicked))
     {
-        m_selectedTemplateName = selectedTemplateComponent->getTemplateName();
+        // The page with templates for generic editor is active
+        if (m_genericEditorTemplatesManager->isVisible())
+            m_selectedTemplateName = selectedTemplateComponent->getTemplateName();
+        // The page with templates for visualizer editor canvas is active
+        else
+            m_selectedVisualizerTemplateName = selectedTemplateComponent->getTemplateName();
     }
 }
 
@@ -302,3 +307,9 @@ String PluginTemplatesPageComponent::getSelectedTemplateName() const noexcept
 {
     return m_selectedTemplateName;
 }
+
+
+String PluginTemplatesPageComponent::getSelectedVisualizerTemplateName() const noexcept
+{
+    return m_selectedVisualizerTemplateName;
+}
diff --git a/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.h b/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.h
index 09355eff30a263928fed1143b8d667f09160304f..55df463f68b5ee0acdb5d9dde812f710e559b490 100644
--- a/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.h
+++ b/PluginGenerator/Source/Wizards/openEphys_PluginTemplatesPageComponent.h
@@ -53,7 +53,9 @@ public:
 
     bool shouldUseVisualizerEditor() const noexcept;
     bool shouldUseDataThreadSource() const noexcept;
-    String getSelectedTemplateName() const noexcept;
+
+    String getSelectedTemplateName()            const noexcept;
+    String getSelectedVisualizerTemplateName()  const noexcept;
 
 
     /** Used to set listener for the "Create project" button.
@@ -71,7 +73,8 @@ private:
     void fillGenericEditorTemplates();
     void fillVisualizerEditorTemplates();
 
-    String m_selectedTemplateName { "DEFAULT" };
+    String m_selectedTemplateName               { "DEFAULT" };
+    String m_selectedVisualizerTemplateName     { "DEFAULT" };
 
     /** The purpose of this button is to notify previous slidingComponent (ProjectWizard_OpenEphysPlugin)
         about the event and call appropriate "createProject" function defined there.
diff --git a/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h b/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
index 3abbeff55331801b95af8a063d18df720a1bf390..d6faded5c48399ba53adaa2bd496501de979df69 100644
--- a/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
+++ b/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
@@ -211,10 +211,15 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
         m_processorType = configPage->getSelectedProcessorType();
 
         m_shouldUseVisualizerEditor = configPage->shouldUseVisualizerEditor();
-        m_guiTemplateName = configPage->getSelectedTemplateName();
+
+        m_guiTemplateName           = configPage->getSelectedTemplateName();
+        m_guiVisualizerTemplateName = configPage->getSelectedVisualizerTemplateName();
 
         DBG (String ("GUI Template name: ") + m_guiTemplateName);
 
+        if (m_shouldUseVisualizerEditor)
+            DBG (String ("GUI Visualizer Canvas template name: ") + m_guiVisualizerTemplateName);
+
         return Result::ok();
     }
 
@@ -261,6 +266,19 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
         generatePluginEditorFiles    (project, sourceGroup, pluginProcessorName, pluginEditorName, pluginFriendlyName, pluginContentComponentName);
         generatePluginEditorContentComponentFiles (project, sourceGroup, pluginProcessorName, pluginEditorName, pluginContentComponentName);
 
+        if (m_shouldUseVisualizerEditor)
+        {
+            const String visualizerCanvasName                 = pluginProcessorName + "Canvas";
+            const String visualizerCanvasContentComponentName = visualizerCanvasName + "ContentComponent";
+            generatePluginVisualizerEditorCanvasFiles (project, sourceGroup,
+                                                       pluginProcessorName, visualizerCanvasName,
+                                                       visualizerCanvasName, visualizerCanvasContentComponentName);
+            generatePluginEditorContentComponentFiles (project, sourceGroup,
+                                                       pluginProcessorName, visualizerCanvasName,
+                                                       visualizerCanvasContentComponentName,
+                                                       true);
+        }
+
         return true;
     }
 
@@ -387,19 +405,32 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
         auto newEditorCppFile  = sourceFolder.getChildFile (editorName + ".cpp");
         auto newEditorHFile    = sourceFolder.getChildFile (editorName + ".h");
 
-        String editorCppFileContent = project.getFileTemplate ("openEphys_ProcessorEditorPluginTemplate_cpp")
+        String templateFileNameWithoutExtension = m_shouldUseVisualizerEditor
+                                                    ? "openEphys_ProcessorVisualizerEditorPluginTemplate"
+                                                    : "openEphys_ProcessorEditorPluginTemplate";
+
+        String editorCppFileContent = project.getFileTemplate (templateFileNameWithoutExtension + "_cpp")
             //.replace ("EDITORCPPHEADERS", CodeHelpers::createIncludeStatement (filterHFile, filterCppFile)
             //                                   + newLine + CodeHelpers::createIncludeStatement (editorHFile, filterCppFile), false)
             .replace ("PROCESSORCLASSNAME", processorName, false)
-            .replace ("EDITORCLASSNAME", editorName, false);
+            .replace ("EDITORCLASSNAME", editorName, false)
+            .replace ("PLUGINGUINAME", pluginFriendlyName, false);
 
-        String editorHFileContent   = project.getFileTemplate ("openEphys_ProcessorEditorPluginTemplate_h")
+        String editorHFileContent   = project.getFileTemplate (templateFileNameWithoutExtension + "_h")
             //.replace ("EDITORHEADERS", appHeaders + newLine + CodeHelpers::createIncludeStatement (filterHFile, filterCppFile), false)
             .replace ("PROCESSORCLASSNAME", processorName, false)
             .replace ("EDITORCLASSNAME", editorName, false)
             .replace ("CONTENTCOMPONENTCLASSNAME", contentComponentName, false)
             .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (newEditorHFile), false);
 
+        if (m_shouldUseVisualizerEditor)
+        {
+            const String canvasClassName = processorName + "Canvas";
+            editorCppFileContent = editorCppFileContent
+                                    .replace ("EDITORCANVASCLASSNAME", canvasClassName, false)
+                                    .replace ("GenericEditor", "VisualizerEditor", false);
+        }
+
         bool wasGeneratedSuccessfully = true;
 
         if (! FileHelpers::overwriteFileWithNewDataIfDifferent (newEditorCppFile, editorCppFileContent))
@@ -427,17 +458,21 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
                                                     Project::Item& sourceGroup,
                                                     const String& processorName,
                                                     const String& editorName,
-                                                    const String& contentComponentName)
+                                                    const String& contentComponentName,
+                                                    bool useVisualizerEditorTemplates = false)
     {
         const auto sourceFolder = getSourceFilesFolder();
 
         auto newContentComponentCppFile = sourceFolder.getChildFile (contentComponentName + ".cpp");
         auto newContentComponentHFile   = sourceFolder.getChildFile (contentComponentName + ".h");
 
+        const String guiTemplateName = useVisualizerEditorTemplates
+                                            ? m_guiVisualizerTemplateName
+                                            : m_guiTemplateName;
         String contentComponentCppFileContent;
         String contentComponentHFileContent;
 
-        if (m_guiTemplateName == "DEFAULT" || (! isExistsGuiTemplate (m_guiTemplateName)))
+        if (guiTemplateName == "DEFAULT" || (! isExistsGuiTemplate (guiTemplateName)))
         {
             contentComponentCppFileContent = project.getFileTemplate ("openEphys_ProcessorContentComponentTemplate_cpp")
                 .replace ("CONTENTCOMPONENTCLASSNAME", contentComponentName, false);
@@ -449,14 +484,14 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
         }
         else
         {
-            const auto guiTemplateClassName = getGUITemplateClassName (m_guiTemplateName);
+            const auto guiTemplateClassName = getGUITemplateClassName (guiTemplateName);
 
-            contentComponentCppFileContent = getGUITemplate (m_guiTemplateName, false)
+            contentComponentCppFileContent = getGUITemplate (guiTemplateName, false)
                 .replace (guiTemplateClassName, contentComponentName);
 
             const auto userVariablesMacro = String ("//[UserVariables]   -- You can add your own custom variables in this section.") + newLine;
-            const auto friendClassDefinition = CodeHelpers::indent (String ("friend class ") + editorName, 4, true) + newLine;
-            contentComponentHFileContent = getGUITemplate (m_guiTemplateName, true)
+            const auto friendClassDefinition = CodeHelpers::indent (String ("friend class ") + editorName, 4, true) + ";" + newLine;
+            contentComponentHFileContent = getGUITemplate (guiTemplateName, true)
                 .replace (guiTemplateClassName, contentComponentName)
                 .replace (userVariablesMacro, userVariablesMacro + friendClassDefinition , false);
         }
@@ -483,6 +518,54 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
         return wasGeneratedSuccessfully;
     }
 
+
+    bool generatePluginVisualizerEditorCanvasFiles (const Project& project,
+                                                    Project::Item& sourceGroup,
+                                                    const String& processorName,
+                                                    const String& editorName,
+                                                    const String& canvasName,
+                                                    const String& contentComponentName)
+    {
+        const auto sourceFolder = getSourceFilesFolder();
+
+        auto newCanvasComponentCppFile = sourceFolder.getChildFile (canvasName + ".cpp");
+        auto newCanvasComponentHFile   = sourceFolder.getChildFile (canvasName + ".h");
+
+        String canvasComponentCppFileContent;
+        String canvasComponentHFileContent;
+
+        canvasComponentCppFileContent = project.getFileTemplate ("openEphys_ProcessorVisualizerCanvasTemplate_cpp")
+            .replace ("PROCESSORCLASSNAME", processorName, false)
+            .replace ("EDITORCANVASCLASSNAME", editorName, false);
+
+        canvasComponentHFileContent = project.getFileTemplate ("openEphys_ProcessorVisualizerCanvasTemplate_h")
+            .replace ("PROCESSORCLASSNAME", processorName,false)
+            .replace ("EDITORCANVASCLASSNAME", editorName, false)
+            .replace ("CONTENTCOMPONENTCLASSNAME", contentComponentName, false)
+            .replace ("HEADERGUARD", CodeHelpers::makeHeaderGuardName (newCanvasComponentHFile), false);
+
+        bool wasGeneratedSuccessfully = true;
+
+        if (! FileHelpers::overwriteFileWithNewDataIfDifferent (newCanvasComponentCppFile, canvasComponentCppFileContent))
+        {
+            failedFiles.add (newCanvasComponentCppFile.getFullPathName());
+
+            wasGeneratedSuccessfully = false;
+        }
+
+        if (! FileHelpers::overwriteFileWithNewDataIfDifferent (newCanvasComponentHFile, canvasComponentHFileContent))
+        {
+            failedFiles.add (newCanvasComponentHFile.getFullPathName());
+
+            wasGeneratedSuccessfully = false;
+        }
+
+        sourceGroup.addFileAtIndex (newCanvasComponentCppFile, -1, true);
+        sourceGroup.addFileAtIndex (newCanvasComponentHFile,   -1, false);
+
+        return wasGeneratedSuccessfully;
+    }
+
     static constexpr const char* COMBOBOX_ID_PLUGIN_TYPE    = "pluginTypeComboBox";//    { "pluginTypeComboBox" };
     static constexpr const char* COMBOBOX_ID_PROCESSOR_TYPE = "processorTypeComboBox";// { "processorTypeComboBox" };
 
@@ -494,6 +577,9 @@ private:
     /** The name of the GUI template which is used to create content component for plugin. */
     String m_guiTemplateName;
 
+    /** The name of the GUI template for VisualizerEditor's Canvas (if used) to create content component for plugin. */
+    String m_guiVisualizerTemplateName;
+
     bool m_shouldUseVisualizerEditor;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenEphysPluginAppWizard)
diff --git a/Source/Processors/Editors/VisualizerEditor.cpp b/Source/Processors/Editors/VisualizerEditor.cpp
index aeb18f322056d0b20e3466e6f96329601ce12917..f29b993d2f284f6dd0708a1fccbfe04ede1ed298 100755
--- a/Source/Processors/Editors/VisualizerEditor.cpp
+++ b/Source/Processors/Editors/VisualizerEditor.cpp
@@ -139,6 +139,15 @@ VisualizerEditor::~VisualizerEditor()
 }
 
 
+void VisualizerEditor::resized()
+{
+    GenericEditor::resized();
+
+    windowSelector->setBounds   (desiredWidth - 40, 7, 14, 10);
+    tabSelector->setBounds      (desiredWidth - 20, 7, 15, 10);
+}
+
+
 // All additional buttons inside the VisualizerEditor should use this instead of buttonClicked()
 void VisualizerEditor::buttonEvent (Button* button) {}
 
diff --git a/Source/Processors/Editors/VisualizerEditor.h b/Source/Processors/Editors/VisualizerEditor.h
index b9e1db631d8e3bc00eba26e054f5543ef03939a0..41b734bf3c52641b1543fab41b77e8a0f539e476 100755
--- a/Source/Processors/Editors/VisualizerEditor.h
+++ b/Source/Processors/Editors/VisualizerEditor.h
@@ -89,6 +89,8 @@ public:
     VisualizerEditor (GenericProcessor* processor, bool useDefaultParameterEditors = true);
     ~VisualizerEditor();
 
+    void resized() override;
+
     /**
         @brief      This method handles the button evnets which open visualizer in a tab or window.
         @warning    Do not override this function unless you call ``VisualizerEditor::buttonClicked``
@@ -102,8 +104,8 @@ public:
     virtual void buttonEvent (Button* button) override;
 
     /**
-     * @brief      Creates a new canvas. This is like a factory method and must be defined in your sub-class.
-     */
+        @brief      Creates a new canvas. This is like a factory method and must be defined in your sub-class.
+    */
     virtual Visualizer* createNewCanvas() = 0;
 
     virtual void enable();
diff --git a/Source/Processors/PluginManager/Templates/openEphys_ProcessorContentComponentTemplate.cpp b/Source/Processors/PluginManager/Templates/openEphys_ProcessorContentComponentTemplate.cpp
index fbe662988bb77352f7cea583ced2b58adb040b15..7aaf9d11b7bfee9b11e47d93a813d387757d2ed0 100644
--- a/Source/Processors/PluginManager/Templates/openEphys_ProcessorContentComponentTemplate.cpp
+++ b/Source/Processors/PluginManager/Templates/openEphys_ProcessorContentComponentTemplate.cpp
@@ -89,7 +89,7 @@ BEGIN_JUCER_METADATA
 <JUCER_COMPONENT documentType="Component" className="CONTENTCOMPONENTCLASSNAME" componentName=""
                  parentClasses="public Component" constructorParams="" variableInitialisers=""
                  snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330"
-                 fixedSize="0" initialWidth="150" initialHeight="200">
+                 fixedSize="1" initialWidth="150" initialHeight="200">
   <BACKGROUND backgroundColour="ffffff"/>
 </JUCER_COMPONENT>
 
diff --git a/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.cpp b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..206c26a111ca711e7653b4ad958948ab6d6c5c87
--- /dev/null
+++ b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.cpp
@@ -0,0 +1,83 @@
+/*
+   ------------------------------------------------------------------
+
+   This file is part of the Open Ephys GUI
+   Copyright (C) 2016 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 "EDITORCANVASCLASSNAME.h"
+#include "PROCESSORCLASSNAME.h"
+
+
+EDITORCANVASCLASSNAME::EDITORCANVASCLASSNAME (PROCESSORCLASSNAME* procesor)
+{
+    // Open Ephys Plugin Generator will insert generated code for editor here. Don't edit this section.
+    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_BEGIN]
+
+    addAndMakeVisible (&content);
+
+    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_END]
+}
+
+
+EDITORCANVASCLASSNAME::~EDITORCANVASCLASSNAME()
+{
+}
+
+
+void EDITORCANVASCLASSNAME::resized()
+{
+    content.setBounds (getLocalBounds());
+}
+
+
+void EDITORCANVASCLASSNAME::refreshState()
+{
+}
+
+
+void EDITORCANVASCLASSNAME::update()
+{
+}
+
+
+void EDITORCANVASCLASSNAME::refresh()
+{
+}
+
+
+void EDITORCANVASCLASSNAME::beginAnimation()
+{
+    startCallbacks();
+}
+
+
+void EDITORCANVASCLASSNAME::endAnimation()
+{
+    stopCallbacks();
+}
+
+
+void EDITORCANVASCLASSNAME::setParameter (int parameter, float newValue)
+{
+}
+
+
+void EDITORCANVASCLASSNAME::setParameter (int parameter, int val1, int val2, float newValue)
+{
+}
diff --git a/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.h b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.h
new file mode 100644
index 0000000000000000000000000000000000000000..a03819dea6124c1eb18342dfb8fccb11e5ce9cb5
--- /dev/null
+++ b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerCanvasTemplate.h
@@ -0,0 +1,81 @@
+/*
+   ------------------------------------------------------------------
+
+   This file is part of the Open Ephys GUI
+   Copyright (C) 2016 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 HEADERGUARD
+#define HEADERGUARD
+
+#include <VisualizerEditorHeaders.h>
+
+#include "PROCESSORCLASSNAME.h"
+#include "CONTENTCOMPONENTCLASSNAME.h"
+
+/**
+    Class for displaying data in any subclasses of VisualizerEditor either in the tab or separate window.
+
+    @see Visualizer, LfpDisplayCanvas, SpikeDisplayCanvas
+*/
+class EDITORCANVASCLASSNAME : public Visualizer
+{
+public:
+    /** The class constructor, used to initialize any members. */
+    EDITORCANVASCLASSNAME (PROCESSORCLASSNAME* processor);
+
+    /** The class destructor, used to deallocate memory */
+    ~EDITORCANVASCLASSNAME();
+
+    /** Called every time when canvas is resized or moved. */
+    void resized() override;
+
+    /** Called when the component's tab becomes visible again.*/
+    void refreshState() override;
+
+    /** Called when parameters of underlying data processor are changed.*/
+    void update() override;
+
+    /** Called instead of "repaint" to avoid redrawing underlying components if not necessary.*/
+    void refresh() override;
+
+    /** Called when data acquisition is active.*/
+    void beginAnimation() override;
+
+    /** Called when data acquisition ends.*/
+    void endAnimation() override;
+
+    /** Called by an editor to initiate a parameter change.*/
+    void setParameter (int, float) override;
+
+    /** Called by an editor to initiate a parameter change.*/
+    void setParameter (int, int, int, float) override;
+
+private:
+    PROCESSORCLASSNAME* processor;
+
+    // This component contains all components and graphics that were added using Projucer.
+    // It's bounds initially have same bounds as the canvas itself.
+    CONTENTCOMPONENTCLASSNAME content;
+
+    // ========================================================================
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EDITORCANVASCLASSNAME);
+};
+
+
+#endif // HEADERGUARD
diff --git a/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.cpp b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..920694c82c13b5f1b83246711b2a999a3e081403
--- /dev/null
+++ b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.cpp
@@ -0,0 +1,117 @@
+/*
+   ------------------------------------------------------------------
+
+   This file is part of the Open Ephys GUI
+   Copyright (C) 2016 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 "EDITORCLASSNAME.h"
+#include "PROCESSORCLASSNAME.h"
+#include "EDITORCANVASCLASSNAME.h"
+
+static const int EDITOR_DESIRED_WIDTH = 150;
+
+
+EDITORCLASSNAME::EDITORCLASSNAME (GenericProcessor* parentNode, bool useDefaultParameterEditors = true)
+    : GenericEditor (parentNode, useDefaultParameterEditors)
+{
+    tabText = "PLUGINGUINAME";
+
+    // Open Ephys Plugin Generator will insert generated code for editor here. Don't edit this section.
+    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_BEGIN]
+
+    addAndMakeVisible (&content);
+    setDesiredWidth (EDITOR_DESIRED_WIDTH);
+
+    //[OPENEPHYS_EDITOR_PRE_CONSTRUCTOR_SECTION_END]
+
+
+    ////Most used buttons are UtilityButton, which shows a simple button with text and ElectrodeButton, which is an on-off button which displays a channel.
+    //exampleButton = new UtilityButton ("Button text", Font ("Default", 15, Font::plain));
+    //exampleButton->setBounds (10, 30, 50, 50); //Set position and size (X, Y, XSize, YSize)
+    //exampleButton->addListener (this); //Specify which class will implement the listener methods, in the case of editors, always make the editor the listener
+    //exampleButton->setClickingTogglesState (true); //True for a on-off toggleable button, false for a single-click monostable button
+    //exampleButton->setTooltip ("Mouseover tooltip text");
+    //addAndMakeVisible (exampleButton);
+}
+
+
+EDITORCLASSNAME::~EDITORCLASSNAME()
+{
+}
+
+
+void EDITORCLASSNAME::resized()
+{
+    // Don't edit this section.
+    //[OPENEPHYS_EDITOR_PRE_RESIZE_SECTION_BEGIN]
+
+    GenericEditor::resized();
+
+    const int xPosInitial = 2;
+    const int yPosIntiial = 23;
+    const int contentWidth = (isMerger() || isSplitter() || isUtility())
+                                    ? getWidth() - xPosInitial * 2
+                                    : channelSelector->isVisible()
+                                        ? channelSelector->getX() - xPosInitial * 2 - 5
+                                        : drawerButton->getX() - xPosInitial * 2;
+    content.setBounds (xPosInitial, yPosIntiial,
+                       contentWidth, getHeight() - yPosIntiial - 7);
+
+    //[OPENEPHYS_EDITOR_PRE_RESIZE_SECTION_END]
+}
+
+
+/**
+    The listener method that reacts to the button click. The same method is called for all buttons
+    on the editor, so the button variable, which cointains a pointer to the button that called the method
+    has to be checked to know which function to perform.
+*/
+void EDITORCLASSNAME::buttonEvent (Button* button)
+{
+    //if (button == exampleButton)
+    //{
+    //    //Do Stuff
+
+    //    //a typical  example:
+    //    if (button->getToggleState()) //Button is pressed
+    //    {
+    //        getProcessor()->setParameter(0, 1);
+    //    }
+    //    else
+    //    {
+    //        getProcessor()->setParameter(0, 0);
+    //    }
+    //}
+}
+
+
+/**
+    The listener method that reacts to the changes of the particular slider of the editor.
+    We should check which slider was changed and perofrm appropriate functions.
+*/
+void EDITORCLASSNAME::sliderEvent (Slider* slider)
+{
+}
+
+
+Visualizer* EDITORCLASSNAME::createNewCanvas()
+{
+    auto processor = dynamic_cast<PROCESSORCLASSNAME*> (getProcessor());
+    return new EDITORCANVASCLASSNAME (processor);
+}
diff --git a/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.h b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.h
new file mode 100644
index 0000000000000000000000000000000000000000..6af72faa7673fa29ac57aaf03d5cdf29b0148c4c
--- /dev/null
+++ b/Source/Processors/PluginManager/Templates/openEphys_ProcessorVisualizerEditorPluginTemplate.h
@@ -0,0 +1,94 @@
+/*
+   ------------------------------------------------------------------
+
+   This file is part of the Open Ephys GUI
+   Copyright (C) 2016 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 HEADERGUARD
+#define HEADERGUARD
+
+#include <VisualizerEditorHeaders.h>
+#include "CONTENTCOMPONENTCLASSNAME.h"
+
+
+/**
+    This class serves as a template for creating new editors.
+
+    If this were a real editor, this comment section would be used to
+    describe the editor's structure. In this example, the editor will
+    have a single button which will set a parameter in the processor.
+
+    @see VisualizerEditor, GenericEditor
+*/
+class EDITORCLASSNAME : public VisualizerEditor
+{
+public:
+    /** The class constructor, used to initialize any members. */
+    EDITORCLASSNAME (GenericProcessor* parentNode, bool useDefaultParameterEditors);
+
+    /** The class destructor, used to deallocate memory */
+    ~EDITORCLASSNAME();
+
+    /**
+        Unlike processors, which have a minimum set of required methods,
+        editor are completely customized. There are still a couple of
+        sometimes useful overloaded methods, which will appear here
+    */
+
+    /** This method executes each time editor is resized. */
+    void resized() override;
+
+    /** This method executes whenever a custom button is pressed */
+    void buttonEvent (Button* button) override;
+
+    /** This method executes whenever a custom slider's value has been changed. */
+    void sliderEvent (Slider* slider) override;
+
+    /** Creates new canvas for visualizer editor. */
+    Visualizer* createNewCanvas() override;
+
+    /** Called to inform the editor that acquisition is about to start*/
+    //void startAcquisition();
+
+    /** Called to inform the editor that acquisition has just stopped*/
+    //void stopAcquisition();
+
+    /** Called whenever there is a change in the signal chain or it refreshes.
+      It's called after the processors' same named method.
+      */
+    //void updateSettings();
+
+
+private:
+    // This component contains all components and graphics that were added using Projucer.
+    // It's bounds initially the same bounds as the gray workspace (but only till the drawerButton for X)
+    CONTENTCOMPONENTCLASSNAME content;
+
+    /**
+        Here would be all the required internal variables.
+        In this case, we have a single button.
+    */
+    //Always use JUCE RAII classes instead of pure pointers.
+    //ScopedPointer<Button> exampleButton;
+
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EDITORCLASSNAME);
+};
+
+#endif // HEADERGUARD