diff --git a/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/JuceHeader.h
index 085ff30b7f42c3d9ce633dd4c4f4ee90189ad055..f0c484a5a181a3ceae656618009bd26a54c20bb7 100644
--- a/JuceLibraryCode/JuceHeader.h
+++ b/JuceLibraryCode/JuceHeader.h
@@ -13,7 +13,9 @@
 #ifndef __APPHEADERFILE_YNSYIRR__
 #define __APPHEADERFILE_YNSYIRR__
 
+#ifndef JUCE_OPEN_EPHYS_PLUGIN_GENERATOR // to avoid redefinition error when using juce header.
 #include "AppConfig.h"
+#endif
 
 #include <juce_audio_basics/juce_audio_basics.h>
 #include <juce_audio_devices/juce_audio_devices.h>
@@ -30,14 +32,15 @@
 #include <juce_opengl/juce_opengl.h>
 #include <juce_video/juce_video.h>
 
-#include "BinaryData.h"
-
 #if ! DONT_SET_USING_JUCE_NAMESPACE
  // If your code uses a lot of JUCE classes, then this will obviously save you
  // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE.
  using namespace juce;
 #endif
 
+#ifndef JUCE_OPEN_EPHYS_PLUGIN_GENERATOR // to avoid redefinition error when using juce header.
+#include "BinaryData.h"
+
 #if ! JUCE_DONT_DECLARE_PROJECTINFO
 namespace ProjectInfo
 {
@@ -46,5 +49,6 @@ namespace ProjectInfo
     const int          versionNumber  = 0x400;
 }
 #endif
+#endif
 
 #endif   // __APPHEADERFILE_YNSYIRR__
diff --git a/PluginGenerator/Builds/LinuxMakefile/Makefile b/PluginGenerator/Builds/LinuxMakefile/Makefile
index 6fde094588d902d3ee5d139594dbb78a56d48fe7..d7c8dc4867bd17d9f907015d0545f2b5118ea867 100644
--- a/PluginGenerator/Builds/LinuxMakefile/Makefile
+++ b/PluginGenerator/Builds/LinuxMakefile/Makefile
@@ -86,6 +86,11 @@ OBJECTS := \
   $(OBJDIR)/jucer_ProjectExporter_eefe2e5b.o \
   $(OBJDIR)/jucer_ProjectSaver_38b16c25.o \
   $(OBJDIR)/jucer_ResourceFile_6af120d3.o \
+  $(OBJDIR)/MaterialButtonLookAndFeel_ccb23013.o \
+  $(OBJDIR)/MaterialSliderLookAndFeel_be5e6a84.o \
+  $(OBJDIR)/ButtonGroupManager_48c303e9.o \
+  $(OBJDIR)/LinearButtonGroupManager_ee5ece6e.o \
+  $(OBJDIR)/TiledButtonGroupManager_9e681e17.o \
   $(OBJDIR)/jucer_CodeHelpers_c317179c.o \
   $(OBJDIR)/jucer_FileHelpers_f98ed0ad.o \
   $(OBJDIR)/jucer_Icons_9db2f51e.o \
@@ -307,6 +312,31 @@ $(OBJDIR)/jucer_ResourceFile_6af120d3.o: ../../Source/Project\ Saving/jucer_Reso
 	@echo "Compiling jucer_ResourceFile.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/MaterialButtonLookAndFeel_ccb23013.o: ../../../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling MaterialButtonLookAndFeel.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/MaterialSliderLookAndFeel_be5e6a84.o: ../../../Source/UI/LookAndFeel/MaterialSliderLookAndFeel.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling MaterialSliderLookAndFeel.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/ButtonGroupManager_48c303e9.o: ../../../Source/UI/Utils/ButtonGroupManager.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling ButtonGroupManager.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/LinearButtonGroupManager_ee5ece6e.o: ../../../Source/UI/Utils/LinearButtonGroupManager.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LinearButtonGroupManager.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/TiledButtonGroupManager_9e681e17.o: ../../../Source/UI/Utils/TiledButtonGroupManager.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling TiledButtonGroupManager.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/jucer_CodeHelpers_c317179c.o: ../../Source/Utility/jucer_CodeHelpers.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling jucer_CodeHelpers.cpp"
diff --git a/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj b/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
index ee6755ea6ed4c2de81e471a361a194852ab6fe7c..83ab5c336636eae9599c2927ab396a95cce7400d 100644
--- a/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
+++ b/PluginGenerator/Builds/MacOSX/OpenEphys_PluginGenerator.xcodeproj/project.pbxproj
@@ -61,6 +61,11 @@
 		1F37544891EC8DBB5E500C1C = {isa = PBXBuildFile; fileRef = F71AF6D2DF3E652F8B51EBAB; };
 		0C5F43C262695A3EB7A9E1C0 = {isa = PBXBuildFile; fileRef = 14A24BB4AB7B81D40EF062E5; };
 		110221CD5578153B528AD2BE = {isa = PBXBuildFile; fileRef = D10D51A0A2D63F38B4D86A60; };
+		4A7EAE537E848B6371DA77E7 = {isa = PBXBuildFile; fileRef = C8014348357FB800DD39F628; };
+		3DC21316BD44A399A31BFEB4 = {isa = PBXBuildFile; fileRef = 03D81EF40B73C96044412AEA; };
+		9856166603880FC8318433DE = {isa = PBXBuildFile; fileRef = AE98FAEC5E4C8B0B7A1DA6F3; };
+		56C66B069412D807A3EE3D40 = {isa = PBXBuildFile; fileRef = C2280BC635F02A7126E911C4; };
+		4788DC089FA90E35CC987509 = {isa = PBXBuildFile; fileRef = 833A65B7B3E8BAD74EE3E470; };
 		CD4F7B119CE718BCE78D61F4 = {isa = PBXBuildFile; fileRef = 9B9CAD20E1243B4351B4C8D8; };
 		78CB463DD98A55313A543859 = {isa = PBXBuildFile; fileRef = 1729AEDC34001C31B8CC357C; };
 		1499DF2E85B05AC1BF423773 = {isa = PBXBuildFile; fileRef = CF21D9DB3AEC0A4DCAB36A99; };
@@ -91,6 +96,7 @@
 		02CA8C3BE552E240C77A3722 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0329C05B4EE23CBB5578BF02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; };
 		03D3053EDE47FED1919C6674 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AudioPluginFilterTemplate.h"; path = "../../Source/BinaryData/jucer_AudioPluginFilterTemplate.h"; sourceTree = "SOURCE_ROOT"; };
+		03D81EF40B73C96044412AEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MaterialSliderLookAndFeel.cpp; path = ../../../Source/UI/LookAndFeel/MaterialSliderLookAndFeel.cpp; sourceTree = "SOURCE_ROOT"; };
 		0400CB0E056A1D840304D2DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_CommandLine.cpp"; path = "../../Source/Application/jucer_CommandLine.cpp"; sourceTree = "SOURCE_ROOT"; };
 		043FC175E80305E3D95ECAF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NotificationType.h"; path = "../../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h"; sourceTree = "SOURCE_ROOT"; };
 		049A726AFEC564314777C076 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_AndroidBase.h"; path = "../../Source/Project Saving/jucer_ProjectExport_AndroidBase.h"; sourceTree = "SOURCE_ROOT"; };
@@ -108,6 +114,7 @@
 		087CB3A961CD3C7434D660A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizard.h"; path = "../../Source/Wizards/jucer_NewProjectWizard.h"; sourceTree = "SOURCE_ROOT"; };
 		08AF500230E8F8644B3682F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MainMenu.mm"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm"; sourceTree = "SOURCE_ROOT"; };
 		08E815AF5FC4D7DCC66055CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = "../../../JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h"; sourceTree = "SOURCE_ROOT"; };
+		08FD0ED30B3390C39C63B158 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MaterialSliderLookAndFeel.h; path = ../../../Source/UI/LookAndFeel/MaterialSliderLookAndFeel.h; sourceTree = "SOURCE_ROOT"; };
 		09261261800229B6438A9A5B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		09739F17883B08498F571B2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = png.h; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h"; sourceTree = "SOURCE_ROOT"; };
 		09BB016660D64FDCD2A9866F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -242,6 +249,7 @@
 		27E909E8C27DFBF0F184DCBD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; };
 		27F7865BD6FE03B970B8DBFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2802BE05CAC2BE78EFD5A239 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImagePreviewComponent.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		281096EB17B1ACA733A9B7A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TiledButtonGroupManager.h; path = ../../../Source/UI/Utils/TiledButtonGroupManager.h; sourceTree = "SOURCE_ROOT"; };
 		2875464712C12E9BFCCEE57D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooser.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h"; sourceTree = "SOURCE_ROOT"; };
 		28A5DF3CEA69B587C9CA7C4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsPostScriptRenderer.cpp"; path = "../../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		28C9E13B1A70FDC728770C6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; };
@@ -432,6 +440,7 @@
 		529B0A44694A54ED99444A0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; };
 		529B9F1BADEE58EA9F4F8C09 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_FileChooser.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		52A4289E71132A45D5C3EAE7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngwutil.c; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c"; sourceTree = "SOURCE_ROOT"; };
+		52C2B96495534A2B06ACE6AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MaterialButtonLookAndFeel.h; path = ../../../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.h; sourceTree = "SOURCE_ROOT"; };
 		530ADBF1045867FE90EB8F1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Messaging.cpp"; path = "../../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; };
 		53151B683E11F420203E61C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewCppFileTemplate.h"; path = "../../Source/BinaryData/jucer_NewCppFileTemplate.h"; sourceTree = "SOURCE_ROOT"; };
 		5377705718D6D60A6AA2848F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ActiveXComponent.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -631,6 +640,7 @@
 		825F21A8A32CC0FD20B845A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		82976E18712BAE638A132F02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterProcessLock.h"; path = "../../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h"; sourceTree = "SOURCE_ROOT"; };
 		82C7BF9F5E863E647438A8AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; };
+		833A65B7B3E8BAD74EE3E470 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TiledButtonGroupManager.cpp; path = ../../../Source/UI/Utils/TiledButtonGroupManager.cpp; sourceTree = "SOURCE_ROOT"; };
 		83C7547CCAFCBB88F791FED8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; };
 		842427CFE565F3FCE5B99174 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
 		84493A7AD6B0398B732461FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; };
@@ -695,6 +705,7 @@
 		92DECC0E4EBC843391AF7DB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngget.c; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c"; sourceTree = "SOURCE_ROOT"; };
 		92E4C9A69A2DAD900D128A02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
 		92F91DC29B64AD85B1F508BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GenericComponentHandler.h"; path = "../../Source/ComponentEditor/components/jucer_GenericComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
+		93A8E777B774ACDA887E9C0E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LinearButtonGroupManager.h; path = ../../../Source/UI/Utils/LinearButtonGroupManager.h; sourceTree = "SOURCE_ROOT"; };
 		93B419190CCE92ACAB1ED25B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ColouredElement.cpp"; path = "../../Source/ComponentEditor/paintelements/jucer_ColouredElement.cpp"; sourceTree = "SOURCE_ROOT"; };
 		93B474F28D09D858DE16E881 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
 		93C5BEADA1AB1CFF7B167D2F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -797,6 +808,7 @@
 		AC70D9D3E27592DD5D19B935 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AD828AEF8A826DCAD19095B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AE1BC6DCCFC1A18E2ACE23F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_NoWindow.cpp"; path = "../../Source/BinaryData/jucer_MainTemplate_NoWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
+		AE98FAEC5E4C8B0B7A1DA6F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ButtonGroupManager.cpp; path = ../../../Source/UI/Utils/ButtonGroupManager.cpp; sourceTree = "SOURCE_ROOT"; };
 		AECBC5CBB388E4EB95660B02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = "../../../JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c"; sourceTree = "SOURCE_ROOT"; };
 		AF51A8DC8E67D8EB660AD6D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Value.h"; path = "../../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h"; sourceTree = "SOURCE_ROOT"; };
 		AF57278F8F46D86B4EBA449E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "projucer_CompileEngineServer.h"; path = "../../Source/LiveBuildEngine/projucer_CompileEngineServer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -828,6 +840,7 @@
 		B54CB8DDB5000BDCBDECD8BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		B5CB69026BC4E8F439355CDC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "projucer_SourceCodeRange.h"; path = "../../Source/LiveBuildEngine/projucer_SourceCodeRange.h"; sourceTree = "SOURCE_ROOT"; };
 		B5F94A37629F841C6C2B4CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedXLock.h"; path = "../../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h"; sourceTree = "SOURCE_ROOT"; };
+		B65C3D8EB470775244803FD3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ButtonGroupManager.h; path = ../../../Source/UI/Utils/ButtonGroupManager.h; sourceTree = "SOURCE_ROOT"; };
 		B68B2E4185C6FDCEEE0DBA79 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; };
 		B72DAC469A62BD52C86102E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../../JuceLibraryCode/modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
 		B741170E45D74F30B7D5CDDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentNameProperty.h"; path = "../../Source/ComponentEditor/components/jucer_ComponentNameProperty.h"; sourceTree = "SOURCE_ROOT"; };
@@ -879,6 +892,7 @@
 		C187718F7B9EBA88584B43F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutine.cpp"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C21AD85C35257A4B9A74D522 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; };
 		C22791DB75870C4F102AA8A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SlidingPanelComponent.h"; path = "../../Source/Utility/jucer_SlidingPanelComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		C2280BC635F02A7126E911C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LinearButtonGroupManager.cpp; path = ../../../Source/UI/Utils/LinearButtonGroupManager.cpp; sourceTree = "SOURCE_ROOT"; };
 		C2990A8D054BC230E7C637C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewProjectWizardClasses.h"; path = "../../Source/Wizards/jucer_NewProjectWizardClasses.h"; sourceTree = "SOURCE_ROOT"; };
 		C2EEEB5E55C76817AC291BF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; };
 		C3AB2FD3B067F2AD883FE793 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cderror.h; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h"; sourceTree = "SOURCE_ROOT"; };
@@ -897,6 +911,7 @@
 		C7B47372A9D5970E3D9A5400 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupInformationComponent.h"; path = "../../Source/Project/jucer_GroupInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		C7B6983AD1896535B9B98F40 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageManager.cpp"; path = "../../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C7D4CFEA33205B2D33955B9E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
+		C8014348357FB800DD39F628 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MaterialButtonLookAndFeel.cpp; path = ../../../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.cpp; sourceTree = "SOURCE_ROOT"; };
 		C81BC495F7C4B665C8856AA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C85BCA043B9CB378FA6876B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C879F5FBCAACFD533EBEDF91 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdmainct.c; path = "../../../JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1304,7 +1319,21 @@
 					9C04F9680F82BF279D528688,
 					D10D51A0A2D63F38B4D86A60,
 					C9616830BB2474066AC8C910, ); name = "Project Saving"; sourceTree = "<group>"; };
+		06487A04FFCD1B6C8C639B43 = {isa = PBXGroup; children = (
+					C8014348357FB800DD39F628,
+					52C2B96495534A2B06ACE6AF,
+					03D81EF40B73C96044412AEA,
+					08FD0ED30B3390C39C63B158, ); name = LookAndFeel; sourceTree = "<group>"; };
+		DA2A2B72BDCC0958C26274DE = {isa = PBXGroup; children = (
+					AE98FAEC5E4C8B0B7A1DA6F3,
+					B65C3D8EB470775244803FD3,
+					C2280BC635F02A7126E911C4,
+					93A8E777B774ACDA887E9C0E,
+					833A65B7B3E8BAD74EE3E470,
+					281096EB17B1ACA733A9B7A7, ); name = Utils; sourceTree = "<group>"; };
 		6580E53C420AA794542CC8D7 = {isa = PBXGroup; children = (
+					06487A04FFCD1B6C8C639B43,
+					DA2A2B72BDCC0958C26274DE,
 					9B9CAD20E1243B4351B4C8D8,
 					914ADDB50ED7365F08BA91F9,
 					DF78EF6242D82F912534A277,
@@ -2490,6 +2519,11 @@
 					1F37544891EC8DBB5E500C1C,
 					0C5F43C262695A3EB7A9E1C0,
 					110221CD5578153B528AD2BE,
+					4A7EAE537E848B6371DA77E7,
+					3DC21316BD44A399A31BFEB4,
+					9856166603880FC8318433DE,
+					56C66B069412D807A3EE3D40,
+					4788DC089FA90E35CC987509,
 					CD4F7B119CE718BCE78D61F4,
 					78CB463DD98A55313A543859,
 					1499DF2E85B05AC1BF423773,
diff --git a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
index ef26d574c3d893cd191f61c4bc1d91c0ea6cf5bb..a77c235a6e9836789befd4e47e5632a23ee02be9 100644
--- a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
+++ b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj
@@ -171,6 +171,11 @@
     <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"/>
     <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectSaver.cpp"/>
     <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\ButtonGroupManager.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_FileHelpers.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_Icons.cpp"/>
@@ -1438,6 +1443,11 @@
     <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExporter.h"/>
     <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectSaver.h"/>
     <ClInclude Include="..\..\Source\Project Saving\jucer_ResourceFile.h"/>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.h"/>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\ButtonGroupManager.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_ColourPropertyComponent.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_Colours.h"/>
diff --git a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
index 0ddd3a276c8977a0ce34094cfcc5accb233fd7ca..3c430ca25e5d1d8d09e85072c755bdbee1d4359a 100644
--- a/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
+++ b/PluginGenerator/Builds/VisualStudio2013/OpenEphys_PluginGenerator.vcxproj.filters
@@ -41,6 +41,12 @@
     <Filter Include="OpenEphys_PluginGenerator\Utility">
       <UniqueIdentifier>{E2DF8972-90D2-24DD-8A0A-975636458A79}</UniqueIdentifier>
     </Filter>
+    <Filter Include="OpenEphys_PluginGenerator\Utility\LookAndFeel">
+      <UniqueIdentifier>{7BD1873F-23C8-042A-19FF-1F2E347F13EE}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="OpenEphys_PluginGenerator\Utility\Utils">
+      <UniqueIdentifier>{DCC29866-2C98-0A59-0BF9-1640B818D682}</UniqueIdentifier>
+    </Filter>
     <Filter Include="OpenEphys_PluginGenerator\Wizards">
       <UniqueIdentifier>{8319DD92-AD5C-F8E7-50DD-9B43C14D54ED}</UniqueIdentifier>
     </Filter>
@@ -379,6 +385,21 @@
     <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp">
       <Filter>OpenEphys_PluginGenerator\Project Saving</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\ButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp">
       <Filter>OpenEphys_PluginGenerator\Utility</Filter>
     </ClCompile>
@@ -2007,6 +2028,21 @@
     <ClInclude Include="..\..\Source\Project Saving\jucer_ResourceFile.h">
       <Filter>OpenEphys_PluginGenerator\Project Saving</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\ButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h">
       <Filter>OpenEphys_PluginGenerator\Utility</Filter>
     </ClInclude>
diff --git a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
index d2e30e4dc51f2c1bd43ffd39bea3e0445365b8bf..50344fd47b04c6a54dc37f687499ac6c4cfc9597 100644
--- a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
+++ b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj
@@ -171,6 +171,11 @@
     <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"/>
     <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectSaver.cpp"/>
     <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\ButtonGroupManager.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.cpp"/>
+    <ClCompile Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_FileHelpers.cpp"/>
     <ClCompile Include="..\..\Source\Utility\jucer_Icons.cpp"/>
@@ -1438,6 +1443,11 @@
     <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExporter.h"/>
     <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectSaver.h"/>
     <ClInclude Include="..\..\Source\Project Saving\jucer_ResourceFile.h"/>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.h"/>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\ButtonGroupManager.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.h"/>
+    <ClInclude Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_ColourPropertyComponent.h"/>
     <ClInclude Include="..\..\Source\Utility\jucer_Colours.h"/>
diff --git a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
index 6a57907712efc461ba5394bc69f0482db2ba69dc..ef20e221bcfab524a113409c25e8602b0585aa5c 100644
--- a/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
+++ b/PluginGenerator/Builds/VisualStudio2015/OpenEphys_PluginGenerator.vcxproj.filters
@@ -41,6 +41,12 @@
     <Filter Include="OpenEphys_PluginGenerator\Utility">
       <UniqueIdentifier>{E2DF8972-90D2-24DD-8A0A-975636458A79}</UniqueIdentifier>
     </Filter>
+    <Filter Include="OpenEphys_PluginGenerator\Utility\LookAndFeel">
+      <UniqueIdentifier>{7BD1873F-23C8-042A-19FF-1F2E347F13EE}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="OpenEphys_PluginGenerator\Utility\Utils">
+      <UniqueIdentifier>{DCC29866-2C98-0A59-0BF9-1640B818D682}</UniqueIdentifier>
+    </Filter>
     <Filter Include="OpenEphys_PluginGenerator\Wizards">
       <UniqueIdentifier>{8319DD92-AD5C-F8E7-50DD-9B43C14D54ED}</UniqueIdentifier>
     </Filter>
@@ -379,6 +385,21 @@
     <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp">
       <Filter>OpenEphys_PluginGenerator\Project Saving</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\ButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.cpp">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp">
       <Filter>OpenEphys_PluginGenerator\Utility</Filter>
     </ClCompile>
@@ -2007,6 +2028,21 @@
     <ClInclude Include="..\..\Source\Project Saving\jucer_ResourceFile.h">
       <Filter>OpenEphys_PluginGenerator\Project Saving</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialButtonLookAndFeel.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\LookAndFeel\MaterialSliderLookAndFeel.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\LookAndFeel</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\ButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\LinearButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\Source\UI\Utils\TiledButtonGroupManager.h">
+      <Filter>OpenEphys_PluginGenerator\Utility\Utils</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\Source\Utility\jucer_CodeHelpers.h">
       <Filter>OpenEphys_PluginGenerator\Utility</Filter>
     </ClInclude>
diff --git a/PluginGenerator/Projucer.jucer b/PluginGenerator/Projucer.jucer
index bfd2b9cf35e942b6b7c04353f1ee49ba97cb2b89..1854b6cffe4e5c61da4512ba11538266fcc6b903 100644
--- a/PluginGenerator/Projucer.jucer
+++ b/PluginGenerator/Projucer.jucer
@@ -387,7 +387,7 @@
       <FILE id="eecwL8" name="jucer_Project.cpp" compile="1" resource="0"
             file="Source/Project/jucer_Project.cpp"/>
       <FILE id="p7qo62" name="jucer_Project.h" compile="0" resource="0" file="Source/Project/jucer_Project.h"/>
-      <FILE id="rhvzYd" name="jucer_ProjectContentComponent.cpp" compile="0"
+      <FILE id="phG5zJ" name="jucer_ProjectContentComponent.cpp" compile="0"
             resource="0" file="Source/Project/jucer_ProjectContentComponent.cpp"/>
       <FILE id="xDGBxS" name="jucer_ProjectContentComponent.h" compile="0"
             resource="0" file="Source/Project/jucer_ProjectContentComponent.h"/>
@@ -431,6 +431,30 @@
             file="Source/Project Saving/jucer_ResourceFile.h"/>
     </GROUP>
     <GROUP id="{58EB50D9-0F01-AF9B-087B-93DB283A339D}" name="Utility">
+      <GROUP id="{E62211FC-D300-1C0B-03D9-659EF1B391B9}" name="LookAndFeel">
+        <FILE id="RjWumG" name="MaterialButtonLookAndFeel.cpp" compile="1"
+              resource="0" file="../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.cpp"/>
+        <FILE id="aHgAz4" name="MaterialButtonLookAndFeel.h" compile="0" resource="0"
+              file="../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.h"/>
+        <FILE id="ElKr8c" name="MaterialSliderLookAndFeel.cpp" compile="1"
+              resource="0" file="../Source/UI/LookAndFeel/MaterialSliderLookAndFeel.cpp"/>
+        <FILE id="DKvgBi" name="MaterialSliderLookAndFeel.h" compile="0" resource="0"
+              file="../Source/UI/LookAndFeel/MaterialSliderLookAndFeel.h"/>
+      </GROUP>
+      <GROUP id="{E2C1EF21-0DC8-2F0E-AF9E-052BCBD179AE}" name="Utils">
+        <FILE id="lTIMco" name="ButtonGroupManager.cpp" compile="1" resource="0"
+              file="../Source/UI/Utils/ButtonGroupManager.cpp"/>
+        <FILE id="EmUNYK" name="ButtonGroupManager.h" compile="0" resource="0"
+              file="../Source/UI/Utils/ButtonGroupManager.h"/>
+        <FILE id="EBJFkv" name="LinearButtonGroupManager.cpp" compile="1" resource="0"
+              file="../Source/UI/Utils/LinearButtonGroupManager.cpp"/>
+        <FILE id="rO6udt" name="LinearButtonGroupManager.h" compile="0" resource="0"
+              file="../Source/UI/Utils/LinearButtonGroupManager.h"/>
+        <FILE id="NRlbfV" name="TiledButtonGroupManager.cpp" compile="1" resource="0"
+              file="../Source/UI/Utils/TiledButtonGroupManager.cpp"/>
+        <FILE id="OSP7ow" name="TiledButtonGroupManager.h" compile="0" resource="0"
+              file="../Source/UI/Utils/TiledButtonGroupManager.h"/>
+      </GROUP>
       <FILE id="TX2oGI" name="jucer_CodeHelpers.cpp" compile="1" resource="0"
             file="Source/Utility/jucer_CodeHelpers.cpp"/>
       <FILE id="mpDJct" name="jucer_CodeHelpers.h" compile="0" resource="0"
diff --git a/PluginGenerator/Source/Project/jucer_ConfigTree_Base.h b/PluginGenerator/Source/Project/jucer_ConfigTree_Base.h
index 7e787b29a9fb535115b6f8887fb4e8e5c30161d5..979f9c81fad62050f97a58bd89f2b8998bb2ff54 100644
--- a/PluginGenerator/Source/Project/jucer_ConfigTree_Base.h
+++ b/PluginGenerator/Source/Project/jucer_ConfigTree_Base.h
@@ -22,6 +22,9 @@
   ==============================================================================
 */
 
+
+// Open Ephys
+
 class PropertyGroupComponent  : public Component
 {
 public:
@@ -57,9 +60,7 @@ public:
         const Colour bkg (findColour (mainBackgroundColourId));
 
         g.setColour (Colours::white.withAlpha (0.35f));
-        g.fillRect (0, 30, getWidth(), getHeight() - 38);
-
-        g.setFont (Font (15.0f, Font::bold));
+        g.fillRect (0, 30, getWidth(), getHeight() - 38); g.setFont (Font (15.0f, Font::bold));
         g.setColour (bkg.contrasting (0.7f));
         g.drawFittedText (getName(), 12, 0, getWidth() - 16, 25, Justification::bottomLeft, 1);
     }
@@ -298,8 +299,9 @@ private:
     ValueTree exportersTree;
 
     //==============================================================================
-    class SettingsComp  : public Component,
-                          private ChangeListener
+    class SettingsComp  : public Component
+                        , public Button::Listener
+                        , private ChangeListener
     {
     public:
         SettingsComp (Project& p)  : project (p)
@@ -308,6 +310,48 @@ private:
 
             updatePropertyList();
             project.addChangeListener (this);
+
+            static const Colour COLOUR_PRIMARY (Colours::black.withAlpha (0.87f));
+            static const Colour COLOUR_ACCENT  (Colour::fromRGB (3, 169, 244));
+
+            TextButton* projectSettingsButton = new TextButton ("Project", "Switch to project settings tab");
+            projectSettingsButton->setComponentID (PROJECT_SETTINGS_BUTTON_ID);
+            projectSettingsButton->setClickingTogglesState (true);
+            projectSettingsButton->setToggleState (true, dontSendNotification);
+            projectSettingsButton->setColour (TextButton::buttonColourId,     Colour (0x0));
+            projectSettingsButton->setColour (TextButton::buttonOnColourId,   Colour (0x0));
+            projectSettingsButton->setColour (TextButton::textColourOffId,    COLOUR_PRIMARY);
+            projectSettingsButton->setColour (TextButton::textColourOnId,     COLOUR_ACCENT);
+
+            TextButton* pluginSettingsButton = new TextButton ("Plugin", "Switch to plugin settings tab");
+            pluginSettingsButton->setComponentID (PLUGIN_SETTINGS_BUTTON_ID);
+            pluginSettingsButton->setClickingTogglesState (true);
+            pluginSettingsButton->setColour (TextButton::buttonColourId,     Colour (0x0));
+            pluginSettingsButton->setColour (TextButton::buttonOnColourId,   Colour (0x0));
+            pluginSettingsButton->setColour (TextButton::textColourOffId,    COLOUR_PRIMARY);
+            pluginSettingsButton->setColour (TextButton::textColourOnId,     COLOUR_ACCENT);
+
+            TextButton* editorSettingsButton = new TextButton ("Editor", "Switch to editor settings tab");
+            editorSettingsButton->setComponentID (EDITOR_SETTINGS_BUTTON_ID);
+            editorSettingsButton->setClickingTogglesState (true);
+            editorSettingsButton->setColour (TextButton::buttonColourId,     Colour (0x0));
+            editorSettingsButton->setColour (TextButton::buttonOnColourId,   Colour (0x0));
+            editorSettingsButton->setColour (TextButton::textColourOffId,    COLOUR_PRIMARY);
+            editorSettingsButton->setColour (TextButton::textColourOnId,     COLOUR_ACCENT);
+
+            // Open Ephys
+            m_buttonGroupManager.addButton (projectSettingsButton);
+            m_buttonGroupManager.addButton (pluginSettingsButton);
+            m_buttonGroupManager.addButton (editorSettingsButton);
+            m_buttonGroupManager.setRadioButtonMode (true);
+            m_buttonGroupManager.setButtonListener (this);
+            m_buttonGroupManager.setButtonsLookAndFeel (m_materialButtonLookAndFeel);
+            m_buttonGroupManager.setColour (ButtonGroupManager::backgroundColourId,   Colours::white);
+            m_buttonGroupManager.setColour (ButtonGroupManager::outlineColourId,      Colour (0x0));
+            m_buttonGroupManager.setColour (LinearButtonGroupManager::accentColourId, COLOUR_ACCENT);
+            addChildComponent (&m_buttonGroupManager);
+
+            m_buttonGroupManager.setVisible (project.getProjectType().isOpenEphysPlugin());
         }
 
         ~SettingsComp()
@@ -315,9 +359,28 @@ private:
             project.removeChangeListener (this);
         }
 
+        Rectangle<int> updateSizeAndGetNewBounds()
+        {
+            const int groupComponentWidth = jmax (550, getParentWidth() - 20);
+            const bool isOpenEphysPlugin = project.getProjectType().isOpenEphysPlugin();
+
+            int y = isOpenEphysPlugin ? 25 : 0;
+            y += group.updateSize (12, y, groupComponentWidth - 12);
+
+            m_buttonGroupManager.setBounds (0, 0, 300, 36);
+
+            return Rectangle<int> (0, 0, groupComponentWidth, y);
+        }
+
         void parentSizeChanged() override
         {
-            updateSize (*this, group);
+            const auto newBounds = updateSizeAndGetNewBounds();
+            setSize (newBounds.getWidth(), newBounds.getHeight());
+        }
+
+        void resized() override
+        {
+            updateSizeAndGetNewBounds();
         }
 
         void updatePropertyList()
@@ -325,12 +388,29 @@ private:
             PropertyListBuilder props;
             project.createPropertyEditors (props);
             group.setProperties (props);
-            group.setName ("Project Settings");
+            //group.setName ("Project Settings");
 
             lastProjectType = project.getProjectTypeValue().getValue();
             parentSizeChanged();
         }
 
+        void buttonClicked (Button* buttonThatWasClicked)
+        {
+            const auto buttonID = buttonThatWasClicked->getComponentID();
+            if (buttonID == PROJECT_SETTINGS_BUTTON_ID)
+            {
+                group.setVisible (true);
+            }
+            else if (buttonID == PLUGIN_SETTINGS_BUTTON_ID)
+            {
+                group.setVisible (false);
+            }
+            else if (buttonID == EDITOR_SETTINGS_BUTTON_ID)
+            {
+                group.setVisible (false);
+            }
+        }
+
         void changeListenerCallback (ChangeBroadcaster*) override
         {
             if (lastProjectType != project.getProjectTypeValue().getValue())
@@ -342,6 +422,14 @@ private:
         var lastProjectType;
         PropertyGroupComponent group;
 
+        LinearButtonGroupManager m_buttonGroupManager;
+
+        SharedResourcePointer<MaterialButtonLookAndFeel> m_materialButtonLookAndFeel;
+
+        static constexpr const char* PROJECT_SETTINGS_BUTTON_ID     = "projectSettingsTab";
+        static constexpr const char* PLUGIN_SETTINGS_BUTTON_ID      = "pluginSettingsTab";
+        static constexpr const char* EDITOR_SETTINGS_BUTTON_ID      = "editorSettingsTab";
+
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
     };
 
diff --git a/PluginGenerator/Source/Project/jucer_Project.cpp b/PluginGenerator/Source/Project/jucer_Project.cpp
index db3248b090e6541bcfd5ce99db0a813c5bfef6ed..42e545b257dc68a4b908281f9de8943da0dc50a8 100644
--- a/PluginGenerator/Source/Project/jucer_Project.cpp
+++ b/PluginGenerator/Source/Project/jucer_Project.cpp
@@ -30,6 +30,7 @@
 #include "../Application/jucer_OpenDocumentManager.h"
 #include "../Application/jucer_Application.h"
 
+
 namespace
 {
     String makeValid4CC (const String& seed)
@@ -122,6 +123,9 @@ void Project::setMissingDefaultValues()
     if (getProjectType().isAudioPlugin())
         setMissingAudioPluginDefaultValues();
 
+    if (getProjectType().isOpenEphysPlugin())
+        setMissingOpenEphysPluginDefaultValues();
+
     getModules().sortAlphabetically();
 
     if (getBundleIdentifier().toString().isEmpty())
@@ -171,6 +175,21 @@ void Project::setMissingAudioPluginDefaultValues()
     setValueIfVoid (getPluginAAXCategory(),             "AAX_ePlugInCategory_Dynamics");
 }
 
+void Project::setMissingOpenEphysPluginDefaultValues()
+{
+    const String sanitisedProjectName (CodeHelpers::makeValidIdentifier (getTitle(), false, true, false));
+
+    setValueIfVoid (getPluginName(),                    getTitle());
+    setValueIfVoid (getPluginDesc(),                    getTitle());
+    setValueIfVoid (getPluginManufacturer(),            "yourcompany");
+    setValueIfVoid (getPluginManufacturerCode(),        "Manu");
+    setValueIfVoid (getPluginCode(),                    makeValid4CC (getProjectUID() + getProjectUID()));
+
+    setValueIfVoid (getOpenEphysPluginType(),                       NOT_A_PLUGIN_TYPE);
+    setValueIfVoid (getOpenEphysPluginProcessorType(),              PROCESSOR_TYPE_INVALID);
+    setValueIfVoid (getOpenEphysPluginFileSourceSupportedExts(),    "");
+}
+
 void Project::updateOldStyleConfigList()
 {
     ValueTree deprecatedConfigsList (projectRoot.getChildWithName (Ids::CONFIGURATIONS));
@@ -462,6 +481,9 @@ void Project::createPropertyEditors (PropertyListBuilder& props)
     if (getProjectType().isAudioPlugin())
         createAudioPluginPropertyEditors (props);
 
+    if (getProjectType().isOpenEphysPlugin())
+        createOpenEphysPluginPropertyEditors (props);
+
     {
         const int maxSizes[] = { 20480, 10240, 6144, 2048, 1024, 512, 256, 128, 64 };
 
@@ -574,6 +596,51 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)
                "The value to use for the JucePlugin_AAXIdentifier setting");
 }
 
+void Project::createOpenEphysPluginPropertyEditors (PropertyListBuilder& props)
+{
+    props.add (new TextPropertyComponent (getPluginName(), "Plugin Display Name", 128, false),
+               "The name of your plugin that will be displayed in the Open Ephys GUI (keep it short!)");
+    props.add (new TextPropertyComponent (getPluginDesc(), "Plugin Description", 256, false),
+               "A short description of your plugin.");
+
+    props.add (new TextPropertyComponent (getPluginManufacturer(), "Plugin Manufacturer", 256, false),
+               "The name of your company (cannot be blank).");
+    props.add (new TextPropertyComponent (getPluginManufacturerCode(), "Plugin Manufacturer Code", 4, false),
+               "A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!");
+    props.add (new TextPropertyComponent (getPluginCode(), "Plugin Code", 4, false),
+               "A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!");
+
+    // Plugin types
+    props.add (new TextPropertyComponent (getOpenEphysPluginType(), "Plugin Type", 128, false),
+               "Select type of the Open Ephys plugin");
+
+    // Processor types
+    StringArray processorTypesNames;
+    Array<var> processorTypesVar;
+    Array<PluginProcessorType> processorTypes;
+    processorTypes.add (PROCESSOR_TYPE_FILTER);
+    processorTypes.add (PROCESSOR_TYPE_SOURCE);
+    processorTypes.add (PROCESSOR_TYPE_SINK);
+    processorTypes.add (PROCESSOR_TYPE_SPLITTER);
+    processorTypes.add (PROCESSOR_TYPE_MERGER);
+    processorTypes.add (PROCESSOR_TYPE_UTILITY);
+
+    for (int i = 0; i < processorTypes.size(); ++i)
+    {
+        processorTypesNames.add (getProcessorTypeHumanReadableName (processorTypes[i]));
+        processorTypesVar.add (processorTypes[i]);
+    }
+
+    props.add (new ChoicePropertyComponent (getOpenEphysPluginProcessorType(), "Plugin type", processorTypesNames, processorTypesVar));
+
+    // FileSource plugin type
+    if (getPluginType() == PLUGIN_TYPE_FILE_SOURCE)
+    {
+        props.add (new TextPropertyComponent (getOpenEphysPluginFileSourceSupportedExts(), "Supported file extensions", 128, false),
+                   "Semicolon separated list of supported extensions. E.g.:\"txt;dat;info;kwd\"");
+    }
+}
+
 //==============================================================================
 static StringArray getVersionSegments (const Project& p)
 {
diff --git a/PluginGenerator/Source/Project/jucer_Project.h b/PluginGenerator/Source/Project/jucer_Project.h
index f923408c8b80816b02b6573c08ef875fc7159368..c410ad30d270a9d3cb263e69f20ce98d97feb0f3 100644
--- a/PluginGenerator/Source/Project/jucer_Project.h
+++ b/PluginGenerator/Source/Project/jucer_Project.h
@@ -30,6 +30,8 @@ class ProjectType;
 class LibraryModule;
 class EnabledModuleList;
 
+#include "../Utility/openEphys_pluginHelpers.h"
+
 //==============================================================================
 class Project  : public FileBasedDocument,
                  public ValueTree::Listener
@@ -153,6 +155,19 @@ public:
     String getAUMainTypeCode();
     String getPluginVSTCategoryString();
 
+    // <Open Ephys>
+    Value getOpenEphysPluginType()                      { return getProjectValue ("openEphysPluginType"); }
+    Value getOpenEphysPluginProcessorType()             { return getProjectValue ("openEphysPluginProcessorType"); }
+    Value getOpenEphysPluginFileSourceSupportedExts()   { return getProjectValue ("openEphysFileSourcePluginSupportedExtensions"); }
+
+    bool isProcessorPlugin() const              { return m_pluginType == PLUGIN_TYPE_PROCESSOR; }
+
+    PluginType           getPluginType() const            { return m_pluginType; }
+    PluginProcessorType  getPluginProcessorType() const   { return m_pluginProcessorType; }
+
+    void setPluginType           (PluginType pluginType)                     { m_pluginType = pluginType; }
+    void setPluginProcessorType  (PluginProcessorType pluginProcessorType)   { m_pluginProcessorType = pluginProcessorType; }
+
     bool isAUPluginHost();
     bool isVSTPluginHost();
     bool isVST3PluginHost();
@@ -315,12 +330,20 @@ private:
     void setMissingAudioPluginDefaultValues();
     void createAudioPluginPropertyEditors (PropertyListBuilder& props);
 
+    // <Open Ephys>
+    void setMissingOpenEphysPluginDefaultValues();
+    void createOpenEphysPluginPropertyEditors (PropertyListBuilder& props);
+
+
     //==============================================================================
     friend class Item;
     ValueTree projectRoot;
     ScopedPointer<EnabledModuleList> enabledModulesList;
     bool isSaving;
 
+    PluginType           m_pluginType { NOT_A_PLUGIN_TYPE };
+    PluginProcessorType  m_pluginProcessorType { PROCESSOR_TYPE_INVALID };
+
     void updateProjectSettings();
     void sanitiseConfigFlags();
     void setMissingDefaultValues();
diff --git a/PluginGenerator/Source/Project/jucer_ProjectType.h b/PluginGenerator/Source/Project/jucer_ProjectType.h
index 855c5cb03d77090f7f4c385732e0d20afd6e9bc4..d69c539a179cf08f37c587a33f88e6a6e8993764 100644
--- a/PluginGenerator/Source/Project/jucer_ProjectType.h
+++ b/PluginGenerator/Source/Project/jucer_ProjectType.h
@@ -25,6 +25,8 @@
 #ifndef JUCER_PROJECTTYPE_H_INCLUDED
 #define JUCER_PROJECTTYPE_H_INCLUDED
 
+#include "../Utility/openEphys_pluginHelpers.h"
+
 class Project;
 class ProjectExporter;
 
diff --git a/PluginGenerator/Source/Project/jucer_TreeItemTypes.h b/PluginGenerator/Source/Project/jucer_TreeItemTypes.h
index 4dc1970d265103989997210f7fa3abb0f0fa23ee..fd569554879dce6ce5d79344264e874f08c1e8cd 100644
--- a/PluginGenerator/Source/Project/jucer_TreeItemTypes.h
+++ b/PluginGenerator/Source/Project/jucer_TreeItemTypes.h
@@ -32,6 +32,8 @@
 #include "jucer_GroupInformationComponent.h"
 #include "jucer_ModulesPanel.h"
 
+#include "../../../Source/UI/Utils/LinearButtonGroupManager.h"
+#include "../../../Source/UI/LookAndFeel/MaterialButtonLookAndFeel.h"
 
 struct FileTreeItemTypes
 {
diff --git a/PluginGenerator/Source/Utility/openEphys_pluginHelpers.h b/PluginGenerator/Source/Utility/openEphys_pluginHelpers.h
index ebbcf0c4684be923b9e6bfa4d8502c09d830cb65..6c905860048f8ec4f17062352ab0ea7bbf3b46ee 100644
--- a/PluginGenerator/Source/Utility/openEphys_pluginHelpers.h
+++ b/PluginGenerator/Source/Utility/openEphys_pluginHelpers.h
@@ -20,6 +20,9 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#ifndef __OPEN_EPHYS_PLUGIN_HELPERS__
+#define __OPEN_EPHYS_PLUGIN_HELPERS__
+
 #include "../../../Source/Processors/PluginManager/PluginIDs.h"
 
 using namespace Plugin;
@@ -128,6 +131,48 @@ static String getLibProcessorTypeString (PluginProcessorType processorType)
 }
 
 
+/** Returns the string with the human friendly name for plugin type. */
+static String getPluginTypeHumanReadableName (PluginType pluginType)
+{
+    switch (pluginType)
+    {
+        case PLUGIN_TYPE_PROCESSOR:
+            return "Processor";
+        case PLUGIN_TYPE_RECORD_ENGINE:
+            return "Record Engine";
+        case PLUGIN_TYPE_DATA_THREAD:
+            return "Data Thread";
+        case PLUGIN_TYPE_FILE_SOURCE:
+            return "File Source";
+        default:
+            return "InvalidPluginInfoType";
+    };
+}
+
+
+/** Returns the string with the human friendly name for processor type. */
+static String getProcessorTypeHumanReadableName (PluginProcessorType processorType)
+{
+    switch (processorType)
+    {
+        case PROCESSOR_TYPE_FILTER:
+            return "Filter";
+        case PROCESSOR_TYPE_SOURCE:
+            return "Source";
+        case PROCESSOR_TYPE_SINK:
+            return "Sink";
+        case PROCESSOR_TYPE_UTILITY:
+            return "Utility";
+        case PROCESSOR_TYPE_MERGER:
+            return "Merger";
+        case PROCESSOR_TYPE_SPLITTER:
+            return "Splitter";
+        default:
+            return "Invalid processor";
+    };
+}
+
+
 // ============================================================================
 // ============================================================================
 // ============================================================================
@@ -149,3 +194,7 @@ static String getTemplateProcessorFileName (PluginType pluginType)
             return "InvalidFileName";
     };
 }
+
+
+#endif // __OPEN_EPHYS_PLUGIN_HELPERS__
+
diff --git a/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h b/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
index e5446191c64ce41a55a24f9f3dccb1e3da438d88..1c522abdea8b0589ac92dd6827b8343c31c78471 100644
--- a/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
+++ b/PluginGenerator/Source/Wizards/openEphys_ProjectWizard_OpenEphysPlugin.h
@@ -122,7 +122,6 @@ static void updateOpenEphysWizardComboBoxBounds (const Component& parent)
 // ============================================================================
 
 struct OpenEphysPluginAppWizard   : public NewProjectWizard
-                                  , public ComboBox::Listener
 {
     OpenEphysPluginAppWizard()  {}
 
@@ -201,41 +200,6 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
     }
 
 
-    void comboBoxChanged (ComboBox* comboBoxThatHasChanged) override
-    {
-        return;
-
-        // UNUSED NOW
-        // 
-        //
-        //
-        //
-        const auto comboBoxId = comboBoxThatHasChanged->getComponentID();
-        if (comboBoxId == COMBOBOX_ID_PLUGIN_TYPE)
-        {
-            const auto selectedIndex = comboBoxThatHasChanged->getSelectedItemIndex() + 1;
-
-            ComboBox* processorTypeComboBox = dynamic_cast<ComboBox*> (ownerWizardComp->findChildWithID (COMBOBOX_ID_PROCESSOR_TYPE));
-            jassert (processorTypeComboBox != nullptr);
-
-            // If was selected "Processor" type of the plugin, then show "Processor type" combobox
-            // and reduce size of both ComboBoxes to have equal size.
-            if (selectedIndex == (int)PLUGIN_TYPE_PROCESSOR)
-            {
-                processorTypeComboBox->setVisible (true);
-
-                // Change "Plugin type" combobox's width
-                comboBoxThatHasChanged->setBounds (comboBoxThatHasChanged->getBounds()
-                                                   .withWidth (processorTypeComboBox->getWidth()));
-            }
-            else
-            {
-                processorTypeComboBox->setVisible (false);
-            }
-        }
-    }
-
-
     bool initialiseProject (Project& project) override
     {
         createSourceFolder();
@@ -251,6 +215,9 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
 
         project.getProjectTypeValue() = ProjectType_OpenEphysPlugin::getTypeName();
 
+        project.setPluginType (m_pluginType);
+        project.setPluginProcessorType (m_processorType);
+
         Project::Item sourceGroup (createSourceGroup (project));
         project.getConfigFlag ("JUCE_QUICKTIME") = Project::configFlagDisabled; // disabled because it interferes with RTAS build on PC
         project.shouldBuildVST().setValue (false);
@@ -281,7 +248,6 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
 
         const auto templatePluginLibFile    = templatesFolder.getChildFile ("openEphys_OpenEphysLibTemplate.cpp");
         const auto newPluginLibFile         = getSourceFilesFolder().getChildFile ("OpenEphysLib.cpp");
-
         String libPluginProcessorType = m_pluginType == PLUGIN_TYPE_PROCESSOR
                                         ? ("info->processor.type = " + getLibProcessorTypeString (m_processorType) + ";")
                                         : "";
@@ -443,7 +409,7 @@ struct OpenEphysPluginAppWizard   : public NewProjectWizard
 
 
 private:
-    PluginType          m_pluginType    { PLUGIN_TYPE_FILE_SOURCE } ;
+    PluginType          m_pluginType    { NOT_A_PLUGIN_TYPE } ;
     PluginProcessorType m_processorType { PROCESSOR_TYPE_INVALID };
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenEphysPluginAppWizard)
diff --git a/PluginGenerator/Source/jucer_Headers.h b/PluginGenerator/Source/jucer_Headers.h
index e100107b18ec9e6109d9c6f8d730ce9070cbae07..6227f05882624a967e9120a374745ee44bb0a94f 100644
--- a/PluginGenerator/Source/jucer_Headers.h
+++ b/PluginGenerator/Source/jucer_Headers.h
@@ -27,6 +27,8 @@
 
 #include "../JuceLibraryCode/JuceHeader.h"
 #include "Application/jucer_CommonHeaders.h"
+#define JUCE_OPEN_EPHYS_PLUGIN_GENERATOR // to avoid redefinition error when using juce header.
+
 
 #if JUCE_DEBUG
  #define RUN_CLANG_IN_CHILD_PROCESS 1
diff --git a/Source/Processors/PluginManager/PluginIDs.h b/Source/Processors/PluginManager/PluginIDs.h
index 500353f757b43a3d3116656607c5c388e37e7b40..3a238e66674f525286357e03f7a2f9d397c77228 100644
--- a/Source/Processors/PluginManager/PluginIDs.h
+++ b/Source/Processors/PluginManager/PluginIDs.h
@@ -34,7 +34,6 @@ enum PluginProcessorType
     , PROCESSOR_TYPE_SPLITTER
     , PROCESSOR_TYPE_MERGER
     , PROCESSOR_TYPE_UTILITY
-    , PROCESSOR_TYPE_DATA_FORMAT
     , PROCESSOR_TYPE_INVALID
 };