[SCM] juce/master: New upstream version 4.2.3~repack

umlaeute at users.alioth.debian.org umlaeute at users.alioth.debian.org
Mon Aug 8 14:50:23 UTC 2016


The following commit has been merged in the master branch:
commit 9d9045ddba83cf02d121331d507c3fb91be315c9
Author: IOhannes m zmölnig <zmoelnig at umlautQ.umlaeute.mur.at>
Date:   Mon Aug 8 15:27:14 2016 +0200

    New upstream version 4.2.3~repack

diff --git a/ChangeList.txt b/ChangeList.txt
index ee5411a..71efd0e 100644
--- a/ChangeList.txt
+++ b/ChangeList.txt
@@ -2,7 +2,13 @@
 == Major JUCE features and updates ==
 
 This file just lists the more notable headline features. For more detailed info
-about minor changes and bugfixes, please see the git log!
+about minor changes and bugfixes, please see the git log!
+
+Version 4.2.3
+  - Various VST3 improvements: resizing VST3 windows, plug-in compatibility issues
+  - Use NSURLSession on newer OS X versions
+  - Add compatibility for VST 3 SDK update 3.6.6
+  - Miscellaneous fixes and improvements
 
 Version 4.2.1
   - New class CachedValue, for providing easy and efficient access to ValueTree properties
diff --git a/examples/AUv3Synth/AUv3Synth.jucer b/examples/AUv3Synth/AUv3Synth.jucer
index 56189d2..c1aa7d0 100644
--- a/examples/AUv3Synth/AUv3Synth.jucer
+++ b/examples/AUv3Synth/AUv3Synth.jucer
@@ -9,7 +9,7 @@
               pluginWantsMidiIn="1" pluginProducesMidiOut="0" pluginIsMidiEffectPlugin="0"
               pluginEditorRequiresKeys="0" pluginAUExportPrefix="AUv3SynthAU"
               pluginRTASCategory="" aaxIdentifier="com.roli.development.AUv3Synth"
-              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.1"
+              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.3"
               buildStandalone="1">
   <MAINGROUP id="h0gx6L" name="AUv3Synth">
     <GROUP id="{9DC59668-E6DF-876C-EB58-DDA88D152162}" name="Source">
diff --git a/examples/AUv3Synth/Builds/MacOSX/AUv3Synth.xcodeproj/project.pbxproj b/examples/AUv3Synth/Builds/MacOSX/AUv3Synth.xcodeproj/project.pbxproj
index 38e73c6..8dec284 100644
--- a/examples/AUv3Synth/Builds/MacOSX/AUv3Synth.xcodeproj/project.pbxproj
+++ b/examples/AUv3Synth/Builds/MacOSX/AUv3Synth.xcodeproj/project.pbxproj
@@ -25,7 +25,6 @@
 		F452B8399A32BE4F1074F596 = {isa = PBXBuildFile; fileRef = 29982493607128FD6DB6A284; };
 		69856794EB88963828DDECC6 = {isa = PBXBuildFile; fileRef = 5DAB08505A14E46FF7BF3B1D; };
 		F56A47BDEEC76681EE80A15E = {isa = PBXBuildFile; fileRef = F003DFE998431203650E2E3F; };
-		26AB69B22ED0C3D7288D1175 = {isa = PBXBuildFile; fileRef = FF08B80860BB393314DC49EA; };
 		78704983DFEA5408FC5767D8 = {isa = PBXBuildFile; fileRef = D06C2B85E02F13F9B57DB1A9; };
 		DE7F04372E0068FDBB51B63D = {isa = PBXBuildFile; fileRef = 9C7C3A15A9D747596DDE40AA; };
 		EB5DBEF68B987F85D1977CE6 = {isa = PBXBuildFile; fileRef = 5063E96C5D8860003810C70E; };
@@ -659,6 +658,7 @@
 		7FE887D76DBB520BBC48CDAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
 		802CA561D36E5556CF267271 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAtomic.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAtomic.h"; sourceTree = "SOURCE_ROOT"; };
 		804448A2E110E3D84021289F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
+		805675527BC735B25A5907A5 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		80868CF2327E15F76AD68CF6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../../../modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; };
 		80970DB9418D27DD52879D1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		809E47902CCE60747026EC3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../../../modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -779,6 +779,7 @@
 		9767C9015F48F6F42AEC0C9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAutoDisposer.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAutoDisposer.h"; sourceTree = "SOURCE_ROOT"; };
 		97C74E9A0E8A5576FC301241 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPESynthesiserVoice.h"; path = "../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h"; sourceTree = "SOURCE_ROOT"; };
 		97DDC460BD01030B91158218 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; };
+		98135B5CED6D00B04F8AD56C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		9819471C5F5583C007A4AED1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "win_utf8_io.h"; path = "../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h"; sourceTree = "SOURCE_ROOT"; };
 		98305AA6513DCC298E322C0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; };
 		9849BB6DC80E45E541475772 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jerror.h; path = "../../../../modules/juce_graphics/image_formats/jpglib/jerror.h"; sourceTree = "SOURCE_ROOT"; };
@@ -883,6 +884,8 @@
 		AC36AEF9A7D94B5F50725E38 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lpc.h; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.h"; sourceTree = "SOURCE_ROOT"; };
 		AC3D1C939D60CBB9F06E5195 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; };
 		ACDA8668B39A102D419BD481 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_TextButton.h"; sourceTree = "SOURCE_ROOT"; };
+		ACDCFB7C5CE966089DF7665E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../../../modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
+		AD49758CCCDB81F781160518 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioParameterInt.h"; path = "../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h"; sourceTree = "SOURCE_ROOT"; };
 		AD748818ED49AF2A6BF7AF0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMath.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAMath.h"; sourceTree = "SOURCE_ROOT"; };
 		ADA10B57D3CACBF7CA3E7058 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
 		ADEFBF282F9FF39E37862A73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pnginfo.h; path = "../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h"; sourceTree = "SOURCE_ROOT"; };
@@ -891,22 +894,44 @@
 		AE8270C49E4D0C9109CF8499 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AF02093447674A2DBEFB7B2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextInputTarget.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"; sourceTree = "SOURCE_ROOT"; };
 		AF575F9303D3AA5E410C274A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B0015C46815CEB6E15236944 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../../../modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; };
+		B032D869039A2B845AAD274E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inftrees.h; path = "../../../../modules/juce_core/zip/zlib/inftrees.h"; sourceTree = "SOURCE_ROOT"; };
+		B054CDFF33B17777FD1855BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcphuff.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c"; sourceTree = "SOURCE_ROOT"; };
+		B05EC8A81DA162236663A8AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../../../modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B0B4FAE3EA49CE2AE0074204 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B0E5392688FD05700AFA0569 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B19103A5C4E54D5ABB50F27F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; };
 		B1972B63AC71C03527E02534 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B2CF7DCAD1C8871201A6CE26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; };
-		B2F8C1DFA6A765EDB034399D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; };
+		B2A30D3171F293ECE50DC06B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../../../modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B2C885D79DF233E10656633A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; };
+		B33097C6BA7E4793E7536BBC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
+		B33E3A1B455B48F251A4EFEB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B3AED660CB964056A7063CE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../../../modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; };
 		B3CA6447C345EE05F8B98195 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; };
 		B442A76A84E1800D10EE5954 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../../../modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; };
 		B48471A74A3A2BDA248931F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = vorbisfile.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c"; sourceTree = "SOURCE_ROOT"; };
-		B5029BFA56B6E1BB5FB43BFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B4C32A6592E159751BD10360 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
+		B585667FC1E99FE5C1E3F799 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jquant2.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c"; sourceTree = "SOURCE_ROOT"; };
 		B58CC7A93DBB3706A60E9E76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; };
-		B5CD08BC33A8414D48F4CD67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
+		B5C3356C447E60F512C5E8CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B5CA4FEE0ADFDACCAF2FB017 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngget.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngget.c"; sourceTree = "SOURCE_ROOT"; };
 		B6ABAD2ACC048C4DAB31CA27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModalComponentManager.h"; path = "../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"; sourceTree = "SOURCE_ROOT"; };
+		B6B3AF7688EF55A4FC61D5D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B774AC9A00BFF63E24EA0646 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3PluginFormat.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
+		B77C48286D446F5C7BD4B76F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
 		B77F4A6EA1005BE4683A0DAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MPESynthesiserVoice.cpp"; path = "../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B812C4A2809BB37D45F54A59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdatasrc.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c"; sourceTree = "SOURCE_ROOT"; };
+		B8133580F67C0B95E1F36D4E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; };
 		B85C9F9BF94FA8926EB9ACB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableShape.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"; sourceTree = "SOURCE_ROOT"; };
 		B8622807DB0688A98F8C75E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "lookup_data.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h"; sourceTree = "SOURCE_ROOT"; };
+		B98F443DC0CE94BC13CC3D44 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../../../modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BAA373F740C171EB1219D9B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; };
-		BBD06432CC4155521050CD2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V3.h"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h"; sourceTree = "SOURCE_ROOT"; };
+		BB1D6E0B0982D0590E8EC99F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../../../modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; };
+		BB8432AE150D5AEB38808FA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../../../modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; };
+		BBB323B5DE53878F445064D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../../../modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
+		BCC48160464BC0DFCAD33792 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../../../modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; };
 		BD283419247CBA6C6DD2ADD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableComposite.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h"; sourceTree = "SOURCE_ROOT"; };
+		BDEE5F6548D2980373C45F5B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C12C3BDF0D24260675D88C04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiBuffer.cpp"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E04216439C3A2AD69B69B520 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; };
 		F5E81FD99EFCB226D2486603 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AUv3Synth.vst; sourceTree = "BUILT_PRODUCTS_DIR"; };
@@ -917,50 +942,26 @@
 		8C9C38D32DB4D8BD543CA892 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
 		A6610B06B712DDE6F2A27290 = {isa = PBXFileReference; lastKnownFileType = text.txt; name = "Flac Licence.txt"; path = "../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt"; sourceTree = "SOURCE_ROOT"; };
 		AC3356631ED2AC043BC67B79 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
-		ACDCFB7C5CE966089DF7665E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../../../modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AD228AE61929A94FFBE55CF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAtomicStack.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAtomicStack.h"; sourceTree = "SOURCE_ROOT"; };
-		AD49758CCCDB81F781160518 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioParameterInt.h"; path = "../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h"; sourceTree = "SOURCE_ROOT"; };
 		AE9CA003C4D379CB43E9CDE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAException.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAException.h"; sourceTree = "SOURCE_ROOT"; };
-		B0015C46815CEB6E15236944 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../../../modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; };
-		B032D869039A2B845AAD274E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inftrees.h; path = "../../../../modules/juce_core/zip/zlib/inftrees.h"; sourceTree = "SOURCE_ROOT"; };
-		B054CDFF33B17777FD1855BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcphuff.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c"; sourceTree = "SOURCE_ROOT"; };
-		B05EC8A81DA162236663A8AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../../../modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; };
 		B0A987158C4CF4E8D0D75243 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = format.h; path = "../../../../modules/juce_audio_formats/codecs/flac/format.h"; sourceTree = "SOURCE_ROOT"; };
-		B0B4FAE3EA49CE2AE0074204 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B0E5392688FD05700AFA0569 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B19103A5C4E54D5ABB50F27F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; };
-		B2A30D3171F293ECE50DC06B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../../../modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B2C885D79DF233E10656633A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; };
-		B33097C6BA7E4793E7536BBC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
-		B33E3A1B455B48F251A4EFEB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B2CF7DCAD1C8871201A6CE26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; };
+		B2F8C1DFA6A765EDB034399D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; };
 		B3425236EBB43087A2C4AA71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../../../modules/juce_core/containers/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; };
 		B389D5350378076E0DF5DA6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = export.h; path = "../../../../modules/juce_audio_formats/codecs/flac/export.h"; sourceTree = "SOURCE_ROOT"; };
-		B3AED660CB964056A7063CE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../../../modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; };
-		B4C32A6592E159751BD10360 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
-		B585667FC1E99FE5C1E3F799 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jquant2.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c"; sourceTree = "SOURCE_ROOT"; };
-		B5C3356C447E60F512C5E8CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B5CA4FEE0ADFDACCAF2FB017 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngget.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngget.c"; sourceTree = "SOURCE_ROOT"; };
-		B6B3AF7688EF55A4FC61D5D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B5029BFA56B6E1BB5FB43BFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		B5CD08BC33A8414D48F4CD67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
 		B6EA3B412C6E73478C4D36AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win_BluetoothMidiDevicePairingDialogue.cpp"; path = "../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp"; sourceTree = "SOURCE_ROOT"; };
-		B774AC9A00BFF63E24EA0646 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3PluginFormat.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
-		B77C48286D446F5C7BD4B76F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
 		B79F6D7A104EF67978CFFC4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnitTypes.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAVectorUnitTypes.h"; sourceTree = "SOURCE_ROOT"; };
 		B801E3F5A1C2992F592A0FBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; };
-		B812C4A2809BB37D45F54A59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdatasrc.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c"; sourceTree = "SOURCE_ROOT"; };
-		B8133580F67C0B95E1F36D4E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; };
 		B986157ED5B0414CDF696C62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAHostTimeBase.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAHostTimeBase.h"; sourceTree = "SOURCE_ROOT"; };
-		B98F443DC0CE94BC13CC3D44 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../../../modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BABAE6EE994D5EBDC4013AAB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; };
-		BB1D6E0B0982D0590E8EC99F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../../../modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BB525259297D31B45CC624C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DeletedAtShutdown.cpp"; path = "../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp"; sourceTree = "SOURCE_ROOT"; };
-		BB8432AE150D5AEB38808FA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../../../modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; };
-		BBB323B5DE53878F445064D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../../../modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
+		BBD06432CC4155521050CD2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V3.h"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h"; sourceTree = "SOURCE_ROOT"; };
 		BC2068C5203B2AA39EAE0C6A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
-		BCC48160464BC0DFCAD33792 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../../../modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; };
 		BD58CC09BA9FED0E9CACC97B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WindowsMediaAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BD95E66B6A4CDADCF0631707 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAStreamBasicDescription.cpp; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAStreamBasicDescription.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BDDC593699182D1603163238 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_devices.cpp"; path = "../../../../modules/juce_audio_devices/juce_audio_devices.cpp"; sourceTree = "SOURCE_ROOT"; };
-		BDEE5F6548D2980373C45F5B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BED2521A9CE66A6F1A5AE7F7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngpread.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c"; sourceTree = "SOURCE_ROOT"; };
 		BED2D02D5F333084E058D678 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BF6BA28F41BA2A03D9325E0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = md5.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h"; sourceTree = "SOURCE_ROOT"; };
@@ -999,21 +1000,20 @@
 		C7BED13E38A3138A9D851FAE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_basics.cpp"; path = "../../../../modules/juce_audio_basics/juce_audio_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C80FFBB5F1E2674B9DBC054B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C87B625D4AD4826BF9301E7E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_8.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h"; sourceTree = "SOURCE_ROOT"; };
+		C9407CAAB91ABCB83CD3F80D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; };
 		C9494DFECDCD27C0815A6F17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; };
 		C9B7C5BD09A1486B2A10DA8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cpu.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h"; sourceTree = "SOURCE_ROOT"; };
 		CA633B8B756E9E7826C8D173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
-		CC14A34F66FDF9E12523CABF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_plugin_client_AUv3.mm"; path = "../../JuceLibraryCode/juce_audio_plugin_client_AUv3.mm"; sourceTree = "SOURCE_ROOT"; };
 		CC32EDCC4709790EBBA55941 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_44.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h"; sourceTree = "SOURCE_ROOT"; };
-		CE80FC970F6099B27DAB080D = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		D06C2B85E02F13F9B57DB1A9 = {isa = PBXFileReference; lastKnownFileType = image.png; name = power.png; path = ../../Source/BinaryData/power.png; sourceTree = "SOURCE_ROOT"; };
 		EC3DE1F504C76EEDDA7F2216 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AUv3Synth.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
 		9536B5A780A03F6BACB24144 = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAUv3Synth.a; sourceTree = "BUILT_PRODUCTS_DIR"; };
 		C1E4A7F5418639D70CB51F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; };
 		C61D176AAECFBC9A277EF2E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FFT.cpp"; path = "../../../../modules/juce_audio_basics/effects/juce_FFT.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C63541C14D518046922DF60B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../../../modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
-		C9407CAAB91ABCB83CD3F80D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; };
 		CB23F9E24266013856B53BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; };
 		CBA22CAB6770979BCCD18EEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = framing.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c"; sourceTree = "SOURCE_ROOT"; };
+		CC14A34F66FDF9E12523CABF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_plugin_client_AUv3.mm"; path = "../../JuceLibraryCode/juce_audio_plugin_client_AUv3.mm"; sourceTree = "SOURCE_ROOT"; };
 		CC155101953B89262C8B633C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../../../modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CD3ABE20AE524B92B9B6A6FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; };
 		CD41042388657A558C93AD86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1231,6 +1231,7 @@
 		F5DC35A024D665725204B375 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; };
 		F5E8E9C083E0933E6FB6CC13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../../../modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; };
 		F60276DF99D86FCE8A565BE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; };
+		F625DBBA7CA4F3E2830A8FC4 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		F6370FC667E0362CE87FE3E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnit.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAVectorUnit.h"; sourceTree = "SOURCE_ROOT"; };
 		F66119B180E2027EA08FDCAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../../../modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; };
 		F663ABEC52B192E36EBB2958 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cpu.c; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1627,6 +1628,7 @@
 					9329788543F0C6DA2B50BD72,
 					2CC92DEE105B69921A4BD036, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		988670913C41D72F28DFE34E = {isa = PBXGroup; children = (
+					98135B5CED6D00B04F8AD56C,
 					DC8F10CCAC55F7216F0304F9, ); name = AAX; sourceTree = "<group>"; };
 		FE2338066D80D87950BB4358 = {isa = PBXGroup; children = (
 					26DB94618438B2D5BF6B856E,
@@ -1687,11 +1689,10 @@
 					F8952FD62C839E34EBB043F6, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		A2BBDDDA694235612BDE9BD0 = {isa = PBXGroup; children = (
 					FE2338066D80D87950BB4358,
-					F43FCD869B7CBA50CF03BB6F,
 					3E76A3788CAAB12560CB4517,
 					AE1DD722E80713D6A2C820C9,
 					2220D1078A2681D8AAF3563E, ); name = AU; sourceTree = "<group>"; };
-		3CF6F89CE98D1BD583C34852 = {isa = PBXGroup; children = (
+		618CCB6A21E8C032AF1D2BEB = {isa = PBXGroup; children = (
 					8905DE78626372768938A4C0,
 					05C14DEEE0E3BDC4049484B5,
 					2FA12F7EBB9AC99A08FC1025,
@@ -1699,10 +1700,10 @@
 					DBA0B8703ED6A2CFF6E952A8,
 					2D4E5D168D18704BCB317DD8,
 					CF51659EBB00003E6CB20B66, ); name = RTAS; sourceTree = "<group>"; };
-		5E03484B053FE94C3308A153 = {isa = PBXGroup; children = (
+		E57F8E0940E0C2FB651C1534 = {isa = PBXGroup; children = (
 					33B2FD7C625F65B132945522,
 					44E613EE8E541E69E6B8A449, ); name = Standalone; sourceTree = "<group>"; };
-		5D85476955DBC422757405C1 = {isa = PBXGroup; children = (
+		6E32D1C853DB168862215AF5 = {isa = PBXGroup; children = (
 					30CDFDC04232575AE7A491F3,
 					F96C31890AED2B62C4E0E20A,
 					00A950F33C21C6688103E667,
@@ -1712,19 +1713,19 @@
 					99AC2D0C2304F21B912FEC5B,
 					2F9011C34B50B11B6FFEDA7F,
 					EA8B1437F945AFED7BDF11DB, ); name = utility; sourceTree = "<group>"; };
-		F3BA35D57A9C238A5CC3628F = {isa = PBXGroup; children = (
+		666ACBAA58DBC0AD514A3CF9 = {isa = PBXGroup; children = (
 					78DD966E73DF076A83FC1F2C,
 					6FA729EAB8A64447D81B36E9, ); name = VST; sourceTree = "<group>"; };
-		51E2FC46CC35EE59A85AF51E = {isa = PBXGroup; children = (
+		47BE374539E9FEBFEFDAD7E3 = {isa = PBXGroup; children = (
 					08D38FFAFF41735F36FD4BF9, ); name = VST3; sourceTree = "<group>"; };
 		E4D31720EE240DC9A75C9459 = {isa = PBXGroup; children = (
 					988670913C41D72F28DFE34E,
 					A2BBDDDA694235612BDE9BD0,
-					3CF6F89CE98D1BD583C34852,
-					5E03484B053FE94C3308A153,
-					5D85476955DBC422757405C1,
-					F3BA35D57A9C238A5CC3628F,
-					51E2FC46CC35EE59A85AF51E,
+					618CCB6A21E8C032AF1D2BEB,
+					E57F8E0940E0C2FB651C1534,
+					6E32D1C853DB168862215AF5,
+					666ACBAA58DBC0AD514A3CF9,
+					47BE374539E9FEBFEFDAD7E3,
 					9EDB40D557C3BBB1CC63CF65,
 					26AE9472CE02F176A9513852,
 					03DE1C983B7DECDCC451C8F8,
@@ -2758,7 +2759,6 @@
 					F3498E82A2D4ACBED68A7F43,
 					6AFB9EB642850186B551DB33,
 					F003DFE998431203650E2E3F,
-					FF08B80860BB393314DC49EA,
 					D06C2B85E02F13F9B57DB1A9, ); name = Resources; sourceTree = "<group>"; };
 		ED86208188082DE5EA9381E4 = {isa = PBXGroup; children = (
 					7CBEB55B80E78C9DE16A713A,
@@ -3146,7 +3146,7 @@
 		F550A01E8A9468C64A914B97 = {isa = XCConfigurationList; buildConfigurations = (
 					7007C784A0219490DFD18C27,
 					0ADE306E346FE4F925722F86, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		EF49DCC88B5FC3C6E67ED2A4 = {isa = PBXAggregateTarget; buildConfigurationList = F550A01E8A9468C64A914B97; dependencies = (
+		EF49DCC88B5FC3C6E67ED2A4 = {isa = PBXAggregateTarget; buildConfigurationList = F550A01E8A9468C64A914B97; buildPhases = (  ); buildRules = ( ); dependencies = (
 					811D9E9CC2221100847306C9,
 					1316EADEF579F0DB90CF349C,
 					8F5816EA1D519B78C3345C1B,
@@ -3157,7 +3157,6 @@
 					19D80348287645B624E0C6B8, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		2094EE2ED994CDD1B1C905BB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F56A47BDEEC76681EE80A15E,
-					26AB69B22ED0C3D7288D1175,
 					78704983DFEA5408FC5767D8, ); runOnlyForDeploymentPostprocessing = 0; };
 		074C299F37078964C5476AC0 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					E94BB952CDD544FA3A0A4DBB, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3182,7 +3181,6 @@
 					11C129F26625007CE9DFD618, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		C123969EE00E891FAC7CEF45 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F56A47BDEEC76681EE80A15E,
-					26AB69B22ED0C3D7288D1175,
 					78704983DFEA5408FC5767D8, ); runOnlyForDeploymentPostprocessing = 0; };
 		795D24AC6934948AE4F8FDE2 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					2D137C5E337024E492FA14D4, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3207,7 +3205,6 @@
 					5FAC649347835B831BAE3C41, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		0306890051760AEBAFEA2099 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F56A47BDEEC76681EE80A15E,
-					26AB69B22ED0C3D7288D1175,
 					78704983DFEA5408FC5767D8, ); runOnlyForDeploymentPostprocessing = 0; };
 		E60CDCD59C66D98FB19938F1 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					0942F20A9A312E80B2EE65E5, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3235,7 +3232,6 @@
 					AE95330B72116D75608B9C68, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		4E507FDDF2C5DF3FE77D60E4 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F56A47BDEEC76681EE80A15E,
-					26AB69B22ED0C3D7288D1175,
 					78704983DFEA5408FC5767D8, ); runOnlyForDeploymentPostprocessing = 0; };
 		7B44C01FD5EBA7864D985AC2 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					0E0B50F4A042E48B9631A42A, ); runOnlyForDeploymentPostprocessing = 0; };
diff --git a/examples/AUv3Synth/Builds/iOS/AUv3Synth.xcodeproj/project.pbxproj b/examples/AUv3Synth/Builds/iOS/AUv3Synth.xcodeproj/project.pbxproj
index 5fc359c..0e9b73e 100644
--- a/examples/AUv3Synth/Builds/iOS/AUv3Synth.xcodeproj/project.pbxproj
+++ b/examples/AUv3Synth/Builds/iOS/AUv3Synth.xcodeproj/project.pbxproj
@@ -6,6 +6,7 @@
 	objectVersion = 46;
 	objects = {
 
+		55B4C2F046533A9C139516FF = {isa = PBXBuildFile; fileRef = F5E81FD99EFCB226D2486603; };
 		EE8DCBA5DC0EE7CAD6FF2F39 = {isa = PBXBuildFile; fileRef = 746B19364297E7D489749B70; };
 		3F1630B6EF37313AADD6EAB8 = {isa = PBXBuildFile; fileRef = EC3DE1F504C76EEDDA7F2216; };
 		77FA445D27C21FBA66A46BF2 = {isa = PBXBuildFile; fileRef = 9536B5A780A03F6BACB24144; };
@@ -31,6 +32,7 @@
 		0E0B50F4A042E48B9631A42A = {isa = PBXBuildFile; fileRef = CF02DA80A8A515CE41B0C8F6; };
 		72733104CA9C62BE856879C9 = {isa = PBXBuildFile; fileRef = 63AFF514CAE6FB89A3503CEF; };
 		A00624D77FD68669DD6234D0 = {isa = PBXBuildFile; fileRef = A8315F08B794D9C87328F17F; };
+		E94BB952CDD544FA3A0A4DBB = {isa = PBXBuildFile; fileRef = 853D9A89FE96C6DD6730CEC7; };
 		8EBD1E279B7E4B420F310D12 = {isa = PBXBuildFile; fileRef = D9ED0926381D40DA1A66C26D; };
 		045E9D3412FD38BFE3071254 = {isa = PBXBuildFile; fileRef = 9965CB9ED8D2B26CACA9C44A; };
 		4066B5EF83133035C3579D0D = {isa = PBXBuildFile; fileRef = 58E254BD072595F6E3F6D5F5; };
@@ -568,6 +570,7 @@
 		6C5C4F38A006227C77FCBAD3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../../../modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; };
 		6CE2AFEAEE4AE23D2E17E2D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../../../modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
 		6D61505DE8021C51E8C5AE52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lsp.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.c"; sourceTree = "SOURCE_ROOT"; };
+		6DA4597568FFE5B6D1F5B68A = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-VST.plist"; path = "Info-VST.plist"; sourceTree = "SOURCE_ROOT"; };
 		6DED13EB49FCE393E16D59FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../../../modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; };
 		6DF4FA55C69B25537DCD88C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; };
 		6DFDBE298AD93DD1B3F067B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -598,7 +601,6 @@
 		738FC67C7D9A53148C0A21AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandManager.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"; sourceTree = "SOURCE_ROOT"; };
 		73BB8E247A275838FD16AFE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mapping0.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mapping0.c"; sourceTree = "SOURCE_ROOT"; };
 		745B58030382C3D0DB6E7815 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinate.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"; sourceTree = "SOURCE_ROOT"; };
-		746B19364297E7D489749B70 = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = AUv3Synth.appex; sourceTree = "BUILT_PRODUCTS_DIR"; };
 		75034A13541D4052025A4B39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jutils.c"; sourceTree = "SOURCE_ROOT"; };
 		750DF21E43BED98CE4F53DE7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; };
 		76272B6E0F4FB6D7225653CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -635,7 +637,6 @@
 		7BAB8DD68B7A25B281233969 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MarkerList.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h"; sourceTree = "SOURCE_ROOT"; };
 		7C3E7364953EF9D78C71B866 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../../../modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
 		7CA84F62BB5AC492B1EB49A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_MessageQueue.h"; path = "../../../../modules/juce_events/native/juce_osx_MessageQueue.h"; sourceTree = "SOURCE_ROOT"; };
-		7CBEB55B80E78C9DE16A713A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
 		7CE0FEFCEC64DF0ADA0B2DF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../../../modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; };
 		7D0417B22EF55BE16E7C5061 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		7D1E28BE09A85EEBA041558C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; };
@@ -651,6 +652,7 @@
 		7FE887D76DBB520BBC48CDAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
 		802CA561D36E5556CF267271 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAtomic.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAtomic.h"; sourceTree = "SOURCE_ROOT"; };
 		804448A2E110E3D84021289F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
+		805675527BC735B25A5907A5 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		80868CF2327E15F76AD68CF6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../../../modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; };
 		80970DB9418D27DD52879D1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		809E47902CCE60747026EC3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../../../modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -676,6 +678,7 @@
 		84ABD4F5D068289F4D43E7CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../../../modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; };
 		84D3302B18B67B725905AF7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LAMEEncoderAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8524CF106D2B7B1E08D312C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioAppComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		853D9A89FE96C6DD6730CEC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_plugin_client_VST2.cpp"; path = "../../JuceLibraryCode/juce_audio_plugin_client_VST2.cpp"; sourceTree = "SOURCE_ROOT"; };
 		854757FAD81F978667CAA43C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeRectangle.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"; sourceTree = "SOURCE_ROOT"; };
 		8553867F8B04D10919C2BD4C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c"; sourceTree = "SOURCE_ROOT"; };
 		856618203AAE94C7B806F9EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableRectangle.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -687,7 +690,6 @@
 		86AC66980898843AE721BD08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; };
 		86E1396EB5DB7C3F8D42AF19 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../../../modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; };
 		87181526B9C99144CBE4F8A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiInput.h"; path = "../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"; sourceTree = "SOURCE_ROOT"; };
-		872D05BD56490FD7B375C11B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
 		87415D844832686C8423F226 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jccolor.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c"; sourceTree = "SOURCE_ROOT"; };
 		874FADD694BB58E2E736FC20 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MixerAudioSource.cpp"; path = "../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
 		876D30F6E9647DB0F9BE4463 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = format.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h"; sourceTree = "SOURCE_ROOT"; };
@@ -708,7 +710,6 @@
 		89CC639E5B1CDE71BDBC02D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		89E00773FE73394C30642A4E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../../../modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; };
 		8A3F809F240408D5195FB0F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = memory.c; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c"; sourceTree = "SOURCE_ROOT"; };
-		8AA012F95CDEE0ECAC1D698E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPEZoneLayout.h"; path = "../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h"; sourceTree = "SOURCE_ROOT"; };
 		8ACD82D09483797E1A7A65B2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8AEA9D5BBBC4CB214F18FCE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; };
 		8AED766CFA1A37B45BC2DE98 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; };
@@ -725,8 +726,6 @@
 		8D030B4C002B429D9A9CF05A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = metadata.h; path = "../../../../modules/juce_audio_formats/codecs/flac/metadata.h"; sourceTree = "SOURCE_ROOT"; };
 		8D4AF11BC6D0F698838984C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputElement.cpp; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUOutputElement.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8D6D7548957FA154DA777E17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
-		8D753ADD4B2F1CB0C974A522 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; };
-		8DCEAA37D9F7AAD98A244B49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8E1318FA20D468AD45C7A20F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallOutBox.h"; path = "../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h"; sourceTree = "SOURCE_ROOT"; };
 		8E29909B5886662F2EC3F5CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8E61D5E0D6068F247E70219C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Button.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_Button.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -734,43 +733,56 @@
 		8F3941CB0EBB70B37B7DB6DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; };
 		8F3C3474E9EB852A40B3A25B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUPlugInDispatch.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUPlugInDispatch.h"; sourceTree = "SOURCE_ROOT"; };
 		8F3FC2A8E965AA4E83259DB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; };
-		8FAE0E215D1E95E6CA7C58E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../../../modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; };
 		8FC88FE9250C7A25AC724BEF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../../../modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; };
-		8FE4D93D82016AE0E952662F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcomapi.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c"; sourceTree = "SOURCE_ROOT"; };
-		90064DDC086AD775FA7D5FFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; };
-		9015FC74644F82DB0A49FBFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = vorbisenc.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c"; sourceTree = "SOURCE_ROOT"; };
 		903B9CD04DF181894AC76EF9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Identifier.cpp"; path = "../../../../modules/juce_core/text/juce_Identifier.cpp"; sourceTree = "SOURCE_ROOT"; };
 		90C18AF3CAC0E59C88732904 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; };
 		90D3112151AC631747E60670 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Base64.h"; path = "../../../../modules/juce_core/text/juce_Base64.h"; sourceTree = "SOURCE_ROOT"; };
 		9136CCE147582160FA805637 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "residue_16.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h"; sourceTree = "SOURCE_ROOT"; };
 		9146F18918C954121E932A8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; };
+		92529B06E070A28F0C3C4914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; };
+		933DE5C4D4002BA9203F65A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
+		9376596E6EC0707DFEE00ADB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; };
+		94304B55601DBF7FBCFC6767 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = md5.c; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c"; sourceTree = "SOURCE_ROOT"; };
+		94BFEB9B92F3D546332FD8E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = alloc.h; path = "../../../../modules/juce_audio_formats/codecs/flac/alloc.h"; sourceTree = "SOURCE_ROOT"; };
+		95D4FB306A367AE3A6D28173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../../../modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; };
+		96DCCD578FF29CD7D381E8BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../../../modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; };
+		96F6E7AE69A06FEE69CCA3C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CompilerSupport.h"; path = "../../../../modules/juce_core/system/juce_CompilerSupport.h"; sourceTree = "SOURCE_ROOT"; };
+		9A392FBECB732FAC0AA04262 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; };
+		9FB1AAC5EC1146B5FC0EFCD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; };
+		A148CC41BDB41EDC8E88DC7D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
+		A15E68C337279B15ED933BE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; };
+		E04216439C3A2AD69B69B520 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; };
+		F5E81FD99EFCB226D2486603 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AUv3Synth.vst; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		746B19364297E7D489749B70 = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = AUv3Synth.appex; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		7CBEB55B80E78C9DE16A713A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+		872D05BD56490FD7B375C11B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
+		8AA012F95CDEE0ECAC1D698E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPEZoneLayout.h"; path = "../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h"; sourceTree = "SOURCE_ROOT"; };
+		8D753ADD4B2F1CB0C974A522 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; };
+		8DCEAA37D9F7AAD98A244B49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; };
+		8FAE0E215D1E95E6CA7C58E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../../../modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; };
+		8FE4D93D82016AE0E952662F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcomapi.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c"; sourceTree = "SOURCE_ROOT"; };
+		90064DDC086AD775FA7D5FFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; };
+		9015FC74644F82DB0A49FBFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = vorbisenc.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c"; sourceTree = "SOURCE_ROOT"; };
 		9198593E2E34D16752B90CD1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AttributedString.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp"; sourceTree = "SOURCE_ROOT"; };
 		91D10BF1909D2B9C169E4493 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "residue_8.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h"; sourceTree = "SOURCE_ROOT"; };
 		91F32F326BD577CD67AE20D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_44u.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h"; sourceTree = "SOURCE_ROOT"; };
-		92529B06E070A28F0C3C4914 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; };
 		92723EFA7826236908D48AC3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAUParameter.cpp; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAUParameter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		92BFAF31B51618764234C779 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9312B68ACDD2A4EAA31CAA73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		9329788543F0C6DA2B50BD72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_formats.mm"; path = "../../../../modules/juce_audio_formats/juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; };
-		933DE5C4D4002BA9203F65A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
-		9376596E6EC0707DFEE00ADB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; };
 		938B5112D072B60A18918CF1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdcoefct.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c"; sourceTree = "SOURCE_ROOT"; };
-		94304B55601DBF7FBCFC6767 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = md5.c; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c"; sourceTree = "SOURCE_ROOT"; };
 		94308E0D87CFF0D58DAAA0D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "os_types.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h"; sourceTree = "SOURCE_ROOT"; };
 		947776740572A5A07C2500EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; };
-		94BFEB9B92F3D546332FD8E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = alloc.h; path = "../../../../modules/juce_audio_formats/codecs/flac/alloc.h"; sourceTree = "SOURCE_ROOT"; };
 		94EA45AA948C996F231D6946 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComboBox.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp"; sourceTree = "SOURCE_ROOT"; };
 		955635CD2D6A1C5BACA519CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; };
 		95931BF9B518FB17845AF4A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h"; sourceTree = "SOURCE_ROOT"; };
-		95D4FB306A367AE3A6D28173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../../../modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; };
 		96102E98CC639030FAD7EA68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_GraphicsContext.cpp"; path = "../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; };
 		968EC4E33A1D1949AA4A9F87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; };
 		96DA31F4C1619188159F7FC3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngrutil.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c"; sourceTree = "SOURCE_ROOT"; };
-		96DCCD578FF29CD7D381E8BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../../../modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; };
-		96F6E7AE69A06FEE69CCA3C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CompilerSupport.h"; path = "../../../../modules/juce_core/system/juce_CompilerSupport.h"; sourceTree = "SOURCE_ROOT"; };
 		9767C9015F48F6F42AEC0C9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAutoDisposer.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAutoDisposer.h"; sourceTree = "SOURCE_ROOT"; };
 		97C74E9A0E8A5576FC301241 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPESynthesiserVoice.h"; path = "../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h"; sourceTree = "SOURCE_ROOT"; };
 		97DDC460BD01030B91158218 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; };
+		98135B5CED6D00B04F8AD56C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		9819471C5F5583C007A4AED1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "win_utf8_io.h"; path = "../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h"; sourceTree = "SOURCE_ROOT"; };
 		98305AA6513DCC298E322C0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; };
 		9849BB6DC80E45E541475772 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jerror.h; path = "../../../../modules/juce_graphics/image_formats/jpglib/jerror.h"; sourceTree = "SOURCE_ROOT"; };
@@ -779,7 +791,6 @@
 		997766E6B5491A51A5242F68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../../../modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; };
 		99AC2D0C2304F21B912FEC5B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginHostType.h"; path = "../../../../modules/juce_audio_plugin_client/utility/juce_PluginHostType.h"; sourceTree = "SOURCE_ROOT"; };
 		9A3351689C885961A9BD3F2F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../../../modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; };
-		9A392FBECB732FAC0AA04262 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9A419F28D68BDEB200F29603 = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AUv3Synth/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
 		9A69DDED5C8357717BAD57DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../../../modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; };
 		9AA36A7E6CCDA68D308E0721 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_plugin_client_VST2.cpp"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -810,15 +821,12 @@
 		9F1DFEFDC78EC139C4089DEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RuntimePermissions.cpp"; path = "../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9F91E161DF777F050B61B6BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioTransportSource.cpp"; path = "../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9FA43271ACEB06BF3AB00095 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = envelope.h; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h"; sourceTree = "SOURCE_ROOT"; };
-		9FB1AAC5EC1146B5FC0EFCD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A0173759895A8C13BB754998 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = all.h; path = "../../../../modules/juce_audio_formats/codecs/flac/all.h"; sourceTree = "SOURCE_ROOT"; };
 		A032CFC5A613848D8594B40B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = all.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h"; sourceTree = "SOURCE_ROOT"; };
 		A1159B10837BBDD1BD12A882 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CachedValue.cpp"; path = "../../../../modules/juce_data_structures/values/juce_CachedValue.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A11CF361C0253B499324D31E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A12A4C86AE4FA12C99334932 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
-		A148CC41BDB41EDC8E88DC7D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A1595E748092878FDAEA5A30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../../../modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; };
-		A15E68C337279B15ED933BE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A1CFD76549B8E9EB1C360ED5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A1FA95A0AA37CD773ACBCE8A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; };
 		A2129507609CE7130FBA1340 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../../../modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; };
@@ -960,6 +968,7 @@
 		C14EFFF60594E0BC2421DC0F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C1983ED4284CBEF3B5A427E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../../../modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C1D83773976CEDB413DB5E5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = envelope.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c"; sourceTree = "SOURCE_ROOT"; };
+		C1E4A7F5418639D70CB51F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; };
 		C1EFF2064480889DAC74D2D3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageEffectFilter.h"; path = "../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h"; sourceTree = "SOURCE_ROOT"; };
 		C25203A01A84B7032A7774CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; };
 		C2DF4936EF95E5A32E71B755 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -976,6 +985,8 @@
 		C5A2FC7A4569F1C242016136 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = png.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/png.c"; sourceTree = "SOURCE_ROOT"; };
 		C5B2DDCFB6FEA46E4F97BBA1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_events.cpp"; path = "../../../../modules/juce_events/juce_events.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C61D176AAECFBC9A277EF2E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FFT.cpp"; path = "../../../../modules/juce_audio_basics/effects/juce_FFT.cpp"; sourceTree = "SOURCE_ROOT"; };
+		C61EEED69EE6C34E5C64B729 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "config_types.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h"; sourceTree = "SOURCE_ROOT"; };
+		C63541C14D518046922DF60B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../../../modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C639338DD5AF077DF5BF8361 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
 		C68283C8A9FA7CEC6AA6975C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = scales.h; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h"; sourceTree = "SOURCE_ROOT"; };
 		C6846316837E7D4578428945 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../../../modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; };
@@ -986,42 +997,33 @@
 		C9494DFECDCD27C0815A6F17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; };
 		C9B7C5BD09A1486B2A10DA8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cpu.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h"; sourceTree = "SOURCE_ROOT"; };
 		CA633B8B756E9E7826C8D173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
+		CB23F9E24266013856B53BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; };
+		CBA22CAB6770979BCCD18EEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = framing.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c"; sourceTree = "SOURCE_ROOT"; };
 		CC14A34F66FDF9E12523CABF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_plugin_client_AUv3.mm"; path = "../../JuceLibraryCode/juce_audio_plugin_client_AUv3.mm"; sourceTree = "SOURCE_ROOT"; };
 		CC155101953B89262C8B633C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../../../modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
+		CC32EDCC4709790EBBA55941 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_44.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h"; sourceTree = "SOURCE_ROOT"; };
 		CD3ABE20AE524B92B9B6A6FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; };
 		CD41042388657A558C93AD86 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c"; sourceTree = "SOURCE_ROOT"; };
 		CD44BCDC60998F9B56D816C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = "../../../../modules/juce_core/zip/zlib/adler32.c"; sourceTree = "SOURCE_ROOT"; };
-		CE80FC970F6099B27DAB080D = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
+		CDE81ADB14F09742FBBA28E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		CE491063B3EF486A263519F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_X.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h"; sourceTree = "SOURCE_ROOT"; };
+		CE517EF86B0776BA9B27F3F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUTimestampGenerator.h"; sourceTree = "SOURCE_ROOT"; };
 		CF02DA80A8A515CE41B0C8F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_plugin_client_Standalone.cpp"; path = "../../JuceLibraryCode/juce_audio_plugin_client_Standalone.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CF2F576CE0F6A185597C8D40 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; };
 		CF344C62ABCBA9BAAB6ACFA2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_AudioSource.h"; sourceTree = "SOURCE_ROOT"; };
 		CF51659EBB00003E6CB20B66 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_Wrapper.cpp"; path = "../../../../modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; };
-		D03583C1CA01284B5781955E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; };
-		D06C2B85E02F13F9B57DB1A9 = {isa = PBXFileReference; lastKnownFileType = image.png; name = power.png; path = ../../Source/BinaryData/power.png; sourceTree = "SOURCE_ROOT"; };
-		D0A4E2C5F2B21172DE13DE0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; };
-		D1683E32F1EB634904CD7DE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; };
-		D515546E71BD92C742D67905 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; };
-		D636983E7D4B5897EF493708 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; };
-		DAF78E342ACF24B5A83E0605 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		EC3DE1F504C76EEDDA7F2216 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AUv3Synth.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		9536B5A780A03F6BACB24144 = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAUv3Synth.a; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		C1E4A7F5418639D70CB51F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; };
-		C61EEED69EE6C34E5C64B729 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "config_types.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h"; sourceTree = "SOURCE_ROOT"; };
-		C63541C14D518046922DF60B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../../../modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
-		CB23F9E24266013856B53BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; };
-		CBA22CAB6770979BCCD18EEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = framing.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c"; sourceTree = "SOURCE_ROOT"; };
-		CC32EDCC4709790EBBA55941 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_44.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h"; sourceTree = "SOURCE_ROOT"; };
-		CDE81ADB14F09742FBBA28E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
-		CE491063B3EF486A263519F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_X.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h"; sourceTree = "SOURCE_ROOT"; };
-		CE517EF86B0776BA9B27F3F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUTimestampGenerator.h"; sourceTree = "SOURCE_ROOT"; };
 		CF6FA9D2F39F03FE2858F11B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CF7ECFB4AA9A00E103525840 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedFile.h"; path = "../../../../modules/juce_core/files/juce_MemoryMappedFile.h"; sourceTree = "SOURCE_ROOT"; };
 		CF9EEC4A087AA9010D5D21A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormat.h"; path = "../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		CFADD611F5F0D9EC5127C6C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = trees.c; path = "../../../../modules/juce_core/zip/zlib/trees.c"; sourceTree = "SOURCE_ROOT"; };
 		CFAFC86F4D25AB5A31DF3BE5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../../../modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; };
 		CFFC609186B1EE226ACEBD2D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Network.cpp"; path = "../../../../modules/juce_core/native/juce_win32_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
+		D03583C1CA01284B5781955E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		D0584D8F725E0D7E61F830F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = "../../../../modules/juce_core/zip/zlib/deflate.c"; sourceTree = "SOURCE_ROOT"; };
+		D06C2B85E02F13F9B57DB1A9 = {isa = PBXFileReference; lastKnownFileType = image.png; name = power.png; path = ../../Source/BinaryData/power.png; sourceTree = "SOURCE_ROOT"; };
+		D0A4E2C5F2B21172DE13DE0C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; };
 		D0ECDC7390CA390D69946652 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcsample.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c"; sourceTree = "SOURCE_ROOT"; };
+		D1683E32F1EB634904CD7DE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; };
 		D19E20CCCD4790B2347D5B80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSubsectionReader.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp"; sourceTree = "SOURCE_ROOT"; };
 		D2436FFFE291F08409B1EEE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colours.cpp"; path = "../../../../modules/juce_graphics/colour/juce_Colours.cpp"; sourceTree = "SOURCE_ROOT"; };
 		D264387115074C98CF251072 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1034,10 +1036,12 @@
 		D48932C6554B443ECB71DC87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableBorderComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		D4A4555171F923D744B1FDF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngstruct.h; path = "../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h"; sourceTree = "SOURCE_ROOT"; };
 		D4C0852C1C54EDA5D4F82EB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; };
+		D515546E71BD92C742D67905 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; };
 		D557AAD12557BF1706441B19 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		D5797410CEE0E8D2E03D98F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; };
 		D57DF4F024A84881420586E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = trees.h; path = "../../../../modules/juce_core/zip/zlib/trees.h"; sourceTree = "SOURCE_ROOT"; };
 		D5816478E1FBC9D296E78CFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_processors.cpp"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.cpp"; sourceTree = "SOURCE_ROOT"; };
+		D636983E7D4B5897EF493708 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; };
 		D6670F0F52C7A439715B706F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../../../modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; };
 		D6979B0DD8E310EA2512B147 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChannelRemappingAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
 		D72A2819C390689ED5A58197 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ContainerDeletePolicy.h"; path = "../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1065,6 +1069,7 @@
 		DA4E0EA3EB80BE34F9047E72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBuilder.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h"; sourceTree = "SOURCE_ROOT"; };
 		DACA6E5A3CE684EC649F31B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Typeface.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"; sourceTree = "SOURCE_ROOT"; };
 		DAEE812EF95F96E7D65D875F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; };
+		DAF78E342ACF24B5A83E0605 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
 		DB216D8107F0BBBBD3F2B0E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../../../modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; };
 		DB3A7C49C8444BD2F57B6689 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; };
 		DB43ED26DBABD0BC17385E6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../../../modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1098,7 +1103,6 @@
 		DFF6A93D460B71379FE3EAA2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageCollector.cpp"; path = "../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E0260479B3C2CAF8477026FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorParameters.cpp"; path = "../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameters.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E03AA585A375A39A9BFF3DD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../../../modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; };
-		E04216439C3A2AD69B69B520 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; };
 		E0484E5F0994D64013F4EEA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDragAndDropTarget.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; };
 		E09404F45899AA1E82CFC21C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E0B49BAB1C8D7341A6E142B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jdct.h; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdct.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1120,7 +1124,6 @@
 		E31219AD074DCBB8C6A9F816 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../../../modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E320A8161071D0D1B9261E2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AlertWindow.h"; path = "../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h"; sourceTree = "SOURCE_ROOT"; };
 		E32E43F0CC33ED95FD0A9DE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsMediaAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
-		E40580FB3605FA6D5DA3FD73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBaseHelper.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUBaseHelper.h"; sourceTree = "SOURCE_ROOT"; };
 		E433734FC5466D7E26FC11D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E4CB12FDCA729EC8BD9E0845 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdapimin.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c"; sourceTree = "SOURCE_ROOT"; };
 		E4D985BB229FC31731681790 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1137,16 +1140,19 @@
 		E755606E63BE2C5558FFB353 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_BluetoothMidiDevicePairingDialogue.cpp"; path = "../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E795FC063102CA8BAB722C58 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		E79A4F024D4890B61628C42C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../../../modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; };
+		E93BF1F2B52BF52EA12326A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdpostct.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c"; sourceTree = "SOURCE_ROOT"; };
+		EA6D44AA3D1C9B0A5873DC4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_data_structures.cpp"; path = "../../../../modules/juce_data_structures/juce_data_structures.cpp"; sourceTree = "SOURCE_ROOT"; };
+		EC3DE1F504C76EEDDA7F2216 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AUv3Synth.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		9536B5A780A03F6BACB24144 = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAUv3Synth.a; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		E40580FB3605FA6D5DA3FD73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBaseHelper.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUBaseHelper.h"; sourceTree = "SOURCE_ROOT"; };
 		E7E45873BE802DD8D676E9CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		E88DF76B88F3E67D0FB58CEB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = floor0.c; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c"; sourceTree = "SOURCE_ROOT"; };
 		E8EB40396974468FBD0EE15B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; };
-		E93BF1F2B52BF52EA12326A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdpostct.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c"; sourceTree = "SOURCE_ROOT"; };
 		E9617DEC7E639354C2AF66A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../../../modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E9745B8F0DE747F94EAF65A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlyphArrangement.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"; sourceTree = "SOURCE_ROOT"; };
 		E975A1A60F48EB781C00B9CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = infback.c; path = "../../../../modules/juce_core/zip/zlib/infback.c"; sourceTree = "SOURCE_ROOT"; };
 		E9C1C03509E00C37AAA45727 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_QuickTimeAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EA4345362FE80828317BB860 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Base64.cpp"; path = "../../../../modules/juce_core/text/juce_Base64.cpp"; sourceTree = "SOURCE_ROOT"; };
-		EA6D44AA3D1C9B0A5873DC4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_data_structures.cpp"; path = "../../../../modules/juce_data_structures/juce_data_structures.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EA89A423564A332B875F040F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = misc.h; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h"; sourceTree = "SOURCE_ROOT"; };
 		EA8B1437F945AFED7BDF11DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsHooks.h"; path = "../../../../modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h"; sourceTree = "SOURCE_ROOT"; };
 		EA92EA0E7F4D3859821CEB4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAUParameter.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1216,6 +1222,7 @@
 		F5DC35A024D665725204B375 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; };
 		F5E8E9C083E0933E6FB6CC13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../../../modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; };
 		F60276DF99D86FCE8A565BE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; };
+		F625DBBA7CA4F3E2830A8FC4 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		F6370FC667E0362CE87FE3E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnit.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAVectorUnit.h"; sourceTree = "SOURCE_ROOT"; };
 		F66119B180E2027EA08FDCAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../../../modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; };
 		F663ABEC52B192E36EBB2958 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cpu.c; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1611,6 +1618,7 @@
 					9329788543F0C6DA2B50BD72,
 					2CC92DEE105B69921A4BD036, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		988670913C41D72F28DFE34E = {isa = PBXGroup; children = (
+					98135B5CED6D00B04F8AD56C,
 					DC8F10CCAC55F7216F0304F9, ); name = AAX; sourceTree = "<group>"; };
 		FE2338066D80D87950BB4358 = {isa = PBXGroup; children = (
 					26DB94618438B2D5BF6B856E,
@@ -1671,11 +1679,10 @@
 					F8952FD62C839E34EBB043F6, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		A2BBDDDA694235612BDE9BD0 = {isa = PBXGroup; children = (
 					FE2338066D80D87950BB4358,
-					F43FCD869B7CBA50CF03BB6F,
 					3E76A3788CAAB12560CB4517,
 					AE1DD722E80713D6A2C820C9,
 					2220D1078A2681D8AAF3563E, ); name = AU; sourceTree = "<group>"; };
-		3CF6F89CE98D1BD583C34852 = {isa = PBXGroup; children = (
+		618CCB6A21E8C032AF1D2BEB = {isa = PBXGroup; children = (
 					8905DE78626372768938A4C0,
 					05C14DEEE0E3BDC4049484B5,
 					2FA12F7EBB9AC99A08FC1025,
@@ -1683,10 +1690,10 @@
 					DBA0B8703ED6A2CFF6E952A8,
 					2D4E5D168D18704BCB317DD8,
 					CF51659EBB00003E6CB20B66, ); name = RTAS; sourceTree = "<group>"; };
-		5E03484B053FE94C3308A153 = {isa = PBXGroup; children = (
+		E57F8E0940E0C2FB651C1534 = {isa = PBXGroup; children = (
 					33B2FD7C625F65B132945522,
 					44E613EE8E541E69E6B8A449, ); name = Standalone; sourceTree = "<group>"; };
-		5D85476955DBC422757405C1 = {isa = PBXGroup; children = (
+		6E32D1C853DB168862215AF5 = {isa = PBXGroup; children = (
 					30CDFDC04232575AE7A491F3,
 					F96C31890AED2B62C4E0E20A,
 					00A950F33C21C6688103E667,
@@ -1696,19 +1703,19 @@
 					99AC2D0C2304F21B912FEC5B,
 					2F9011C34B50B11B6FFEDA7F,
 					EA8B1437F945AFED7BDF11DB, ); name = utility; sourceTree = "<group>"; };
-		F3BA35D57A9C238A5CC3628F = {isa = PBXGroup; children = (
+		666ACBAA58DBC0AD514A3CF9 = {isa = PBXGroup; children = (
 					78DD966E73DF076A83FC1F2C,
 					6FA729EAB8A64447D81B36E9, ); name = VST; sourceTree = "<group>"; };
-		51E2FC46CC35EE59A85AF51E = {isa = PBXGroup; children = (
+		47BE374539E9FEBFEFDAD7E3 = {isa = PBXGroup; children = (
 					08D38FFAFF41735F36FD4BF9, ); name = VST3; sourceTree = "<group>"; };
 		E4D31720EE240DC9A75C9459 = {isa = PBXGroup; children = (
 					988670913C41D72F28DFE34E,
 					A2BBDDDA694235612BDE9BD0,
-					3CF6F89CE98D1BD583C34852,
-					5E03484B053FE94C3308A153,
-					5D85476955DBC422757405C1,
-					F3BA35D57A9C238A5CC3628F,
-					51E2FC46CC35EE59A85AF51E,
+					618CCB6A21E8C032AF1D2BEB,
+					E57F8E0940E0C2FB651C1534,
+					6E32D1C853DB168862215AF5,
+					666ACBAA58DBC0AD514A3CF9,
+					47BE374539E9FEBFEFDAD7E3,
 					9EDB40D557C3BBB1CC63CF65,
 					26AE9472CE02F176A9513852,
 					03DE1C983B7DECDCC451C8F8,
@@ -2725,6 +2732,7 @@
 					CF02DA80A8A515CE41B0C8F6,
 					63AFF514CAE6FB89A3503CEF,
 					A8315F08B794D9C87328F17F,
+					853D9A89FE96C6DD6730CEC7,
 					D9ED0926381D40DA1A66C26D,
 					9965CB9ED8D2B26CACA9C44A,
 					58E254BD072595F6E3F6D5F5,
@@ -2735,6 +2743,7 @@
 					E553E188A17BDF4E832F0A01,
 					F138CA63A1127DA0DB69B127, ); name = "Juce Library Code"; sourceTree = "<group>"; };
 		A727F6B063FCDB816462D213 = {isa = PBXGroup; children = (
+					6DA4597568FFE5B6D1F5B68A,
 					F3498E82A2D4ACBED68A7F43,
 					6AFB9EB642850186B551DB33,
 					9A419F28D68BDEB200F29603,
@@ -2752,6 +2761,7 @@
 					29982493607128FD6DB6A284,
 					5EF6762AB1C5CE4C2DCD59ED, ); name = Frameworks; sourceTree = "<group>"; };
 		E793574695108F202603BAA5 = {isa = PBXGroup; children = (
+					F5E81FD99EFCB226D2486603,
 					746B19364297E7D489749B70,
 					EC3DE1F504C76EEDDA7F2216,
 					9536B5A780A03F6BACB24144, ); name = Products; sourceTree = "<group>"; };
@@ -2764,6 +2774,77 @@
 					E793574695108F202603BAA5, ); name = Source; sourceTree = "<group>"; };
 		7007C784A0219490DFD18C27 = {isa = XCBuildConfiguration; buildSettings = {  }; name = Debug; };
 		0ADE306E346FE4F925722F86 = {isa = XCBuildConfiguration; buildSettings = {  }; name = Release; };
+		653C6C73C56BA201AB6F094C = {isa = XCBuildConfiguration; buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
+				CLANG_LINK_OBJC_RUNTIME = NO;
+				CODE_SIGN_IDENTITY = "";
+				COMBINE_HIDPI_IMAGES = YES;
+				CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+				COPY_PHASE_STRIP = NO;
+				DEPLOYMENT_LOCATION = YES;
+				DSTROOT = /;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"_DEBUG=1",
+					"DEBUG=1",
+					"JucePlugin_Build_VST=1",
+					"JucePlugin_Build_VST3=0",
+					"JucePlugin_Build_AU=0",
+					"JucePlugin_Build_AUv3=0",
+					"JucePlugin_Build_RTAS=0",
+					"JucePlugin_Build_AAX=0",
+					"JucePlugin_Build_Standalone=0",
+					"JUCER_XCODE_IPHONE_5BC26AE3=1",
+					"JUCE_APP_VERSION=1.0.0",
+					"JUCE_APP_VERSION_HEX=0x10000", );
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GENERATE_PKGINFO_FILE = YES;
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				INFOPLIST_FILE = Info-VST.plist;
+				INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/VST/";
+				LIBRARY_STYLE = Bundle;
+				OTHER_LDFLAGS = "-bundle -lAUv3Synth";
+				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth;
+				WRAPPER_EXTENSION = vst; }; name = Debug; };
+		19D80348287645B624E0C6B8 = {isa = XCBuildConfiguration; buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
+				CLANG_LINK_OBJC_RUNTIME = NO;
+				CODE_SIGN_IDENTITY = "";
+				COMBINE_HIDPI_IMAGES = YES;
+				CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+				DEAD_CODE_STRIPPING = YES;
+				DEPLOYMENT_LOCATION = YES;
+				DSTROOT = /;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_OPTIMIZATION_LEVEL = 3;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"_NDEBUG=1",
+					"NDEBUG=1",
+					"JucePlugin_Build_VST=1",
+					"JucePlugin_Build_VST3=0",
+					"JucePlugin_Build_AU=0",
+					"JucePlugin_Build_AUv3=0",
+					"JucePlugin_Build_RTAS=0",
+					"JucePlugin_Build_AAX=0",
+					"JucePlugin_Build_Standalone=0",
+					"JUCER_XCODE_IPHONE_5BC26AE3=1",
+					"JUCE_APP_VERSION=1.0.0",
+					"JUCE_APP_VERSION_HEX=0x10000", );
+				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				GENERATE_PKGINFO_FILE = YES;
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				INFOPLIST_FILE = Info-VST.plist;
+				INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/VST/";
+				LIBRARY_STYLE = Bundle;
+				OTHER_LDFLAGS = "-bundle -lAUv3Synth";
+				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth;
+				WRAPPER_EXTENSION = vst; }; name = Release; };
 		DC95EAEBECC74A55CADCD887 = {isa = XCBuildConfiguration; buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@@ -2789,7 +2870,7 @@
 					"JUCE_APP_VERSION=1.0.0",
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INFOPLIST_FILE = Info-AUv3_AppExtension.plist;
 				OTHER_LDFLAGS = "-lAUv3Synth";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth.AUv3SynthAUv3; }; name = Debug; };
@@ -2819,7 +2900,7 @@
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INFOPLIST_FILE = Info-AUv3_AppExtension.plist;
 				OTHER_LDFLAGS = "-lAUv3Synth";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth.AUv3SynthAUv3; }; name = Release; };
@@ -2848,7 +2929,7 @@
 					"JUCE_APP_VERSION=1.0.0",
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INFOPLIST_FILE = Info-AUv3_Standalone.plist;
 				OTHER_LDFLAGS = "-lAUv3Synth";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth; }; name = Debug; };
@@ -2878,7 +2959,7 @@
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INFOPLIST_FILE = Info-AUv3_Standalone.plist;
 				OTHER_LDFLAGS = "-lAUv3Synth";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth; }; name = Release; };
@@ -2897,7 +2978,7 @@
 					"_DEBUG=1",
 					"DEBUG=1",
 					"JUCE_SHARED_CODE=1",
-					"JucePlugin_Build_VST=0",
+					"JucePlugin_Build_VST=1",
 					"JucePlugin_Build_VST3=0",
 					"JucePlugin_Build_AU=0",
 					"JucePlugin_Build_AUv3=1",
@@ -2908,7 +2989,7 @@
 					"JUCE_APP_VERSION=1.0.0",
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INSTALL_PATH = "@executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth; }; name = Debug; };
 		5DA389BE0C844A1A9E20FD7C = {isa = XCBuildConfiguration; buildSettings = {
@@ -2926,7 +3007,7 @@
 					"_NDEBUG=1",
 					"NDEBUG=1",
 					"JUCE_SHARED_CODE=1",
-					"JucePlugin_Build_VST=0",
+					"JucePlugin_Build_VST=1",
 					"JucePlugin_Build_VST3=0",
 					"JucePlugin_Build_AU=0",
 					"JucePlugin_Build_AUv3=1",
@@ -2938,7 +3019,7 @@
 					"JUCE_APP_VERSION_HEX=0x10000", );
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
-				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+				HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INSTALL_PATH = "@executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.roli.development.AUv3Synth; }; name = Release; };
 		D32671708EF2662A51A6335A = {isa = XCBuildConfiguration; buildSettings = {
@@ -2979,6 +3060,7 @@
 				TARGETED_DEVICE_FAMILY = "1,2";
 				WARNING_CFLAGS = -Wreorder;
 				ZERO_LINK = NO; }; name = Release; };
+		811D9E9CC2221100847306C9 = {isa = PBXTargetDependency; target = 73F4C13CDCAC7EE5914F2E61; };
 		8F5816EA1D519B78C3345C1B = {isa = PBXTargetDependency; target = 7A046597FDDDB82B78C64AAC; };
 		E06C8C12CD5FDD7FB372E602 = {isa = PBXTargetDependency; target = E600EF631F7AFA8F3A723E29; };
 		017B214D817BF0DF53051BB2 = {isa = PBXTargetDependency; target = CD6892FED0DB19C0DDD9AD37; };
@@ -2988,10 +3070,36 @@
 		F550A01E8A9468C64A914B97 = {isa = XCConfigurationList; buildConfigurations = (
 					7007C784A0219490DFD18C27,
 					0ADE306E346FE4F925722F86, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		EF49DCC88B5FC3C6E67ED2A4 = {isa = PBXAggregateTarget; buildConfigurationList = F550A01E8A9468C64A914B97; dependencies = (
+		EF49DCC88B5FC3C6E67ED2A4 = {isa = PBXAggregateTarget; buildConfigurationList = F550A01E8A9468C64A914B97; buildPhases = (  ); buildRules = ( ); dependencies = (
+					811D9E9CC2221100847306C9,
 					8F5816EA1D519B78C3345C1B,
 					E06C8C12CD5FDD7FB372E602,
 					017B214D817BF0DF53051BB2, ); name = "AUv3Synth (All)"; productName = AUv3Synth; };
+		32113A068DE980F098C3A7FA = {isa = XCConfigurationList; buildConfigurations = (
+					653C6C73C56BA201AB6F094C,
+					19D80348287645B624E0C6B8, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+		2094EE2ED994CDD1B1C905BB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+					6F585AC4628EC14C9F757022,
+					78704983DFEA5408FC5767D8, ); runOnlyForDeploymentPostprocessing = 0; };
+		074C299F37078964C5476AC0 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+					E94BB952CDD544FA3A0A4DBB, ); runOnlyForDeploymentPostprocessing = 0; };
+		88CA07DBC6CAFF5FF3E65E3E = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+					FAD4DF17110D52B8ED8D9F93,
+					737E06660F37BFFCABD89643,
+					D53302896621B8A3E8BDD606,
+					669F51FA55E939D010EA279D,
+					EDC8ABA2EC0A2D7A2147E896,
+					7DEC97493F97160DE6622DBC,
+					1DF18B2507A574FBA9C49DE1,
+					71F62F07CBC67FB4FB010583,
+					6B818B8342839FB008124DEA,
+					F452B8399A32BE4F1074F596,
+					E4236DCEE707C3855C2E3B22, ); runOnlyForDeploymentPostprocessing = 0; };
+		73F4C13CDCAC7EE5914F2E61 = {isa = PBXNativeTarget; buildConfigurationList = 32113A068DE980F098C3A7FA; buildPhases = (
+					2094EE2ED994CDD1B1C905BB,
+					074C299F37078964C5476AC0,
+					88CA07DBC6CAFF5FF3E65E3E, ); buildRules = ( ); dependencies = (
+					017B214D817BF0DF53051BB2, ); name = "AUv3Synth (VST)"; productName = AUv3Synth; productReference = F5E81FD99EFCB226D2486603; productType = "com.apple.product-type.bundle"; };
 		3A7896DB2C11717D9046CE5B = {isa = XCConfigurationList; buildConfigurations = (
 					DC95EAEBECC74A55CADCD887,
 					5FAC649347835B831BAE3C41, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
@@ -3067,7 +3175,7 @@
 					4D9D92DD454BB03746241196, ); runOnlyForDeploymentPostprocessing = 0; };
 		CD6892FED0DB19C0DDD9AD37 = {isa = PBXNativeTarget; buildConfigurationList = AF907C78A0D17B741F5F8944; buildPhases = (
 					1F4A8812AAE49E02F3215F48, ); buildRules = ( ); dependencies = (  ); name = "AUv3Synth (Shared Code)"; productName = AUv3Synth; productReference = 9536B5A780A03F6BACB24144; productType = "com.apple.product-type.library.static"; };
-		D0E003364F0BE3205BD9243E = {isa = PBXProject; buildConfigurationList = 444EA74CE26BF416566E542C; attributes = { LastUpgradeCheck = 0440; TargetAttributes = { EF49DCC88B5FC3C6E67ED2A4 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; };7A046597FDDDB82B78C64AAC = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 1; }; }; };E600EF631F7AFA8F3A723E29 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; };CD6892FED0DB19C0DDD9AD37 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 4BFA153CE4E8A774C67EC642; projectDirPath = ""; projectRoot = ""; targets = (EF49DCC88B5FC3C6E67ED2A4, 7A046597FDDDB82B78C64AAC, E600EF631F7AFA8F3A723E29, CD6892FED0DB19C0DDD9AD37); };
+		D0E003364F0BE3205BD9243E = {isa = PBXProject; buildConfigurationList = 444EA74CE26BF416566E542C; attributes = { LastUpgradeCheck = 0440; TargetAttributes = { EF49DCC88B5FC3C6E67ED2A4 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; };73F4C13CDCAC7EE5914F2E61 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; };7A046597FDDDB82B78C64AAC = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 1; }; }; };E600EF631F7AFA8F3A723E29 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; };CD6892FED0DB19C0DDD9AD37 = { SystemCapabilities = {com.apple.InAppPurchase = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 4BFA153CE4E8A774C67EC642; projectDirPath = ""; projectRoot = ""; targets = (EF49DCC88B5FC3C6E67ED2A4, 73F4C13CDCAC7EE5914F2E61, 7A046597FDDDB82B78C64AAC, E600EF631F7AFA8F3A723E29, CD6892FED0DB19C0DDD9AD37); };
 	};
 	rootObject = D0E003364F0BE3205BD9243E;
 }
diff --git a/examples/AUv3Synth/Builds/iOS/Info-AUv3_Standalone.plist b/examples/AUv3Synth/Builds/iOS/Info-VST.plist
similarity index 94%
copy from examples/AUv3Synth/Builds/iOS/Info-AUv3_Standalone.plist
copy to examples/AUv3Synth/Builds/iOS/Info-VST.plist
index e42f168..71b368c 100644
--- a/examples/AUv3Synth/Builds/iOS/Info-AUv3_Standalone.plist
+++ b/examples/AUv3Synth/Builds/iOS/Info-VST.plist
@@ -16,7 +16,7 @@
     <key>CFBundleDisplayName</key>
     <string>AUv3Synth</string>
     <key>CFBundlePackageType</key>
-    <string>APPL</string>
+    <string>BNDL</string>
     <key>CFBundleSignature</key>
     <string>????</string>
     <key>CFBundleShortVersionString</key>
diff --git a/examples/AUv3Synth/JuceLibraryCode/AppConfig.h b/examples/AUv3Synth/JuceLibraryCode/AppConfig.h
index 8ca835f..303210b 100644
--- a/examples/AUv3Synth/JuceLibraryCode/AppConfig.h
+++ b/examples/AUv3Synth/JuceLibraryCode/AppConfig.h
@@ -109,6 +109,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -232,10 +239,10 @@
  #define JucePlugin_ManufacturerEmail      ""
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'AUv3'
+ #define JucePlugin_PluginCode             0x41557633 // 'AUv3'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                1
diff --git a/examples/AnimationAppExample/AnimationAppExample.jucer b/examples/AnimationAppExample/AnimationAppExample.jucer
index 92a39b9..c28861d 100644
--- a/examples/AnimationAppExample/AnimationAppExample.jucer
+++ b/examples/AnimationAppExample/AnimationAppExample.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="LrATE6" name="AnimationAppExample" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.AnimationAppExample" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="F3keCY" name="AnimationAppExample">
     <GROUP id="{5E4132EA-C4A0-CBDE-BEDA-FD6772DA79D5}" name="Source">
       <FILE id="n1FmZc" name="MainComponent.cpp" compile="1" resource="0"
diff --git a/examples/AudioAppExample/AudioAppExample.jucer b/examples/AudioAppExample/AudioAppExample.jucer
index b504e03..56b5de6 100644
--- a/examples/AudioAppExample/AudioAppExample.jucer
+++ b/examples/AudioAppExample/AudioAppExample.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="PAnJXP" name="AudioAppExample" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.AudioAppExample" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="GaJIge" name="AudioAppExample">
     <GROUP id="{168FC5D4-FA65-8320-F83E-C14C416638E1}" name="Source">
       <FILE id="aHvhJ2" name="MainComponent.cpp" compile="1" resource="0"
diff --git a/examples/BouncingBallWavetableDemo/BouncingBallWavetableDemo.jucer b/examples/BouncingBallWavetableDemo/BouncingBallWavetableDemo.jucer
index 7080672..920c843 100644
--- a/examples/BouncingBallWavetableDemo/BouncingBallWavetableDemo.jucer
+++ b/examples/BouncingBallWavetableDemo/BouncingBallWavetableDemo.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="fyUrFS" name="BouncingBallWavetableDemo" projectType="guiapp"
               version="1.0.0" bundleIdentifier="com.juce.BouncingBallWavetableDemo"
-              includeBinaryInAppConfig="1" jucerVersion="4.2.1">
+              includeBinaryInAppConfig="1" jucerVersion="4.2.3">
   <MAINGROUP id="MgjqDB" name="BouncingBallWavetableDemo">
     <GROUP id="{D35F88A0-C242-1CAA-21A9-6D01F78F4128}" name="Source">
       <FILE id="M5GUDX" name="MainComponent.cpp" compile="1" resource="0"
diff --git a/examples/BouncingBallWavetableDemo/Builds/Linux/Makefile b/examples/BouncingBallWavetableDemo/Builds/Linux/Makefile
index 075451f..d0ea1f4 100644
--- a/examples/BouncingBallWavetableDemo/Builds/Linux/Makefile
+++ b/examples/BouncingBallWavetableDemo/Builds/Linux/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/ComponentTutorialExample/ComponentTutorialExample.jucer b/examples/ComponentTutorialExample/ComponentTutorialExample.jucer
index 91b1f38..4b9b576 100644
--- a/examples/ComponentTutorialExample/ComponentTutorialExample.jucer
+++ b/examples/ComponentTutorialExample/ComponentTutorialExample.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="oNvA5C" name="ComponentTutorialExample" projectType="guiapp"
               version="1.0.0" bundleIdentifier="com.yourcompany.ComponentTutorialExample"
-              includeBinaryInAppConfig="1" jucerVersion="4.2.1">
+              includeBinaryInAppConfig="1" jucerVersion="4.2.3">
   <MAINGROUP id="WydTVz" name="ComponentTutorialExample">
     <GROUP id="{F2C8112A-EE4B-7AF1-A0A9-16152D1EF1A7}" name="Source">
       <FILE id="t4ngZQ" name="ToggleLightGridComponent.h" compile="0" resource="0"
diff --git a/examples/Demo/Builds/Android/jni/Android.mk b/examples/Demo/Builds/Android/jni/Android.mk
index 163e55c..2acd46d 100644
--- a/examples/Demo/Builds/Android/jni/Android.mk
+++ b/examples/Demo/Builds/Android/jni/Android.mk
@@ -69,14 +69,14 @@ LOCAL_SRC_FILES := \
   ../../../JuceLibraryCode/juce_video.cpp\
 
 ifeq ($(NDK_DEBUG),1)
-  LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../JuceLibraryCode" -I "../../../../modules" -O0 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=23" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000"
+  LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../JuceLibraryCode" -I "../../../../modules" -O0 -std=gnu++11 -DJUCE_ANDROID=1 -DJUCE_ANDROID_API_VERSION=23 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_ANDROID_7F0E4A25=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000
   LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
-  LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../JuceLibraryCode" -I "../../../../modules" -O0 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=23" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000"
+  LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -g -I "../../JuceLibraryCode" -I "../../../../modules" -O0 -std=gnu++11 -DJUCE_ANDROID=1 -DJUCE_ANDROID_API_VERSION=23 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_ANDROID_7F0E4A25=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000
   LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
 else
-  LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -I "../../JuceLibraryCode" -I "../../../../modules" -O3 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=23" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000"
+  LOCAL_CPPFLAGS += -fsigned-char -fexceptions -frtti -I "../../JuceLibraryCode" -I "../../../../modules" -O3 -std=gnu++11 -DJUCE_ANDROID=1 -DJUCE_ANDROID_API_VERSION=23 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_ANDROID_7F0E4A25=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000
   LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
-  LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -I "../../JuceLibraryCode" -I "../../../../modules" -O3 -std=gnu++11 -D "JUCE_ANDROID=1" -D "JUCE_ANDROID_API_VERSION=23" -D "JUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo" -D JUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_ANDROID_7F0E4A25=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000"
+  LOCAL_CFLAGS += -fsigned-char -fexceptions -frtti -I "../../JuceLibraryCode" -I "../../../../modules" -O3 -std=gnu++11 -DJUCE_ANDROID=1 -DJUCE_ANDROID_API_VERSION=23 -DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_juce_jucedemo_JuceDemo -DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/juce/jucedemo/JuceDemo\" -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_ANDROID_7F0E4A25=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000
   LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
 endif
 
diff --git a/examples/Demo/Builds/Linux/Makefile b/examples/Demo/Builds/Linux/Makefile
index 26d5741..8f73ad3 100644
--- a/examples/Demo/Builds/Linux/Makefile
+++ b/examples/Demo/Builds/Linux/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=3.0.0" -D "JUCE_APP_VERSION_HEX=0x30000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=3.0.0 -DJUCE_APP_VERSION_HEX=0x30000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/Demo/Builds/MacOSX/Info-App.plist b/examples/Demo/Builds/MacOSX/Info-App.plist
index 71c5339..bb0fc6d 100644
--- a/examples/Demo/Builds/MacOSX/Info-App.plist
+++ b/examples/Demo/Builds/MacOSX/Info-App.plist
@@ -3,6 +3,11 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist>
   <dict>
+    <key>NSAppTransportSecurity</key>
+    <dict>
+      <key>NSAllowsArbitraryLoads</key>
+      <true/>
+    </dict>
     <key>CFBundleExecutable</key>
     <string>${EXECUTABLE_NAME}</string>
     <key>CFBundleIconFile</key>
diff --git a/examples/Demo/Builds/iOS/Info-App.plist b/examples/Demo/Builds/iOS/Info-App.plist
index 756003b..6aa71d6 100644
--- a/examples/Demo/Builds/iOS/Info-App.plist
+++ b/examples/Demo/Builds/iOS/Info-App.plist
@@ -3,6 +3,11 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist>
   <dict>
+    <key>NSAppTransportSecurity</key>
+    <dict>
+      <key>NSAllowsArbitraryLoads</key>
+      <true/>
+    </dict>
     <key>LSRequiresIPhoneOS</key>
     <true/>
     <key>UIViewControllerBasedStatusBarAppearance</key>
diff --git a/examples/Demo/JuceDemo.jucer b/examples/Demo/JuceDemo.jucer
index 1357c41..f19a162 100644
--- a/examples/Demo/JuceDemo.jucer
+++ b/examples/Demo/JuceDemo.jucer
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <JUCERPROJECT id="sBBIzr" name="JuceDemo" projectType="guiapp" version="3.0.0"
-              bundleIdentifier="com.yourcompany.JuceDemo" jucerVersion="4.2.1"
+              bundleIdentifier="com.yourcompany.JuceDemo" jucerVersion="4.2.3"
               defines="JUCE_UNIT_TESTS=1" includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
-               objCExtraSuffix="hZh0GG" bigIcon="BvyE0d" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter">
+               objCExtraSuffix="hZh0GG" bigIcon="BvyE0d" extraCompilerFlags="-Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter"
+               customPList="<plist>
<dict>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
</dict>
</plist>">
       <CONFIGURATIONS>
         <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
                        osxSDK="default" osxCompatibility="10.10 SDK" osxArchitecture="default"
@@ -33,7 +34,8 @@
       </MODULEPATHS>
     </XCODE_MAC>
     <XCODE_IPHONE targetFolder="Builds/iOS" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
-                  objCExtraSuffix="Lpywnl" bigIcon="BvyE0d" iosScreenOrientation="portraitlandscape">
+                  objCExtraSuffix="Lpywnl" bigIcon="BvyE0d" iosScreenOrientation="portraitlandscape"
+                  customPList="<plist>
<dict>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
</dict>
</plist>">
       <CONFIGURATIONS>
         <CONFIGURATION name="Debug" isDebug="1" optimisation="1" targetName="JuceDemo"
                        osxSDK="default" osxCompatibility="default" osxArchitecture="default"
diff --git a/examples/Demo/Source/Demos/CryptographyDemo.cpp b/examples/Demo/Source/Demos/CryptographyDemo.cpp
index 9059840..3c7050c 100644
--- a/examples/Demo/Source/Demos/CryptographyDemo.cpp
+++ b/examples/Demo/Source/Demos/CryptographyDemo.cpp
@@ -70,7 +70,7 @@ public:
 private:
     void createRSAKey()
     {
-        int bits = jlimit (32, 512, bitSize.getText().getIntValue());
+        int bits = jlimit (32, 1024, bitSize.getText().getIntValue());
         bitSize.setText (String (bits), dontSendNotification);
 
         // Create a key-pair...
diff --git a/examples/Demo/Source/MainWindow.cpp b/examples/Demo/Source/MainWindow.cpp
index 2426148..ea2e6aa 100644
--- a/examples/Demo/Source/MainWindow.cpp
+++ b/examples/Demo/Source/MainWindow.cpp
@@ -22,6 +22,7 @@
   ==============================================================================
 */
 
+#include <typeinfo>
 #include "JuceDemoHeader.h"
 
 //==============================================================================
@@ -558,19 +559,18 @@ AudioDeviceManager& MainAppWindow::getSharedAudioDeviceManager()
     if (sharedAudioDeviceManager == nullptr)
     {
         sharedAudioDeviceManager = new AudioDeviceManager();
-
-        RuntimePermissions::request (
-            RuntimePermissions::recordAudio,
-            [] (bool wasGranted) {
-                int numInputChannels = wasGranted ? 2 : 0;
-                sharedAudioDeviceManager->initialise (numInputChannels, 2, nullptr, true, String(), nullptr);
-            }
-        );
+        RuntimePermissions::request (RuntimePermissions::recordAudio, runtimPermissionsCallback);
     }
 
     return *sharedAudioDeviceManager;
 }
 
+void MainAppWindow::runtimPermissionsCallback (bool wasGranted)
+{
+    int numInputChannels = wasGranted ? 2 : 0;
+    sharedAudioDeviceManager->initialise (numInputChannels, 2, nullptr, true, String(), nullptr);
+}
+
 MainAppWindow* MainAppWindow::getMainAppWindow()
 {
     for (int i = TopLevelWindow::getNumTopLevelWindows(); --i >= 0;)
diff --git a/examples/Demo/Source/MainWindow.h b/examples/Demo/Source/MainWindow.h
index e1f5610..5baa678 100644
--- a/examples/Demo/Source/MainWindow.h
+++ b/examples/Demo/Source/MainWindow.h
@@ -93,6 +93,9 @@ public:
     };
 
 private:
+
+    static void runtimPermissionsCallback (bool wasGranted);
+
     ScopedPointer<ContentComponent> contentComponent;
     ScopedPointer<Component> taskbarIcon;
     ScopedPointer<BubbleMessageComponent> currentBubbleMessage;
diff --git a/examples/HelloWorld/Builds/Linux/Makefile b/examples/HelloWorld/Builds/Linux/Makefile
index 218a56a..da1622d 100644
--- a/examples/HelloWorld/Builds/Linux/Makefile
+++ b/examples/HelloWorld/Builds/Linux/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/HelloWorld/HelloWorld.jucer b/examples/HelloWorld/HelloWorld.jucer
index fa4e5f4..1bff121 100644
--- a/examples/HelloWorld/HelloWorld.jucer
+++ b/examples/HelloWorld/HelloWorld.jucer
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <JUCERPROJECT id="tTAKTK1s" name="HelloWorld" projectType="guiapp" juceFolder="../../../juce"
-              jucerVersion="4.2.1" version="1.0.0" bundleIdentifier="com.roli.jucehelloworld"
+              jucerVersion="4.2.3" version="1.0.0" bundleIdentifier="com.roli.jucehelloworld"
               companyName="ROLI Ltd." includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
diff --git a/examples/MPETest/Builds/LinuxMakefile/Makefile b/examples/MPETest/Builds/LinuxMakefile/Makefile
index 992c4df..549c25a 100644
--- a/examples/MPETest/Builds/LinuxMakefile/Makefile
+++ b/examples/MPETest/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/MPETest/MPETest.jucer b/examples/MPETest/MPETest.jucer
index 97afb6e..656d8b1 100644
--- a/examples/MPETest/MPETest.jucer
+++ b/examples/MPETest/MPETest.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="IilE7R" name="MPETest" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.MPETest" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="VCQQcn" name="MPETest">
     <GROUP id="{D43238F0-992F-BC5A-F1AA-31BBBD3D17B0}" name="Source">
       <FILE id="uRxR7V" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
diff --git a/examples/MidiTest/Builds/LinuxMakefile/Makefile b/examples/MidiTest/Builds/LinuxMakefile/Makefile
index 4fa71c7..12b7004 100644
--- a/examples/MidiTest/Builds/LinuxMakefile/Makefile
+++ b/examples/MidiTest/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/MidiTest/MidiTest.jucer b/examples/MidiTest/MidiTest.jucer
index 67586a9..c8d285f 100644
--- a/examples/MidiTest/MidiTest.jucer
+++ b/examples/MidiTest/MidiTest.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="wHE0ay" name="MidiTest" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.MidiTest" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="s3xxCh" name="MidiTest">
     <GROUP id="{7D29F5BC-1B05-AE8F-9202-5CF152AB1103}" name="Source">
       <FILE id="kpmJ3T" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
diff --git a/examples/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile b/examples/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
index 49f701d..e95df25 100644
--- a/examples/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
+++ b/examples/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer b/examples/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer
index 324f600..9dc7e64 100644
--- a/examples/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer
+++ b/examples/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="gWI5Ir" name="JUCE Network Graphics Demo" projectType="guiapp"
               version="1.0.0" bundleIdentifier="com.juce.NetworkGraphicsDemo"
-              includeBinaryInAppConfig="1" jucerVersion="4.2.1">
+              includeBinaryInAppConfig="1" jucerVersion="4.2.3">
   <MAINGROUP id="OT9rJ2" name="JUCE Network Graphics Demo">
     <GROUP id="{48D54E6E-37F4-B20A-E038-C63E4EDFD4D9}" name="Source">
       <FILE id="BfclEZ" name="Demos.h" compile="0" resource="0" file="Source/Demos.h"/>
diff --git a/examples/OSCMonitor/Builds/LinuxMakefile/Makefile b/examples/OSCMonitor/Builds/LinuxMakefile/Makefile
index 17f3ca0..40905c5 100644
--- a/examples/OSCMonitor/Builds/LinuxMakefile/Makefile
+++ b/examples/OSCMonitor/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/OSCMonitor/OSCMonitor.jucer b/examples/OSCMonitor/OSCMonitor.jucer
index d8f152a..74a0194 100644
--- a/examples/OSCMonitor/OSCMonitor.jucer
+++ b/examples/OSCMonitor/OSCMonitor.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="IhmIkj" name="OSCMonitor" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.rawmaterialsoftware.OSCMonitor" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="N9NMMk" name="OSCMonitor">
     <GROUP id="{2B92546C-6B49-72D9-ACD0-0F2FCE9AD0D5}" name="Source">
       <FILE id="fqVB21" name="OSCLogListBox.h" compile="0" resource="0" file="Source/OSCLogListBox.h"/>
diff --git a/examples/OSCReceiver/Builds/LinuxMakefile/Makefile b/examples/OSCReceiver/Builds/LinuxMakefile/Makefile
index ae5774b..ee6a4fc 100644
--- a/examples/OSCReceiver/Builds/LinuxMakefile/Makefile
+++ b/examples/OSCReceiver/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/OSCReceiver/OSCReceiver.jucer b/examples/OSCReceiver/OSCReceiver.jucer
index a602055..3f14082 100644
--- a/examples/OSCReceiver/OSCReceiver.jucer
+++ b/examples/OSCReceiver/OSCReceiver.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="pdocPt" name="OSCReceiver" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.OSCReceiver" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="Y6Q0O9" name="OSCReceiver">
     <GROUP id="{9F303ECD-83DE-CA91-97B4-C083DA897F49}" name="Source">
       <FILE id="HHuoMc" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
diff --git a/examples/OSCSender/Builds/LinuxMakefile/Makefile b/examples/OSCSender/Builds/LinuxMakefile/Makefile
index 70de81b..7f0f27a 100644
--- a/examples/OSCSender/Builds/LinuxMakefile/Makefile
+++ b/examples/OSCSender/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/OSCSender/OSCSender.jucer b/examples/OSCSender/OSCSender.jucer
index e71fe86..77c8d15 100644
--- a/examples/OSCSender/OSCSender.jucer
+++ b/examples/OSCSender/OSCSender.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="rysVAr" name="OSCSender" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.OSCSender" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="knnZZJ" name="OSCSender">
     <GROUP id="{F2A0007A-4D24-4DD6-DEC8-6428F36CE45D}" name="Source">
       <FILE id="ORaBHU" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
diff --git a/examples/OpenGLAppExample/OpenGLAppExample.jucer b/examples/OpenGLAppExample/OpenGLAppExample.jucer
index 8c1c151..2c7024b 100644
--- a/examples/OpenGLAppExample/OpenGLAppExample.jucer
+++ b/examples/OpenGLAppExample/OpenGLAppExample.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="c3KrlE" name="OpenGLAppExample" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.OpenGLAppExample" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="amjEXL" name="OpenGLAppExample">
     <GROUP id="{28FE2D12-A88D-07E2-72CF-CD04014CF225}" name="Source">
       <GROUP id="{666960E2-D311-806A-1FE7-A27057939840}" name="Resources">
diff --git a/examples/PluckedStringsDemo/PluckedStringsDemo.jucer b/examples/PluckedStringsDemo/PluckedStringsDemo.jucer
index d9f817a..5bf0782 100644
--- a/examples/PluckedStringsDemo/PluckedStringsDemo.jucer
+++ b/examples/PluckedStringsDemo/PluckedStringsDemo.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="jKHEJM" name="PluckedStringsDemo" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.timurdoumler.PluckedStringsDemo" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="IWdVf7" name="PluckedStringsDemo">
     <GROUP id="{8800CD50-6741-8B75-0305-FAF13427EF5D}" name="Source">
       <FILE id="Z7hWe1" name="StringSynthesiser.h" compile="0" resource="0"
diff --git a/examples/PlugInSamples/Arpeggiator/Arpeggiator.jucer b/examples/PlugInSamples/Arpeggiator/Arpeggiator.jucer
index fb7766e..18d502e 100644
--- a/examples/PlugInSamples/Arpeggiator/Arpeggiator.jucer
+++ b/examples/PlugInSamples/Arpeggiator/Arpeggiator.jucer
@@ -9,7 +9,7 @@
               pluginIsMidiEffectPlugin="1" pluginSilenceInIsSilenceOut="0"
               pluginEditorRequiresKeys="0" pluginAUExportPrefix="ArpeggiatorAU"
               pluginRTASCategory="" aaxIdentifier="com.ROLI.Arpeggiator" pluginAAXCategory="AAX_EPlugInCategory_Effect"
-              jucerVersion="4.2.1" companyName="ROLI Ltd." companyWebsite="www.juce.com"
+              jucerVersion="4.2.3" companyName="ROLI Ltd." companyWebsite="www.juce.com"
               companyEmail="info at juce.com" buildAUv3="0">
   <MAINGROUP id="l0H2am" name="Arpeggiator">
     <GROUP id="{E91162B3-479D-3630-4B5F-0E76EE995FB8}" name="Source">
diff --git a/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Arpeggiator.xcodeproj/project.pbxproj b/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Arpeggiator.xcodeproj/project.pbxproj
index a2cf610..695b477 100644
--- a/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Arpeggiator.xcodeproj/project.pbxproj
+++ b/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Arpeggiator.xcodeproj/project.pbxproj
@@ -26,9 +26,8 @@
 		2652F9F9C3F4DBC1C5D34974 = {isa = PBXBuildFile; fileRef = FAC1B0E5511BBD94A50A2E49; };
 		6056E4708065C48B5DBEC734 = {isa = PBXBuildFile; fileRef = 970820EDE1527139F0A21632; };
 		EFD318C0120FF5F53BE57A95 = {isa = PBXBuildFile; fileRef = 2F12CFEB1E95BC54E1CD3C7D; };
-		E3609826518EFA6E8E7589AB = {isa = PBXBuildFile; fileRef = ACE47F30020C3E4144BD108A; };
 		CBE3170A78C2C2BA01C59EB0 = {isa = PBXBuildFile; fileRef = C74725F506BB44F32F0D8E50; };
-		8A0665F23ACB1B3CB69D88F8 = {isa = PBXBuildFile; fileRef = A3F2CF6BFEAFFFE58A0A9B24; };
+		BDB2CF0F590248E3BB247AFD = {isa = PBXBuildFile; fileRef = 697EF2A14DCAE2E85C3C5A53; };
 		CD51ABAA6EF40CBA996A4E90 = {isa = PBXBuildFile; fileRef = 2E94A5BF0507304C7FBE7DAC; };
 		F9286BDCED2819E0411D290B = {isa = PBXBuildFile; fileRef = 2F4E8F666770D3FE1819841C; };
 		E121C97227FD69E95BC0B848 = {isa = PBXBuildFile; fileRef = B88670F8C43CDC4E1C93F040; };
@@ -146,6 +145,7 @@
 		1433B21863210729F0530CE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
 		1468E60D6C97CED46CEE65D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngread.c; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c"; sourceTree = "SOURCE_ROOT"; };
 		149DE318630BB06FE1878110 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
+		14ADC9B94C2E4CD0D6E0AEC1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		14B42A90EAB699C9D84607C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "residue_8.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h"; sourceTree = "SOURCE_ROOT"; };
 		14D6E8868C09C8A775DC2409 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ComponentBase.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/ComponentBase.h"; sourceTree = "SOURCE_ROOT"; };
 		14F1769BC9227265335CE7E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../../../../modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
@@ -242,6 +242,7 @@
 		2B27A10CE5AE76648A90D11B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2B74FE1DB5690776640A424A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jidctfst.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c"; sourceTree = "SOURCE_ROOT"; };
 		2B934F373C03D2E722D651A7 = {isa = PBXFileReference; lastKnownFileType = text.txt; name = "Flac Licence.txt"; path = "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt"; sourceTree = "SOURCE_ROOT"; };
+		2BFEB8B6D2202970E1EDA7E2 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		2C5EC74F7F59FB4D2EDBF48A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPESynthesiserVoice.h"; path = "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h"; sourceTree = "SOURCE_ROOT"; };
 		2C96D1EF867911A0E68FFBFF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
 		2CCEDD6E4D5033AC85568494 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; };
@@ -257,15 +258,15 @@
 		2E886B4634424C6F38673E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcapimin.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c"; sourceTree = "SOURCE_ROOT"; };
 		2E94A5BF0507304C7FBE7DAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
 		2EC53AB4DD0E835D9B23844C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUPlugInDispatch.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUPlugInDispatch.h"; sourceTree = "SOURCE_ROOT"; };
-		2F4E8F666770D3FE1819841C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
 		2FFF28CCC21983E2097F661E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; };
 		315792D7850F26654F7F799A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jidctflt.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c"; sourceTree = "SOURCE_ROOT"; };
 		316054DECCF2C8CA1375419C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnitTypes.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAVectorUnitTypes.h"; sourceTree = "SOURCE_ROOT"; };
 		31C6340CFAED51F9297A247B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
-		326380A033B511A7D6C908B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../../../../modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; };
+		31EA1DBEF38B6612DCF697ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../../../../modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; };
 		32AAD6851954F58C57AAF699 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../../../../modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; };
 		33FA636BC069C12099595FF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsPostScriptRenderer.h"; path = "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"; sourceTree = "SOURCE_ROOT"; };
 		34E23BC027A8B05CC5F418FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../../../../modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; };
+		34F7EF8094F8E02C29C9851B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
 		35A89273665F75DDA18CDC47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		35D50824AD807A721FA1ED0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDBurner.h"; path = "../../../../../modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h"; sourceTree = "SOURCE_ROOT"; };
 		3676883386C9710B77E2A882 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bitreader.h; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h"; sourceTree = "SOURCE_ROOT"; };
@@ -273,8 +274,6 @@
 		36E62B359C62BCD4DEC8715B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fixed.h; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h"; sourceTree = "SOURCE_ROOT"; };
 		375309A679FB0737182D6268 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mapping0.c; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mapping0.c"; sourceTree = "SOURCE_ROOT"; };
 		377125E7F99E475F08A365DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = memory.h; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h"; sourceTree = "SOURCE_ROOT"; };
-		38286B4A32B4D3C255E0A871 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AAX_Wrapper.cpp"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; };
-		385469D6F16711AF64054853 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioParameterFloat.h"; path = "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h"; sourceTree = "SOURCE_ROOT"; };
 		3BEDADA1310ADC048CDA2C5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MPENote.h"; path = "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h"; sourceTree = "SOURCE_ROOT"; };
 		3DF64E77DF55D4CFF0445C51 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReverbAudioSource.cpp"; path = "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
 		3F2ECB4984ED66DFE2FBC8A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = float.c; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c"; sourceTree = "SOURCE_ROOT"; };
@@ -287,10 +286,11 @@
 		2C88000D1FD0FF38CE9A45DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_RTAS_MacUtilities.mm"; path = "../../../../../modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm"; sourceTree = "SOURCE_ROOT"; };
 		2D0FF4338F332D5D2EF467BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ByteOrder.h"; path = "../../../../../modules/juce_core/memory/juce_ByteOrder.h"; sourceTree = "SOURCE_ROOT"; };
 		2F12CFEB1E95BC54E1CD3C7D = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+		2F4E8F666770D3FE1819841C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
 		2F9B863B3208F7FDC2DFB5C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentDragger.h"; path = "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h"; sourceTree = "SOURCE_ROOT"; };
 		3076EC4F52A19CE9017D3F25 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; };
 		30C6744AD7589406A556BB04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../../../../modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; };
-		31EA1DBEF38B6612DCF697ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../../../../modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; };
+		326380A033B511A7D6C908B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../../../../modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; };
 		32A851BECAA8CB552DA0C92B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionListener.h"; path = "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h"; sourceTree = "SOURCE_ROOT"; };
 		333B1B17AC6BBF4E5330BA2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; };
 		3393B8D4E413710805AAD1FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_osx.h"; path = "../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h"; sourceTree = "SOURCE_ROOT"; };
@@ -298,7 +298,6 @@
 		3447AC4248751CBF85190EAB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; };
 		34A5198B33BE63C226542043 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../../../../modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; };
 		34D919EE29BFF65E7B058F7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../../../../modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; };
-		34F7EF8094F8E02C29C9851B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
 		35BC4E6396C07229A7B57058 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; };
 		364C3095D20CCE47471C4DB0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; };
 		36B5D78633D30EBA28D70796 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -307,6 +306,8 @@
 		37506BAF1DE7956F29B94FC3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; };
 		37CB0A4D4B303E50117CE937 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; };
 		37CC572A9EBB11B044700DD9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		38286B4A32B4D3C255E0A871 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AAX_Wrapper.cpp"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; };
+		385469D6F16711AF64054853 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioParameterFloat.h"; path = "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h"; sourceTree = "SOURCE_ROOT"; };
 		38611AE4F0B78E647A39BDD4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RuntimePermissions.cpp"; path = "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"; sourceTree = "SOURCE_ROOT"; };
 		387FA9A6E4DD47AA1E9EB560 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = zconf.in.h; path = "../../../../../modules/juce_core/zip/zlib/zconf.in.h"; sourceTree = "SOURCE_ROOT"; };
 		38EB4858B45965104516E7E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; };
@@ -570,6 +571,7 @@
 		6965419522A8F4EE3C0E2F45 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
 		6966F44BE8B15F279DD220B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IPAddress.h"; path = "../../../../../modules/juce_core/network/juce_IPAddress.h"; sourceTree = "SOURCE_ROOT"; };
 		697C69452850D5C1756C89AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; };
+		697EF2A14DCAE2E85C3C5A53 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		69B162683CA492C8029257F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_CameraDevice.cpp"; path = "../../../../../modules/juce_video/native/juce_win32_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; };
 		69B2E6C4996E538FBA2F0DE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputBase.cpp; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUOutputBase.cpp"; sourceTree = "SOURCE_ROOT"; };
 		69B37CF1CC379A84387B0334 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pnginfo.h; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h"; sourceTree = "SOURCE_ROOT"; };
@@ -854,7 +856,6 @@
 		A3C4B0ADA80F626A16808AE0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdhuff.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c"; sourceTree = "SOURCE_ROOT"; };
 		A3CD317F3EE5C06F2EA1A08C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../../../../modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
 		A3E82EA41C7ED1F1F667C06F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_events.cpp"; path = "../../../../../modules/juce_events/juce_events.cpp"; sourceTree = "SOURCE_ROOT"; };
-		A3F2CF6BFEAFFFE58A0A9B24 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		A42D10D549BC0D20A8F94101 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A4934E1C24CBC9827ECC9149 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		A49A07A7416A34302BA77068 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1657,6 +1658,7 @@
 					C0EDB3E56321B663CEA2E600,
 					DAF907ABF4DE87F35748F3D6, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		A761179035DC171AE3CC1361 = {isa = PBXGroup; children = (
+					14ADC9B94C2E4CD0D6E0AEC1,
 					38286B4A32B4D3C255E0A871, ); name = AAX; sourceTree = "<group>"; };
 		2950965D1962FA815C4D2EED = {isa = PBXGroup; children = (
 					8050245A4FDA661B38C56FB7,
@@ -1717,12 +1719,10 @@
 					905886A5158A96197F3B794D, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		BA137B835216E7860F255BD8 = {isa = PBXGroup; children = (
 					2950965D1962FA815C4D2EED,
-					433FE5AD20CFA2F2D6A1E037,
 					3C5308C4C1F27A3EDA01A6AE,
 					7E48708D1F7B5C675C2317FA,
-					5B391F3E3B16BFFA2E2E022F,
-					A3F2CF6BFEAFFFE58A0A9B24, ); name = AU; sourceTree = "<group>"; };
-		8691C24C4102F1C9E9B9C411 = {isa = PBXGroup; children = (
+					5B391F3E3B16BFFA2E2E022F, ); name = AU; sourceTree = "<group>"; };
+		0F72F8E63055FBB979899A29 = {isa = PBXGroup; children = (
 					60887069093B99EFB6343769,
 					26EFE7738F4209B87E675B48,
 					8495D4AC707047B56331794B,
@@ -1730,10 +1730,10 @@
 					2C88000D1FD0FF38CE9A45DC,
 					85762464FE37AFE1886FEC22,
 					EBC20070F34FA195234BE6DF, ); name = RTAS; sourceTree = "<group>"; };
-		C05274DFED1EB6E34DF36733 = {isa = PBXGroup; children = (
+		745D75DA8B561FCA6860047F = {isa = PBXGroup; children = (
 					4383F22A2A80A06AD2CC494A,
 					12351FF0F32DCFFD8F9B753E, ); name = Standalone; sourceTree = "<group>"; };
-		99C24791D5336D7A9E41FAF5 = {isa = PBXGroup; children = (
+		B6C772C0440D8D8DBE7632CB = {isa = PBXGroup; children = (
 					391348A415637487C38D51AF,
 					689997DCF29C4EA0BBE54FB3,
 					F04DF2587A3735FD7CBD29C0,
@@ -1743,22 +1743,23 @@
 					4C2521E196D9F39AEE5A9A3C,
 					54ED3AEF6A560DA2A2C9A6A1,
 					73967B10B92F7FAB36839F0C, ); name = utility; sourceTree = "<group>"; };
-		5485B6828CE54EEAFCFE850A = {isa = PBXGroup; children = (
+		6CA0C21AAEF945AA59C2EB8C = {isa = PBXGroup; children = (
 					0462FCF4041854C357138EB2,
 					C18A26D290AB9B1B16DDF330, ); name = VST; sourceTree = "<group>"; };
-		17217ECF28B1997B5294F7EB = {isa = PBXGroup; children = (
+		8A9835029A0E7FDB7F930A00 = {isa = PBXGroup; children = (
 					EAAA5DE166254FF08BBF56C4, ); name = VST3; sourceTree = "<group>"; };
 		7FF931018B659697B544BFF0 = {isa = PBXGroup; children = (
 					A761179035DC171AE3CC1361,
 					BA137B835216E7860F255BD8,
-					8691C24C4102F1C9E9B9C411,
-					C05274DFED1EB6E34DF36733,
-					99C24791D5336D7A9E41FAF5,
-					5485B6828CE54EEAFCFE850A,
-					17217ECF28B1997B5294F7EB,
+					0F72F8E63055FBB979899A29,
+					745D75DA8B561FCA6860047F,
+					B6C772C0440D8D8DBE7632CB,
+					6CA0C21AAEF945AA59C2EB8C,
+					8A9835029A0E7FDB7F930A00,
 					735F5B2D82B337DC3E3F2B4C,
 					951CE97A5CF4D268F6F8F450,
 					F9BB54AE65B0CB1C8D3A6484,
+					697EF2A14DCAE2E85C3C5A53,
 					7A8D5B45E22BF4C69EE381A7,
 					5E7D4EE3F4AF0E8F5178E18E,
 					74F428D92543A96844DADEA8,
@@ -2844,8 +2845,7 @@
 					AD33FF34F267508546D24E26,
 					E39E8398B8A26F3F99A37341,
 					DE0DBA6DFFF3F7B3024D78AF,
-					2F12CFEB1E95BC54E1CD3C7D,
-					ACE47F30020C3E4144BD108A, ); name = Resources; sourceTree = "<group>"; };
+					2F12CFEB1E95BC54E1CD3C7D, ); name = Resources; sourceTree = "<group>"; };
 		61D8F5CF64FE3EC528B85D1B = {isa = PBXGroup; children = (
 					C3F6222E9059F8CCD9674AD0,
 					AC840D910B076A8D6E11D0E3,
@@ -3277,7 +3277,7 @@
 		3C2FB38C546E3A4CBD11DD08 = {isa = XCConfigurationList; buildConfigurations = (
 					6A83695CF366C87636A392BE,
 					024F8B1B5C243015CA8FEF35, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		08D74DB290FCD09A8D4810BB = {isa = PBXAggregateTarget; buildConfigurationList = 3C2FB38C546E3A4CBD11DD08; dependencies = (
+		08D74DB290FCD09A8D4810BB = {isa = PBXAggregateTarget; buildConfigurationList = 3C2FB38C546E3A4CBD11DD08; buildPhases = (  ); buildRules = ( ); dependencies = (
 					D65F24B83710D0DAEB515331,
 					FB5FCA02BA29016482B2C525,
 					78D7AF4AA023DEF36CFB4694,
@@ -3287,8 +3287,7 @@
 					D83A1735FBD5B491316453B8,
 					AC0ABA95F0350939E21390E1, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		DD2730D2C73FAF12FC2A2FE1 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					EFD318C0120FF5F53BE57A95,
-					E3609826518EFA6E8E7589AB, ); runOnlyForDeploymentPostprocessing = 0; };
+					EFD318C0120FF5F53BE57A95, ); runOnlyForDeploymentPostprocessing = 0; };
 		374615B793201971BEB6ACD7 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					3F4774290CDA1A5712701353, ); runOnlyForDeploymentPostprocessing = 0; };
 		C536519964353A302E775B31 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3313,8 +3312,7 @@
 					D42A639827E2709B5AF668D8,
 					07B9E8F70529950A47F22BA0, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		6E5217D875151ACA03487C5F = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					EFD318C0120FF5F53BE57A95,
-					E3609826518EFA6E8E7589AB, ); runOnlyForDeploymentPostprocessing = 0; };
+					EFD318C0120FF5F53BE57A95, ); runOnlyForDeploymentPostprocessing = 0; };
 		D6A7B6CC63294E7F4E4C2669 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					087F53B6CB2E5291253A1662, ); runOnlyForDeploymentPostprocessing = 0; };
 		FD25AA0E45A27BC734181E25 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3339,10 +3337,9 @@
 					575D0AC8DD9926D1C8349BE2,
 					6B6E02F5844A057FE3738154, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		D4AFA92A095134140E436078 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					EFD318C0120FF5F53BE57A95,
-					E3609826518EFA6E8E7589AB, ); runOnlyForDeploymentPostprocessing = 0; };
+					EFD318C0120FF5F53BE57A95, ); runOnlyForDeploymentPostprocessing = 0; };
 		2DBC42F261B32E5F29204E1A = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					8A0665F23ACB1B3CB69D88F8, ); runOnlyForDeploymentPostprocessing = 0; };
+					BDB2CF0F590248E3BB247AFD, ); runOnlyForDeploymentPostprocessing = 0; };
 		CE1F70D63BB05DCAD3BA3110 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					7FD723582B7BF1775729023D,
 					1935BD4130D5954448BC9B9D, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3371,8 +3368,7 @@
 					515B9E5E69F486633922E731,
 					3F21DFC5AA6C44E97BE3588C, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		56971B7CCCA861C76980BF5F = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					EFD318C0120FF5F53BE57A95,
-					E3609826518EFA6E8E7589AB, ); runOnlyForDeploymentPostprocessing = 0; };
+					EFD318C0120FF5F53BE57A95, ); runOnlyForDeploymentPostprocessing = 0; };
 		A74DE6A1732099BA13F670AD = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					0C147FBEF5B1A66FBFBB01F4, ); runOnlyForDeploymentPostprocessing = 0; };
 		B6D4E134F7DDBE5BEE94F2B0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
diff --git a/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Info-Shared_Code.plist b/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Info-Shared_Code.plist
deleted file mode 100644
index 43df714..0000000
--- a/examples/PlugInSamples/Arpeggiator/Builds/MacOSX/Info-Shared_Code.plist
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist>
-  <dict>
-    <key>CFBundleExecutable</key>
-    <string>${EXECUTABLE_NAME}</string>
-    <key>CFBundleIconFile</key>
-    <string></string>
-    <key>CFBundleIdentifier</key>
-    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-    <key>CFBundleName</key>
-    <string>Arpeggiator</string>
-    <key>CFBundleDisplayName</key>
-    <string>Arpeggiator</string>
-    <key>CFBundlePackageType</key>
-    <string>FMWK</string>
-    <key>CFBundleSignature</key>
-    <string>????</string>
-    <key>CFBundleShortVersionString</key>
-    <string>1.0.0</string>
-    <key>CFBundleVersion</key>
-    <string>1.0.0</string>
-    <key>NSHumanReadableCopyright</key>
-    <string>ROLI Ltd.</string>
-    <key>NSHighResolutionCapable</key>
-    <true/>
-  </dict>
-</plist>
diff --git a/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj b/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj
index 84d45cf..f74744c 100644
--- a/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj
+++ b/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj
@@ -1952,6 +1952,7 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2449,7 +2450,8 @@
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj.filters b/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj.filters
index d35303a..3e8e47e 100644
--- a/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj.filters
+++ b/examples/PlugInSamples/Arpeggiator/Builds/VisualStudio2015/Arpeggiator.vcxproj.filters
@@ -2676,6 +2676,9 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4163,8 +4166,11 @@
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/PlugInSamples/Arpeggiator/JuceLibraryCode/AppConfig.h b/examples/PlugInSamples/Arpeggiator/JuceLibraryCode/AppConfig.h
index 7a74eb2..84d9132 100644
--- a/examples/PlugInSamples/Arpeggiator/JuceLibraryCode/AppConfig.h
+++ b/examples/PlugInSamples/Arpeggiator/JuceLibraryCode/AppConfig.h
@@ -111,6 +111,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -253,10 +260,10 @@
  #define JucePlugin_ManufacturerEmail      "info at juce.com"
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'Arpg'
+ #define JucePlugin_PluginCode             0x41727067 // 'Arpg'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                0
@@ -289,7 +296,7 @@
  #define JucePlugin_VSTCategory            kPlugCategEffect
 #endif
 #ifndef  JucePlugin_AUMainType
- #define JucePlugin_AUMainType             kAudioUnitType_Effect
+ #define JucePlugin_AUMainType             'aumi'
 #endif
 #ifndef  JucePlugin_AUSubType
  #define JucePlugin_AUSubType              JucePlugin_PluginCode
diff --git a/examples/PlugInSamples/GainPlugIn/Builds/MacOSX/GainPlugIn.xcodeproj/project.pbxproj b/examples/PlugInSamples/GainPlugIn/Builds/MacOSX/GainPlugIn.xcodeproj/project.pbxproj
index e6580bf..eeb4672 100644
--- a/examples/PlugInSamples/GainPlugIn/Builds/MacOSX/GainPlugIn.xcodeproj/project.pbxproj
+++ b/examples/PlugInSamples/GainPlugIn/Builds/MacOSX/GainPlugIn.xcodeproj/project.pbxproj
@@ -26,9 +26,8 @@
 		6B4E64CC0DA5E1DC53159376 = {isa = PBXBuildFile; fileRef = 28754784774E7974CF215965; };
 		14E482AFF9CC9F18BA3798BD = {isa = PBXBuildFile; fileRef = 8B25F581B3FC77FB9FE0079B; };
 		434F6E14A0DACDAA2BF2212B = {isa = PBXBuildFile; fileRef = E13512F9451169A200CA63BF; };
-		685F85F881C02A3AAA5E9B47 = {isa = PBXBuildFile; fileRef = BF909DFBC9B899C6119F556B; };
 		FADD82E463A2C5169B5F72E9 = {isa = PBXBuildFile; fileRef = ECD7D7FB3760E3792BAAC6CE; };
-		9D6465B0B231D381F43E350E = {isa = PBXBuildFile; fileRef = 52F901B45BB73B9A4C4588C4; };
+		F6C5AAF2B7414AC1474EF3EA = {isa = PBXBuildFile; fileRef = 2BB3D82DA20E11064A181C9F; };
 		BE1CCB2BA25C1B9CC93BD180 = {isa = PBXBuildFile; fileRef = 2A42EB4E6808C916CD805B55; };
 		6A823DA60FD178B0AE4F7795 = {isa = PBXBuildFile; fileRef = 539D8FB917601AE0FEF2EDD0; };
 		6859170B30F156B4628F7476 = {isa = PBXBuildFile; fileRef = 3F62CC0D964ADA2C5FEE8780; };
@@ -222,6 +221,7 @@
 		2134DC1B33511F87D54B2D8A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLFrameBuffer.cpp"; path = "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2147F477AF3713D33E1E50CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../../../../modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; };
 		2152D28F9FCD5E968AB74A6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; };
+		21888BBF72D5076AA09BF442 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		218E7DFF985197C095961EB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; };
 		21B97DA05679BB8EE0C91A65 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; };
 		21D96C3F5C44E2768DC18ED0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLFrameBuffer.h"; path = "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -277,6 +277,7 @@
 		2B67B13342F0A3F807DF2B2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiRPN.cpp"; path = "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2B7C784CF333CA6BEEF5038A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_DigiCode1.cpp"; path = "../../../../../modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2B8E9F5D2845DA70FCDB53F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = "../../../../../modules/juce_core/zip/zlib/deflate.c"; sourceTree = "SOURCE_ROOT"; };
+		2BB3D82DA20E11064A181C9F = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		2BC8F8214792631A55C86182 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IncludeModuleHeaders.h"; path = "../../../../../modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h"; sourceTree = "SOURCE_ROOT"; };
 		2BFB3614DD9C2CFD7D08B4D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_graphics.cpp"; path = "../../../../../modules/juce_graphics/juce_graphics.cpp"; sourceTree = "SOURCE_ROOT"; };
 		2C29E6A7967E9244FC3CDE85 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
@@ -472,7 +473,6 @@
 		52B3A797835ED0B7474BD7C5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_QuickTimeMovieComponent.cpp"; path = "../../../../../modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		52BFB6C68B8BF5A6BEFC0127 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBuffer.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUBuffer.h"; sourceTree = "SOURCE_ROOT"; };
 		52E047F304B418DC34B7961D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
-		52F901B45BB73B9A4C4588C4 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		539D8FB917601AE0FEF2EDD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; };
 		53C8168EAD3420C0EFD34BE8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
 		53F794C42FF269F389C0371A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1227,6 +1227,7 @@
 		EE3D9D885DC024F73E7BA834 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CarbonEventHandler.cpp; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CarbonEventHandler.cpp"; sourceTree = "SOURCE_ROOT"; };
 		EE68D617C21D6400FFDC08E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActiveXControlComponent.h"; path = "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		EE799DBCC57F1B69CEB332A1 = {isa = PBXFileReference; lastKnownFileType = file.r; name = AUResources.r; path = "../../../../../modules/juce_audio_plugin_client/AU/AUResources.r"; sourceTree = "SOURCE_ROOT"; };
+		EEB2A8271DE160CC76165242 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		EEE02CD512C902DD7B0C5D13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../../../../modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; };
 		EF055DD10D73DD84E657AB0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../../../../modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; };
 		EF0ED3DFA2926694133E27E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModalComponentManager.cpp"; path = "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1244,6 +1245,7 @@
 		F19532C9A9B834EF732E2C52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MPEZoneLayout.cpp"; path = "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F1A0F0881D3C62C8E705120E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-VST3.plist"; path = "Info-VST3.plist"; sourceTree = "SOURCE_ROOT"; };
 		F1B4EC755365729CF9850E27 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
+		F1B858A448D0BA6929408B97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jchuff.h; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h"; sourceTree = "SOURCE_ROOT"; };
 		F1C1D72B4B911227DF608946 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModifierKeys.cpp"; path = "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F2317300350CF81B3EC383A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = transupp.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c"; sourceTree = "SOURCE_ROOT"; };
 		F28941FBBB1C31040CDFEA67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1253,11 +1255,6 @@
 		F3B8EEB02E5588D99021DD10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AiffAudioFormat.h"; path = "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		F3BFC5ADFAD663890D658894 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
 		F3FC0F1212CEA1EE597AF0DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_opengl.cpp"; path = "../../../../../modules/juce_opengl/juce_opengl.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F8D93BA03DB14514E2F9D007 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GainPlugIn.component; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		C43A527A45129CF421296BD0 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GainPlugIn.aaxplugin; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		074F1E0FAFBD4B127B869BC2 = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGainPlugIn.a; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		F1B858A448D0BA6929408B97 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jchuff.h; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h"; sourceTree = "SOURCE_ROOT"; };
-		F405F19EE310FBC6BB4A1472 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAXException.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAXException.h"; sourceTree = "SOURCE_ROOT"; };
 		F507AE61AF55B2101383B1E1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectShowComponent.h"; path = "../../../../../modules/juce_video/playback/juce_DirectShowComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		F527FEA0852AA21984AD9F47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; };
 		F549ECCF4D91FC7A30105297 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../../../../modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1270,13 +1267,17 @@
 		F5C623942E20C541382097E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OutputStream.cpp"; path = "../../../../../modules/juce_core/streams/juce_OutputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F5EAFB838EC3E83930E9C8F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jddctmgr.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c"; sourceTree = "SOURCE_ROOT"; };
 		F6AC635E17C2745BA801256F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../../../../modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F6D0C31C49847196CB56EF7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../../../../modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
 		F6D61FC781A1532ACF955A56 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; };
-		F6F268E5CE4AC0C5EFF2A414 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewControl.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUCarbonViewControl.h"; sourceTree = "SOURCE_ROOT"; };
 		F73E61CD3ACE30495293E399 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jcphuff.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c"; sourceTree = "SOURCE_ROOT"; };
 		F758A3A014E70D7F75D889D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F76BAD45163B80F58A11FE42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatManager.cpp"; path = "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F7837342DC31305E98733379 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorGraph.cpp"; path = "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"; sourceTree = "SOURCE_ROOT"; };
+		F8D93BA03DB14514E2F9D007 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GainPlugIn.component; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		C43A527A45129CF421296BD0 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GainPlugIn.aaxplugin; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		074F1E0FAFBD4B127B869BC2 = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGainPlugIn.a; sourceTree = "BUILT_PRODUCTS_DIR"; };
+		F405F19EE310FBC6BB4A1472 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAXException.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAXException.h"; sourceTree = "SOURCE_ROOT"; };
+		F6D0C31C49847196CB56EF7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../../../../modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+		F6F268E5CE4AC0C5EFF2A414 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewControl.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUCarbonViewControl.h"; sourceTree = "SOURCE_ROOT"; };
+		F76BAD45163B80F58A11FE42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatManager.cpp"; path = "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F79776F078375AA287A24AB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../JuceLibraryCode/juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
 		F7BB750285C1A56C05A6B437 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
 		F7FA3CA65C2B371C902CA9EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1657,6 +1658,7 @@
 					56FF5DCB746A2F7485406F63,
 					18B7B5B0C06A1C96ED45C9AB, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		F1C57B1BE7D3A85714FB7C7A = {isa = PBXGroup; children = (
+					EEB2A8271DE160CC76165242,
 					B41DB1D9877BC61AB0558A69, ); name = AAX; sourceTree = "<group>"; };
 		AB9348DF000622E4B2C60AD4 = {isa = PBXGroup; children = (
 					F12E2F9633C0C10172C7EB29,
@@ -1717,12 +1719,10 @@
 					5E148B6D2D4D3ACADBD369BA, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		F2D5F877258DB2BBF0433F23 = {isa = PBXGroup; children = (
 					AB9348DF000622E4B2C60AD4,
-					EE799DBCC57F1B69CEB332A1,
 					8CABBDFF3D48FA622F561D56,
 					B15D003DE2F4E963EC111711,
-					8782AADF74783EA3DD066529,
-					52F901B45BB73B9A4C4588C4, ); name = AU; sourceTree = "<group>"; };
-		A8BAB3F628FDD2F723B11AF5 = {isa = PBXGroup; children = (
+					8782AADF74783EA3DD066529, ); name = AU; sourceTree = "<group>"; };
+		1DDAAEC5B6DB8099FC652515 = {isa = PBXGroup; children = (
 					B7EC6979B78232E97C67586D,
 					2B7C784CF333CA6BEEF5038A,
 					CF608BF804CB06BCBB51B9C2,
@@ -1730,10 +1730,10 @@
 					6701AB4D2F5DAD2EA72ACFE9,
 					DC55FBABEB3A839B6602D678,
 					DBF11B9083F40C0C849B9302, ); name = RTAS; sourceTree = "<group>"; };
-		48CA15F7102E796E2AD6058D = {isa = PBXGroup; children = (
+		ABE3EC02D9B5D528025BF690 = {isa = PBXGroup; children = (
 					43B51F79EFF2E9673AA1BCE6,
 					8323AB8EF5430A81A4FDD26E, ); name = Standalone; sourceTree = "<group>"; };
-		50034CFA00470A07703FD97C = {isa = PBXGroup; children = (
+		AAB881B99070695DB74EB217 = {isa = PBXGroup; children = (
 					9B5CE97BAC0AAD8EEAF75ABF,
 					38687DB2FEC47B8E4826346E,
 					E219774D186DF70D694D2768,
@@ -1743,22 +1743,23 @@
 					9F56E1F9CF75D555C677A38D,
 					E9FEFC46FF2B51B8C3A520F4,
 					21F8A643A1D07AE29337D139, ); name = utility; sourceTree = "<group>"; };
-		0DA9BEC29F87A7F4440AA21A = {isa = PBXGroup; children = (
+		D78074DEDA44278DDA6376E6 = {isa = PBXGroup; children = (
 					9548631628595F1576CD7B73,
 					C3D43F992D8AAA5EF9D23288, ); name = VST; sourceTree = "<group>"; };
-		CD737733FC3EFC2B3A99B8C1 = {isa = PBXGroup; children = (
+		C02CF34EACB3A93904174BD4 = {isa = PBXGroup; children = (
 					8676D218DB100E6B4636A82E, ); name = VST3; sourceTree = "<group>"; };
 		F7173AE77C51F8BD4B4476AC = {isa = PBXGroup; children = (
 					F1C57B1BE7D3A85714FB7C7A,
 					F2D5F877258DB2BBF0433F23,
-					A8BAB3F628FDD2F723B11AF5,
-					48CA15F7102E796E2AD6058D,
-					50034CFA00470A07703FD97C,
-					0DA9BEC29F87A7F4440AA21A,
-					CD737733FC3EFC2B3A99B8C1,
+					1DDAAEC5B6DB8099FC652515,
+					ABE3EC02D9B5D528025BF690,
+					AAB881B99070695DB74EB217,
+					D78074DEDA44278DDA6376E6,
+					C02CF34EACB3A93904174BD4,
 					B5F601E64CCEDC477481A4ED,
 					BBBE3DABDB9284A6397CE7B8,
 					FEDE864FABF0E3C4883CF664,
+					2BB3D82DA20E11064A181C9F,
 					A9D38AF307DF9AD3D7E01502,
 					4544225B1B0BC9D00BA328C0,
 					03B89FFF7FBE455F753317FB,
@@ -2844,8 +2845,7 @@
 					F1A0F0881D3C62C8E705120E,
 					EDFE3B976573F01C8D3AA486,
 					9D1C58BBAA0B7F70D6EB7724,
-					E13512F9451169A200CA63BF,
-					BF909DFBC9B899C6119F556B, ); name = Resources; sourceTree = "<group>"; };
+					E13512F9451169A200CA63BF, ); name = Resources; sourceTree = "<group>"; };
 		00DE399BF0EF1D2BB5C99DF6 = {isa = PBXGroup; children = (
 					71B73129FAEF3B7CB3FF6993,
 					9D6BD8DE6FC16E28FE2169F0,
@@ -3277,7 +3277,7 @@
 		960E82451D9B9C0C256DE750 = {isa = XCConfigurationList; buildConfigurations = (
 					28E3B1FE50FFC5B2A58897A0,
 					987E131B9EAD1C8CE9786F9C, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		67946078D4B1207C2A6BDB4F = {isa = PBXAggregateTarget; buildConfigurationList = 960E82451D9B9C0C256DE750; dependencies = (
+		67946078D4B1207C2A6BDB4F = {isa = PBXAggregateTarget; buildConfigurationList = 960E82451D9B9C0C256DE750; buildPhases = (  ); buildRules = ( ); dependencies = (
 					60FCED8B68702AB28A4297C4,
 					0F3A38F7A210718AC51B5B67,
 					6FBE3D1D1900F691ECD1E9CF,
@@ -3287,8 +3287,7 @@
 					2258034E5AABF301ACB109C1,
 					B5B4DDE9429C2F747AEAFEBC, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		AAA7EBE70E20807CF2102118 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					434F6E14A0DACDAA2BF2212B,
-					685F85F881C02A3AAA5E9B47, ); runOnlyForDeploymentPostprocessing = 0; };
+					434F6E14A0DACDAA2BF2212B, ); runOnlyForDeploymentPostprocessing = 0; };
 		006D5D33A2A2D68C9354B32D = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					C396DBDD84D1162113B3ABD7, ); runOnlyForDeploymentPostprocessing = 0; };
 		911E05FA69C1B8015EA96560 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3313,8 +3312,7 @@
 					1F8B7104586EEA017DC9E66D,
 					8C4CBD97ADA22451A0CBDB2A, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		F779790510354BCC375B6866 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					434F6E14A0DACDAA2BF2212B,
-					685F85F881C02A3AAA5E9B47, ); runOnlyForDeploymentPostprocessing = 0; };
+					434F6E14A0DACDAA2BF2212B, ); runOnlyForDeploymentPostprocessing = 0; };
 		961B720A39DE7A36993450FB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					60A23086F8F04399960054A9, ); runOnlyForDeploymentPostprocessing = 0; };
 		B97CFDFCFBB3263FBE4CE9DA = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3339,10 +3337,9 @@
 					913C8DA77769EF7E429930F2,
 					93405247663082AE0B727930, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		A8BFD81EACAF4420A2D9C7E7 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					434F6E14A0DACDAA2BF2212B,
-					685F85F881C02A3AAA5E9B47, ); runOnlyForDeploymentPostprocessing = 0; };
+					434F6E14A0DACDAA2BF2212B, ); runOnlyForDeploymentPostprocessing = 0; };
 		12E5B85CBAEF4ADCEF60C693 = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					9D6465B0B231D381F43E350E, ); runOnlyForDeploymentPostprocessing = 0; };
+					F6C5AAF2B7414AC1474EF3EA, ); runOnlyForDeploymentPostprocessing = 0; };
 		7CD5DF20930E5FD4B8978F68 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					27BAA78181CB9EA282A6AC64,
 					7EFB529B9EA74539375A96E0, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3371,8 +3368,7 @@
 					71BC79A3E5FEBDB257DE068E,
 					A1AD203AE69C428760D3AD4A, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		87D9874ECD12A1F70BE4B01C = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					434F6E14A0DACDAA2BF2212B,
-					685F85F881C02A3AAA5E9B47, ); runOnlyForDeploymentPostprocessing = 0; };
+					434F6E14A0DACDAA2BF2212B, ); runOnlyForDeploymentPostprocessing = 0; };
 		5ED60E79CB2B11C45637CA8A = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					920289CA43FF41424E0F0AE9, ); runOnlyForDeploymentPostprocessing = 0; };
 		B4837EEA7868B856A37F43BD = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
diff --git a/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj b/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj
index 26db43e..3169ab0 100644
--- a/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj
+++ b/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj
@@ -1952,6 +1952,7 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2449,7 +2450,8 @@
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj.filters b/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj.filters
index a5dcf34..d5c5414 100644
--- a/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj.filters
+++ b/examples/PlugInSamples/GainPlugIn/Builds/VisualStudio2015/GainPlugIn.vcxproj.filters
@@ -2676,6 +2676,9 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4163,8 +4166,11 @@
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/PlugInSamples/GainPlugIn/GainPlugIn.jucer b/examples/PlugInSamples/GainPlugIn/GainPlugIn.jucer
index fc250e7..623d778 100644
--- a/examples/PlugInSamples/GainPlugIn/GainPlugIn.jucer
+++ b/examples/PlugInSamples/GainPlugIn/GainPlugIn.jucer
@@ -8,7 +8,7 @@
               pluginIsSynth="0" pluginWantsMidiIn="0" pluginProducesMidiOut="0"
               pluginSilenceInIsSilenceOut="1" pluginEditorRequiresKeys="0"
               pluginAUExportPrefix="GainPlugInAU" pluginRTASCategory="" aaxIdentifier="com.ROLI.GainPlugIn"
-              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.1"
+              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.3"
               pluginIsMidiEffectPlugin="0" buildAUv3="0">
   <MAINGROUP id="sXaVAU" name="GainPlugIn">
     <GROUP id="{57500C1B-EA6F-4A79-EE51-1D02CA8A8350}" name="Source">
diff --git a/examples/PlugInSamples/GainPlugIn/JuceLibraryCode/AppConfig.h b/examples/PlugInSamples/GainPlugIn/JuceLibraryCode/AppConfig.h
index fb02c04..f358305 100644
--- a/examples/PlugInSamples/GainPlugIn/JuceLibraryCode/AppConfig.h
+++ b/examples/PlugInSamples/GainPlugIn/JuceLibraryCode/AppConfig.h
@@ -111,6 +111,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -253,10 +260,10 @@
  #define JucePlugin_ManufacturerEmail      ""
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'Gain'
+ #define JucePlugin_PluginCode             0x4761696e // 'Gain'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                0
diff --git a/examples/PlugInSamples/MultiOutSynth/Builds/MacOSX/MultiOutSynth.xcodeproj/project.pbxproj b/examples/PlugInSamples/MultiOutSynth/Builds/MacOSX/MultiOutSynth.xcodeproj/project.pbxproj
index 3886592..905ef53 100644
--- a/examples/PlugInSamples/MultiOutSynth/Builds/MacOSX/MultiOutSynth.xcodeproj/project.pbxproj
+++ b/examples/PlugInSamples/MultiOutSynth/Builds/MacOSX/MultiOutSynth.xcodeproj/project.pbxproj
@@ -26,9 +26,8 @@
 		EF983C366CDBC57B6FEE75D3 = {isa = PBXBuildFile; fileRef = 15B8BCB48229C73748FB9E9C; };
 		FC43C69A538FBE74E63D8D2D = {isa = PBXBuildFile; fileRef = 0E52162DFFFCCD06B941AE62; };
 		7293C6A173EDB952C43C4E1E = {isa = PBXBuildFile; fileRef = 8F6829961A0F50B8265BD9CB; };
-		0D85DE716EC383C1E7CA404B = {isa = PBXBuildFile; fileRef = 47C8050DE3ABBEC6BEC74B2F; };
 		DBEB6D440551FCEA8C7EC910 = {isa = PBXBuildFile; fileRef = 614BDB6E04A50D791DF8A237; };
-		28C99E7CD1CE273646B706BF = {isa = PBXBuildFile; fileRef = F06745DFADC49CA1C3D5C964; };
+		7E2BF0D7672428735E4B25C6 = {isa = PBXBuildFile; fileRef = 662205D63DB6B428A86C4E88; };
 		F3EA62332EC4B7A82F672E51 = {isa = PBXBuildFile; fileRef = 0D3AB1D2BB096CE5F3EAAE0F; };
 		CBF6D1C360065E76B0C371BD = {isa = PBXBuildFile; fileRef = CBDE271C4C5387CE39BD348F; };
 		6849CB54E7F162EDDFB344C9 = {isa = PBXBuildFile; fileRef = 6FCB8DD99D8DB1C154E30620; };
@@ -580,6 +579,7 @@
 		65D9B4315FAA195761CE7527 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorParameterWithID.h"; path = "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h"; sourceTree = "SOURCE_ROOT"; };
 		65F124A6502B670A634647EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		660CCC2FD998549705CD7B61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponentPeer.mm"; path = "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; };
+		662205D63DB6B428A86C4E88 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		665763F2042DE8357AF3B1A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; };
 		665D6CE9BEC24300CD897F0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RecentlyOpenedFilesList.cpp"; path = "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp"; sourceTree = "SOURCE_ROOT"; };
 		66C34363559FEABE6A3FFF4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageConvolutionKernel.h"; path = "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h"; sourceTree = "SOURCE_ROOT"; };
@@ -633,6 +633,7 @@
 		701887A3C3EE66EEF8EF0961 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioParameterFloat.h"; path = "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h"; sourceTree = "SOURCE_ROOT"; };
 		701C0E9CF1CA9D837C4EB044 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAUParameter.h"; sourceTree = "SOURCE_ROOT"; };
 		7053FC8D746749F7DA46BC08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bitreader.c; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c"; sourceTree = "SOURCE_ROOT"; };
+		7059556F3B242B8E276833AC = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		706EA223A5859B5B1D9AE107 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../../../../modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; };
 		70BC3C87909EA4BAA5A23BFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		70C5C7441E1ABDD141697357 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MPESynthesiserVoice.cpp"; path = "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -786,6 +787,7 @@
 		8F5F65FD0D7B5E2A7029D68C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_22.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h"; sourceTree = "SOURCE_ROOT"; };
 		8F6829961A0F50B8265BD9CB = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
 		8F808F4330D4F791E62FC452 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; };
+		8F929BB1E10DD57C1056FF50 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		8F9997207C596AF8202322E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8FA0603940FEA0AFA46A769E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8FBC36FD7DC1A74D573936AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../../../../modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1079,7 +1081,6 @@
 		CA8CF02AC2665E599ECF7A7C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CAAE1D22DACE9CACB93B2129 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V3.cpp"; path = "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CAF48DE29336FD7E6BA83365 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
-		CB841032A149EE040BB59594 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
 		CBDE271C4C5387CE39BD348F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; };
 		CC1F87E59205712A0B2B08D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginHostType.h"; path = "../../../../../modules/juce_audio_plugin_client/utility/juce_PluginHostType.h"; sourceTree = "SOURCE_ROOT"; };
 		CC8E350DE3898296FD1CA6AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_gui_extra.cpp"; path = "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1088,12 +1089,9 @@
 		CCF97D006BD017722C74B6A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/MusicDeviceBase.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CD02F270DE7AE1635A3E423E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CD111D36AD8E9D73CE9739F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../../../../modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; };
-		CD26D70DEFE69EB620F09443 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../../../../modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; };
-		CD2CEC703F63930859D26DBA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		CD4A4B5DF38D0F6C1B5CA961 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FilenameComponent.cpp"; path = "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CE1C954808FDA669FEEFDC2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
-		CE7AB9CEBC2AD27B236A69F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StandaloneFilterApp.cpp"; path = "../../../../../modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp"; sourceTree = "SOURCE_ROOT"; };
-		CEEC9947F99D7F39C77DE79B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; };
+		CE756CA0F5505BA8084D5CA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
 		CF2A59FABE1AEC5251A7C9A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAudioChannelLayout.cpp; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAudioChannelLayout.cpp"; sourceTree = "SOURCE_ROOT"; };
 		D5445BE1A8D52195956FD045 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		D6889EB5ED8960BD2093A686 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ios_Audio.cpp"; path = "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1105,10 +1103,14 @@
 		C785485A7DC04A2134F4F2B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MPEValue.cpp"; path = "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C7FF15427F8871470BFA4820 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CB1789262FD3A919F45A7FD3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KnownPluginList.h"; path = "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h"; sourceTree = "SOURCE_ROOT"; };
+		CB841032A149EE040BB59594 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
+		CD26D70DEFE69EB620F09443 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../../../../modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; };
+		CD2CEC703F63930859D26DBA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
 		CD4CB495D75A2ABAA66A2951 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MixerAudioSource.h"; path = "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
 		CDB15D2B8437758B0F7434B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../../../../modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; };
-		CE756CA0F5505BA8084D5CA8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"; sourceTree = "SOURCE_ROOT"; };
+		CE7AB9CEBC2AD27B236A69F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StandaloneFilterApp.cpp"; path = "../../../../../modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp"; sourceTree = "SOURCE_ROOT"; };
 		CEA5C634122F13B61BC06B2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemTrayIcon.cpp"; path = "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; };
+		CEEC9947F99D7F39C77DE79B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; };
 		D01619CC43F88EC81883B673 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; };
 		D06DCC799C2F8567B19C2B0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../../../../modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; };
 		D08EBD01477B270E49ADD283 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bitwise.c; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1246,7 +1248,6 @@
 		EF8849B28A436C3A48F95829 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLHelpers.h"; path = "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h"; sourceTree = "SOURCE_ROOT"; };
 		EFC0C53B3B0C166406FA20DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngwio.c; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c"; sourceTree = "SOURCE_ROOT"; };
 		EFECC8D227334F0274FE2BF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; };
-		F06745DFADC49CA1C3D5C964 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		F09ADDD0ED10155EB599DD3F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = synthesis.c; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c"; sourceTree = "SOURCE_ROOT"; };
 		F0E7FB678622A999A3AF4FED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../../../../modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; };
 		F13ED53195C1AFEC88B36244 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1664,6 +1665,7 @@
 					0D4AA39D67CF9EB2B8FC06C9,
 					4B4395FD0B981840C14E2344, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		EC8818482FE69DEA2472407C = {isa = PBXGroup; children = (
+					8F929BB1E10DD57C1056FF50,
 					069622CB01111075080B6F60, ); name = AAX; sourceTree = "<group>"; };
 		93B4691809E49A377D666871 = {isa = PBXGroup; children = (
 					AA6B7C4CCA49273A0A082DD0,
@@ -1724,12 +1726,10 @@
 					75300D231C75A269DD7D523F, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		7B934098FF9E066D257F3FC8 = {isa = PBXGroup; children = (
 					93B4691809E49A377D666871,
-					868CB112CC3DC2F9ABBB8480,
 					5A56163B25252D8E74389F96,
 					836EAC1C5D126C6C8907E8C7,
-					675627DA901E329524A4B7CD,
-					F06745DFADC49CA1C3D5C964, ); name = AU; sourceTree = "<group>"; };
-		F28D61A1E7F58403483E15BA = {isa = PBXGroup; children = (
+					675627DA901E329524A4B7CD, ); name = AU; sourceTree = "<group>"; };
+		B034C01D71A8349088379345 = {isa = PBXGroup; children = (
 					1DDD52E2562F45C7BF44E3BA,
 					86FD2BEB554C25724A2AF813,
 					E8F14A4246A337084B54E9C1,
@@ -1737,10 +1737,10 @@
 					6E9CF164968692ECBF14BFA4,
 					A99BE51ABD7D9EC4B325A59C,
 					3DC291F8A448B57C4E7B85C9, ); name = RTAS; sourceTree = "<group>"; };
-		5BFF3A02016001970CDD81AC = {isa = PBXGroup; children = (
+		F4395C66021B50FE5AAB303C = {isa = PBXGroup; children = (
 					CE7AB9CEBC2AD27B236A69F8,
 					8379A87D62F44DFFC9366AD6, ); name = Standalone; sourceTree = "<group>"; };
-		506B96F755E66EF451C5D0F0 = {isa = PBXGroup; children = (
+		B973D84EF8EAD532ECB42F83 = {isa = PBXGroup; children = (
 					9407A9BBA5CC55FAB981363F,
 					1B468DBA17F78A4C46EFDB34,
 					8BC913A5669953BFE5A456F6,
@@ -1750,22 +1750,23 @@
 					CC1F87E59205712A0B2B08D5,
 					EE10601535426EBE973755EE,
 					45A7DB93A834F903CFB76794, ); name = utility; sourceTree = "<group>"; };
-		038E461CCD00BE2C0FFB4060 = {isa = PBXGroup; children = (
+		794BD365073742451788E5DF = {isa = PBXGroup; children = (
 					21F7313455725884DEC213E7,
 					F7D1FD08E57CD55F824DB44D, ); name = VST; sourceTree = "<group>"; };
-		CC2DA37A9DF73AE3068DDFB6 = {isa = PBXGroup; children = (
+		27252EE648860860662C12D6 = {isa = PBXGroup; children = (
 					A9BFA5468698DC8F32062A9B, ); name = VST3; sourceTree = "<group>"; };
 		B7199B2DD8BEEA7DBC08C672 = {isa = PBXGroup; children = (
 					EC8818482FE69DEA2472407C,
 					7B934098FF9E066D257F3FC8,
-					F28D61A1E7F58403483E15BA,
-					5BFF3A02016001970CDD81AC,
-					506B96F755E66EF451C5D0F0,
-					038E461CCD00BE2C0FFB4060,
-					CC2DA37A9DF73AE3068DDFB6,
+					B034C01D71A8349088379345,
+					F4395C66021B50FE5AAB303C,
+					B973D84EF8EAD532ECB42F83,
+					794BD365073742451788E5DF,
+					27252EE648860860662C12D6,
 					04DAC3B6E82E983D25C6700E,
 					C6765BF98421489E663C9713,
 					AC1D5EC23242A02FFBB90928,
+					662205D63DB6B428A86C4E88,
 					D1D5978F5EE20BB506361B3A,
 					1CEDDCD15AC89113C91DB85D,
 					63219087202573D0D10EF3DE,
@@ -2853,8 +2854,7 @@
 					641C08407D49F28BD9FDB843,
 					3B0847349353DE99EB99252B,
 					E9105E2E5E237EC32F79DFDF,
-					8F6829961A0F50B8265BD9CB,
-					47C8050DE3ABBEC6BEC74B2F, ); name = Resources; sourceTree = "<group>"; };
+					8F6829961A0F50B8265BD9CB, ); name = Resources; sourceTree = "<group>"; };
 		649BBC267932DD53D319C8C1 = {isa = PBXGroup; children = (
 					918ECC9726F9792AEA2BF389,
 					759F7DE2DC579FE827D3048E,
@@ -3276,7 +3276,7 @@
 		F00437060A1034E54BE737BF = {isa = XCConfigurationList; buildConfigurations = (
 					326E2BA4D324D09F4A7F0A63,
 					B4227B6386A801962DC6DE9F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		F142F5144E24B9733BC560AA = {isa = PBXAggregateTarget; buildConfigurationList = F00437060A1034E54BE737BF; dependencies = (
+		F142F5144E24B9733BC560AA = {isa = PBXAggregateTarget; buildConfigurationList = F00437060A1034E54BE737BF; buildPhases = (  ); buildRules = ( ); dependencies = (
 					75C3E9C0CE34EEE2F5A36000,
 					4B92B77B69B5E3247011B212,
 					D2DBB1440B1CF214018AA738,
@@ -3286,8 +3286,7 @@
 					5F2A5A5FDFB771E794E04854,
 					A57CA38D505E2243A3395BA7, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		04536241DA00BCF3D76062A5 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					7293C6A173EDB952C43C4E1E,
-					0D85DE716EC383C1E7CA404B, ); runOnlyForDeploymentPostprocessing = 0; };
+					7293C6A173EDB952C43C4E1E, ); runOnlyForDeploymentPostprocessing = 0; };
 		8059231D72D6BF32B790D039 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					E131F66DF397C2C865D2BDB9, ); runOnlyForDeploymentPostprocessing = 0; };
 		33FB604DCAD6DD6453DD6488 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3312,8 +3311,7 @@
 					242FD13403C5B6F386EFC545,
 					6908F21CF215042E9B0ABFFA, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		7088241D4191060ACF5CFCA9 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					7293C6A173EDB952C43C4E1E,
-					0D85DE716EC383C1E7CA404B, ); runOnlyForDeploymentPostprocessing = 0; };
+					7293C6A173EDB952C43C4E1E, ); runOnlyForDeploymentPostprocessing = 0; };
 		DD4F2A6BEA93776ADBB4E10B = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					8C76E37FF5C940A385BEB140, ); runOnlyForDeploymentPostprocessing = 0; };
 		4C772F7842B90802A57373D0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3338,10 +3336,9 @@
 					FC26955F59CF4154DB451744,
 					DF2B398AB709C3CAEAC8FE2E, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		BFA824A2C63456DA5C6422E9 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					7293C6A173EDB952C43C4E1E,
-					0D85DE716EC383C1E7CA404B, ); runOnlyForDeploymentPostprocessing = 0; };
+					7293C6A173EDB952C43C4E1E, ); runOnlyForDeploymentPostprocessing = 0; };
 		266612BAF31747EB6270EF76 = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					28C99E7CD1CE273646B706BF, ); runOnlyForDeploymentPostprocessing = 0; };
+					7E2BF0D7672428735E4B25C6, ); runOnlyForDeploymentPostprocessing = 0; };
 		1F0C1963E7BE22BFAB4A0ADB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					A52519AD234D3F6BC18A647D,
 					FB2400E593546DDBAA460738, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3370,8 +3367,7 @@
 					43006A3E8ABF9104DF671B2D,
 					C73CB90BA269F3D54B8DF37B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		9D7CAC1B0EC21F17055AD199 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					7293C6A173EDB952C43C4E1E,
-					0D85DE716EC383C1E7CA404B, ); runOnlyForDeploymentPostprocessing = 0; };
+					7293C6A173EDB952C43C4E1E, ); runOnlyForDeploymentPostprocessing = 0; };
 		42953782839B367DFDE6876C = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F85D68AA01C1180EE14E32B2, ); runOnlyForDeploymentPostprocessing = 0; };
 		13698285AE0013DEB1144725 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
diff --git a/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj b/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj
index ce7ac2d..fbc1e08 100644
--- a/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj
+++ b/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj
@@ -1953,6 +1953,7 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2452,7 +2453,8 @@
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj.filters b/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj.filters
index 11973d0..71829f4 100644
--- a/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj.filters
+++ b/examples/PlugInSamples/MultiOutSynth/Builds/VisualStudio2015/MultiOutSynth.vcxproj.filters
@@ -2682,6 +2682,9 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4175,8 +4178,11 @@
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/PlugInSamples/MultiOutSynth/JuceLibraryCode/AppConfig.h b/examples/PlugInSamples/MultiOutSynth/JuceLibraryCode/AppConfig.h
index f728486..f66afbd 100644
--- a/examples/PlugInSamples/MultiOutSynth/JuceLibraryCode/AppConfig.h
+++ b/examples/PlugInSamples/MultiOutSynth/JuceLibraryCode/AppConfig.h
@@ -111,6 +111,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -253,10 +260,10 @@
  #define JucePlugin_ManufacturerEmail      "info at juce.com"
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'MoSy'
+ #define JucePlugin_PluginCode             0x4d6f5379 // 'MoSy'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                1
diff --git a/examples/PlugInSamples/MultiOutSynth/MultiOutSynth.jucer b/examples/PlugInSamples/MultiOutSynth/MultiOutSynth.jucer
index 6c4bd90..987b41f 100644
--- a/examples/PlugInSamples/MultiOutSynth/MultiOutSynth.jucer
+++ b/examples/PlugInSamples/MultiOutSynth/MultiOutSynth.jucer
@@ -9,7 +9,7 @@
               pluginSilenceInIsSilenceOut="0" pluginEditorRequiresKeys="0"
               pluginAUExportPrefix="MultiOutSynthAU" pluginRTASCategory=""
               aaxIdentifier="com.ROLI.MultiOutSynth" pluginAAXCategory="AAX_ePlugInCategory_SWGenerators"
-              jucerVersion="4.2.1" companyName="ROLI Ltd." companyWebsite="www.roli.com"
+              jucerVersion="4.2.3" companyName="ROLI Ltd." companyWebsite="www.roli.com"
               companyEmail="info at juce.com" pluginIsMidiEffectPlugin="0" buildAUv3="0">
   <MAINGROUP id="uGSDhi" name="MultiOutSynth">
     <GROUP id="{78464AFF-72EB-5BDD-4FD3-6C8C6CF5DFA3}" name="Source">
diff --git a/examples/PlugInSamples/NoiseGate/Builds/MacOSX/NoiseGate.xcodeproj/project.pbxproj b/examples/PlugInSamples/NoiseGate/Builds/MacOSX/NoiseGate.xcodeproj/project.pbxproj
index ada4f34..6605527 100644
--- a/examples/PlugInSamples/NoiseGate/Builds/MacOSX/NoiseGate.xcodeproj/project.pbxproj
+++ b/examples/PlugInSamples/NoiseGate/Builds/MacOSX/NoiseGate.xcodeproj/project.pbxproj
@@ -26,9 +26,8 @@
 		37650014CFB133BE49E618C7 = {isa = PBXBuildFile; fileRef = 5ACE35425F10E6FE0CD30B44; };
 		15165888F33A50CEEAF270C7 = {isa = PBXBuildFile; fileRef = B6567C791BE962F993B78C02; };
 		12C002E482A05AEA16654DF9 = {isa = PBXBuildFile; fileRef = 7A6A889A32581FBE73645356; };
-		A6EFA2CFF4D8C125C8AAEFB6 = {isa = PBXBuildFile; fileRef = 12C24C2237E0F23FDCCCE953; };
 		5AD5FE50F1508B1EC89C37AF = {isa = PBXBuildFile; fileRef = 45E82A90482A147FF8FA6507; };
-		0A67F5C2A80DEC5B7E1A75A2 = {isa = PBXBuildFile; fileRef = 78AF8E4090DF691FA058374D; };
+		5242C773D354EA0B2527D4B8 = {isa = PBXBuildFile; fileRef = F9AD652235B91EB0693AB186; };
 		ED749B2640D6B4FB7E32CC22 = {isa = PBXBuildFile; fileRef = 60ECEC321E2335CA55B41A55; };
 		F85FA72ECA3C1A04D624A4BD = {isa = PBXBuildFile; fileRef = 2DA5A7253793B9BFBB4E2A18; };
 		C452CBE4FAC93EDD00579A23 = {isa = PBXBuildFile; fileRef = 8E20AE27507F5C47985A6865; };
@@ -632,7 +631,6 @@
 		783876754D144BA9D9D80508 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jidctflt.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c"; sourceTree = "SOURCE_ROOT"; };
 		789D3C1F5D021FF597F455E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
 		789EBDE5AA3DDBF44BCCE63F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; };
-		78AF8E4090DF691FA058374D = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		78F0E6FD7AF95F7440C0291C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUInputFormatConverter.h"; sourceTree = "SOURCE_ROOT"; };
 		79123AD075DF679CBD0CD0F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = md5.c; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c"; sourceTree = "SOURCE_ROOT"; };
 		79A8D43470A0E32CB2CBED38 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBase.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUBase.h"; sourceTree = "SOURCE_ROOT"; };
@@ -706,6 +704,7 @@
 		854A261D384CB1F682305BE9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTouchMapper.h"; path = "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h"; sourceTree = "SOURCE_ROOT"; };
 		85B9E97C3FC7D20270A420B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
 		865AA1F62812A0984F048080 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "res_books_51.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h"; sourceTree = "SOURCE_ROOT"; };
+		86691FA1B2CDD3570ABEA9C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		867F6834281C8B941D0BCE1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
 		873AB549F9D4BB2CB942B021 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
 		8751B08C7CCFAA3B9B070452 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../../../../modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; };
@@ -812,15 +811,19 @@
 		9CBD130337083207F2B56452 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CharacterFunctions.cpp"; path = "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9CC8CDF595616EEF33071A40 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9CCA07FAE3B4A4D2257497BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../../../../modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
+		9CDA4A2E17BF5DB191F883D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9D14B147B6A2CA89387ADD72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../../../../modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; };
 		9D67E9F6247EDE2E207EFE8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CameraDevice.cpp"; path = "../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9D91048D35939171C41AFA99 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9DAB02E651736622947A4879 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../../../../modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; };
+		9DEA01475DB585366B99507A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../../../../modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; };
+		9DF06DEA20D7CC5B7784ABB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = "../../../../../modules/juce_core/zip/zlib/zlib.h"; sourceTree = "SOURCE_ROOT"; };
 		9E0C3CD23088388B14CFE298 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedComponent.cpp"; path = "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9E1B841AC727490DBAD510C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngwio.c; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c"; sourceTree = "SOURCE_ROOT"; };
-		9EA4A85998E5730634754DA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; };
 		9EB05C378008BD43BC552E33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; };
+		9EB8F8C25EC50AA2C1289551 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; };
 		9F0F2E14CFA9F3D6A25E2B38 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
+		9F5C521FCFAB9BD273073B55 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../../../../modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; };
 		9FC8B1D81C0535EC5B6D0C75 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_basics.cpp"; path = "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp"; sourceTree = "SOURCE_ROOT"; };
 		AFB3197B2BE07ED91A0C5FEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CatmullRomInterpolator.cpp"; path = "../../../../../modules/juce_audio_basics/effects/juce_CatmullRomInterpolator.cpp"; sourceTree = "SOURCE_ROOT"; };
 		B135B7ABB572DE03324CFD7A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = memory.h; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h"; sourceTree = "SOURCE_ROOT"; };
@@ -832,27 +835,24 @@
 		970832BB3D7B3F1D404D36CE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_X.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h"; sourceTree = "SOURCE_ROOT"; };
 		9998DD31ABBEB8513422A48B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fixed.c; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c"; sourceTree = "SOURCE_ROOT"; };
 		9C62742BCA5D3C9524DE3029 = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NoiseGate.aaxplugin; sourceTree = "BUILT_PRODUCTS_DIR"; };
-		9CDA4A2E17BF5DB191F883D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9D0EADD58202012822195D8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_audio_plugin_client_VST2.cpp"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9D366DD91CD44CED6934A26A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bitreader.c; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c"; sourceTree = "SOURCE_ROOT"; };
 		9D67999CB8A7EA49B548EF9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = mdct.h; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h"; sourceTree = "SOURCE_ROOT"; };
-		9DEA01475DB585366B99507A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../../../../modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; };
-		9DF06DEA20D7CC5B7784ABB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = "../../../../../modules/juce_core/zip/zlib/zlib.h"; sourceTree = "SOURCE_ROOT"; };
 		9E2841D274BDF096C1567AA0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_plugin_client_AAX.mm"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm"; sourceTree = "SOURCE_ROOT"; };
 		9E3C9508D07D11C753F6F4EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BlowFish.h"; path = "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h"; sourceTree = "SOURCE_ROOT"; };
 		9E65E218A429E2B64829B4E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TooltipWindow.cpp"; path = "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9E685F6C42796C5B486A08BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUPlugInDispatch.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUPlugInDispatch.h"; sourceTree = "SOURCE_ROOT"; };
-		9EB8F8C25EC50AA2C1289551 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+		9EA4A85998E5730634754DA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; };
 		9F385C17D1F088F19F3A12F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiOutput.cpp"; path = "../../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"; sourceTree = "SOURCE_ROOT"; };
 		9F39266110C56F8A0C97FA65 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jversion.h; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h"; sourceTree = "SOURCE_ROOT"; };
 		9F53388B3A4667994AD93E8D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bitwriter.h; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h"; sourceTree = "SOURCE_ROOT"; };
-		9F5C521FCFAB9BD273073B55 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../../../../modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; };
 		9F5E1264C9AC4AA54E0AB158 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiInput.h"; path = "../../../../../modules/juce_audio_devices/midi_io/juce_MidiInput.h"; sourceTree = "SOURCE_ROOT"; };
 		9F9D896F664C8CA286C041FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; };
 		9FB3DAAD402A11A090B0521C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IncludeSystemHeaders.h"; path = "../../../../../modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h"; sourceTree = "SOURCE_ROOT"; };
 		9FD8096E8A6E070EB0D3E6F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ActiveXComponent.cpp"; path = "../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A0189ED3EEAACC00AD4649EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = codebook.h; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h"; sourceTree = "SOURCE_ROOT"; };
 		A067B55828A6944BF5F96152 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		A06D19395CD8A48E64CE9E16 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		A092D24F3C62D06CF5928A64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = scales.h; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h"; sourceTree = "SOURCE_ROOT"; };
 		A0B50A729CB25919EE133A4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		A0CB59F4AD5D67685CD8673D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_SystemStats.cpp"; path = "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1297,6 +1297,7 @@
 		F977E6E34D35E0FC5235BA25 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipClient.h"; path = "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"; sourceTree = "SOURCE_ROOT"; };
 		F983B97EB7A763CA91C2B615 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUInputElement.cpp; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/AUInputElement.cpp"; sourceTree = "SOURCE_ROOT"; };
 		F99AADA9ED5F73C39AE618ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = os.h; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h"; sourceTree = "SOURCE_ROOT"; };
+		F9AD652235B91EB0693AB186 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		F9AEBC8B0F4EAE709D0D5E80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; };
 		FA2B3781996DC52D0CFE3BA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; };
 		FA5C3295E813D0648A2E7543 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = "../../../../../modules/juce_core/zip/zlib/adler32.c"; sourceTree = "SOURCE_ROOT"; };
@@ -1657,6 +1658,7 @@
 					5BB1BBCB34B72DCE9B16B695,
 					259860F50BF88025C9451A37, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		C87C608E9A5C5E6E7E794076 = {isa = PBXGroup; children = (
+					86691FA1B2CDD3570ABEA9C7,
 					218937DFF1E643C7E9392D3D, ); name = AAX; sourceTree = "<group>"; };
 		0F13F4CD7D902B9D2DA69DC9 = {isa = PBXGroup; children = (
 					E9A6A98219D0E4514484593D,
@@ -1717,12 +1719,10 @@
 					F899FD17F2789DA5C2BC257A, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		3D494EE356FF362ACDC1098E = {isa = PBXGroup; children = (
 					0F13F4CD7D902B9D2DA69DC9,
-					69D40DB250FC6775EDBCCC5B,
 					3105E167622313C70055B903,
 					CB425D61E072DED92F6CAC85,
-					C6C096547CAD0C12FA4746CF,
-					78AF8E4090DF691FA058374D, ); name = AU; sourceTree = "<group>"; };
-		7188C9AEA767393C223A5803 = {isa = PBXGroup; children = (
+					C6C096547CAD0C12FA4746CF, ); name = AU; sourceTree = "<group>"; };
+		5A8AB44A44CEA32DC33D5765 = {isa = PBXGroup; children = (
 					F4E8427587734D0D2B94F4D8,
 					E09DC8AF27C6E40AB436E821,
 					6033F6DD0B905B8819C115E2,
@@ -1730,10 +1730,10 @@
 					F8AB7D10F5C9ABF34829AE8F,
 					F785317A2BB8414F5D8E2813,
 					D0A3F2265D323BB3F90F3DD5, ); name = RTAS; sourceTree = "<group>"; };
-		C681F67747E80C4D05C41413 = {isa = PBXGroup; children = (
+		A0C36FF148057D22D568BE59 = {isa = PBXGroup; children = (
 					F4D616BD3FAFE9587EC29FC6,
 					5202ABFCC92AA0AFBC9400BE, ); name = Standalone; sourceTree = "<group>"; };
-		5800B1C18680BF3EA8806892 = {isa = PBXGroup; children = (
+		3AE05782CAEEEB1F04B31F1A = {isa = PBXGroup; children = (
 					210E0DDAE66818EF2B278274,
 					94F3D0138EBB7EB31E15940C,
 					F4C02954B36F8FCE5D4E647C,
@@ -1743,22 +1743,23 @@
 					A29D254460762F8F6990D54C,
 					B9A21AE64CC4B86FC1F67061,
 					F35CA755BCEF635E1D3A905C, ); name = utility; sourceTree = "<group>"; };
-		4083DD4A6818D524406ECDF6 = {isa = PBXGroup; children = (
+		CBE8572BAED059334FB2FDF2 = {isa = PBXGroup; children = (
 					906428E1A9963444AF1B0D60,
 					69A29D8420DB0B53507E223D, ); name = VST; sourceTree = "<group>"; };
-		430F3673E2829D691E5A9ECF = {isa = PBXGroup; children = (
+		2CFD285766D4639C6B7C7457 = {isa = PBXGroup; children = (
 					CDE1B83C996A1861A93C93A7, ); name = VST3; sourceTree = "<group>"; };
 		3935AB4CC6A0A44A4A93B7E8 = {isa = PBXGroup; children = (
 					C87C608E9A5C5E6E7E794076,
 					3D494EE356FF362ACDC1098E,
-					7188C9AEA767393C223A5803,
-					C681F67747E80C4D05C41413,
-					5800B1C18680BF3EA8806892,
-					4083DD4A6818D524406ECDF6,
-					430F3673E2829D691E5A9ECF,
+					5A8AB44A44CEA32DC33D5765,
+					A0C36FF148057D22D568BE59,
+					3AE05782CAEEEB1F04B31F1A,
+					CBE8572BAED059334FB2FDF2,
+					2CFD285766D4639C6B7C7457,
 					163F8CC7509513B483860103,
 					AF02EDDBD4B4B8081DC18DA4,
 					9E2841D274BDF096C1567AA0,
+					F9AD652235B91EB0693AB186,
 					68810A5E034BC83F99EFE3B9,
 					B7CEA623FCCB463BF8058A7F,
 					9771DD4915BE1789A7993E69,
@@ -2844,8 +2845,7 @@
 					BCC02F39B2F24479D8F6DB50,
 					D30F58A3C82A7C61E6768EBE,
 					44AA2CDFC06F2E27F3BD6313,
-					7A6A889A32581FBE73645356,
-					12C24C2237E0F23FDCCCE953, ); name = Resources; sourceTree = "<group>"; };
+					7A6A889A32581FBE73645356, ); name = Resources; sourceTree = "<group>"; };
 		2D45B9382F864E0FC39A7D86 = {isa = PBXGroup; children = (
 					EE004DC5369648F9F4F967B5,
 					943B88ECAC8C127556319A56,
@@ -3277,7 +3277,7 @@
 		4B6CE3423D63B067B4CCB9CA = {isa = XCConfigurationList; buildConfigurations = (
 					D43C967D02EDDCC29FB7059C,
 					EEA93C1E6EEC110939D1685F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		BE96E7C5FAB338297CC69BA9 = {isa = PBXAggregateTarget; buildConfigurationList = 4B6CE3423D63B067B4CCB9CA; dependencies = (
+		BE96E7C5FAB338297CC69BA9 = {isa = PBXAggregateTarget; buildConfigurationList = 4B6CE3423D63B067B4CCB9CA; buildPhases = (  ); buildRules = ( ); dependencies = (
 					211DD9687930134AF6E64FF0,
 					6FE20A9165A15D7BE98F2B99,
 					0D517069DB7201D47B168BEE,
@@ -3287,8 +3287,7 @@
 					BA984224A933EC837F514164,
 					AC5F1E6328DC16FF2891CB62, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		216E0D6AC94324AA60E8341F = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					12C002E482A05AEA16654DF9,
-					A6EFA2CFF4D8C125C8AAEFB6, ); runOnlyForDeploymentPostprocessing = 0; };
+					12C002E482A05AEA16654DF9, ); runOnlyForDeploymentPostprocessing = 0; };
 		EEE027F86C42C2897FFAFAB4 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					0D1C8A857D386C6BC5C99FA3, ); runOnlyForDeploymentPostprocessing = 0; };
 		88ED31A2FC837CDDC443C602 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3313,8 +3312,7 @@
 					23F878D56387ED4B67B9E2DF,
 					32B1624E3B1B34C461D60562, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		47F5AD1898E28C0A6D16C018 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					12C002E482A05AEA16654DF9,
-					A6EFA2CFF4D8C125C8AAEFB6, ); runOnlyForDeploymentPostprocessing = 0; };
+					12C002E482A05AEA16654DF9, ); runOnlyForDeploymentPostprocessing = 0; };
 		FE7603D4FD2A5265B17C5CDB = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					6D0FB6DF3B238687E64CA059, ); runOnlyForDeploymentPostprocessing = 0; };
 		E3794423504E5A68368E60FB = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3339,10 +3337,9 @@
 					4130388B36B3B506391E717A,
 					B3B550855CF90C491B1B3921, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		2547749F251ADA67558CFBC5 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					12C002E482A05AEA16654DF9,
-					A6EFA2CFF4D8C125C8AAEFB6, ); runOnlyForDeploymentPostprocessing = 0; };
+					12C002E482A05AEA16654DF9, ); runOnlyForDeploymentPostprocessing = 0; };
 		F38684DBAA310B29B5B2598B = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					0A67F5C2A80DEC5B7E1A75A2, ); runOnlyForDeploymentPostprocessing = 0; };
+					5242C773D354EA0B2527D4B8, ); runOnlyForDeploymentPostprocessing = 0; };
 		2B362E865E39D8FBBEF5836E = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					65D4B3952523E1D9729D5696,
 					297C90DB48F08189C5E161F6, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3371,8 +3368,7 @@
 					6597D0E1B573ECB84853415C,
 					BCA3F1D08B6DEDD8120DDF25, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		547175C3907E0E0E4318B03E = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					12C002E482A05AEA16654DF9,
-					A6EFA2CFF4D8C125C8AAEFB6, ); runOnlyForDeploymentPostprocessing = 0; };
+					12C002E482A05AEA16654DF9, ); runOnlyForDeploymentPostprocessing = 0; };
 		60B6674FAE4C8F988F0F1086 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					FCE06A0BAC628295014D8729, ); runOnlyForDeploymentPostprocessing = 0; };
 		A47A37CF689DBA8E163F1A4D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
diff --git a/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj b/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj
index c2fc73b..2205dff 100644
--- a/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj
+++ b/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj
@@ -1952,6 +1952,7 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2449,7 +2450,8 @@
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj.filters b/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj.filters
index 02a65ab..8621d76 100644
--- a/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj.filters
+++ b/examples/PlugInSamples/NoiseGate/Builds/VisualStudio2015/NoiseGate.vcxproj.filters
@@ -2676,6 +2676,9 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4163,8 +4166,11 @@
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/PlugInSamples/NoiseGate/JuceLibraryCode/AppConfig.h b/examples/PlugInSamples/NoiseGate/JuceLibraryCode/AppConfig.h
index 943d98e..4cefb86 100644
--- a/examples/PlugInSamples/NoiseGate/JuceLibraryCode/AppConfig.h
+++ b/examples/PlugInSamples/NoiseGate/JuceLibraryCode/AppConfig.h
@@ -111,6 +111,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -253,10 +260,10 @@
  #define JucePlugin_ManufacturerEmail      ""
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'Nois'
+ #define JucePlugin_PluginCode             0x4e6f6973 // 'Nois'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                0
diff --git a/examples/PlugInSamples/NoiseGate/NoiseGate.jucer b/examples/PlugInSamples/NoiseGate/NoiseGate.jucer
index 0862364..ef3653c 100644
--- a/examples/PlugInSamples/NoiseGate/NoiseGate.jucer
+++ b/examples/PlugInSamples/NoiseGate/NoiseGate.jucer
@@ -8,7 +8,7 @@
               pluginIsSynth="0" pluginWantsMidiIn="0" pluginProducesMidiOut="0"
               pluginSilenceInIsSilenceOut="0" pluginEditorRequiresKeys="0"
               pluginAUExportPrefix="NoiseGateAU" pluginRTASCategory="" aaxIdentifier="com.roli.NoiseGate"
-              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.1"
+              pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="4.2.3"
               pluginIsMidiEffectPlugin="0" buildAUv3="0">
   <MAINGROUP id="FVYuyg" name="NoiseGate">
     <GROUP id="{6EB662B0-ED81-2504-8B90-DCBFA5675DFC}" name="Source">
diff --git a/examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile b/examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile
index 8575d2a..f3d05d2 100644
--- a/examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile
+++ b/examples/PlugInSamples/Surround/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0 -Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -O3 -Wall -Wshadow -Wno-missing-field-initializers -Wshadow -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj b/examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj
index 49193e4..3a84dea 100644
--- a/examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj
+++ b/examples/PlugInSamples/Surround/Builds/MacOSX/Surround.xcodeproj/project.pbxproj
@@ -26,9 +26,8 @@
 		1730BAC6358B020E5359B15D = {isa = PBXBuildFile; fileRef = 130A1E6607521A6C51E7E702; };
 		FDCC043886C609481941F040 = {isa = PBXBuildFile; fileRef = 407B6CB925E1B5FAA7E3914E; };
 		2191E7D09CE99E98C2CCCF54 = {isa = PBXBuildFile; fileRef = 7B09ECEA92A79A22173B9A1A; };
-		841F2C2B98BCB5059C093CCA = {isa = PBXBuildFile; fileRef = A0BFEED17AF0E43A7401189C; };
 		84756A2E1F219D073187D649 = {isa = PBXBuildFile; fileRef = 4F1AF1D850DBBFB581EAE294; };
-		A36135867496E3E1F6C08770 = {isa = PBXBuildFile; fileRef = 0ED2BEA90D9AB8F53ABAC23F; };
+		B68A16DE8AEEE404657DB343 = {isa = PBXBuildFile; fileRef = 02FB9A6955DBBBEAC8BB16D8; };
 		C45C4C878E526E955DB4BE2C = {isa = PBXBuildFile; fileRef = CC3734C049214EF91327C2B6; };
 		BC0836F398C7EA8BED36B53B = {isa = PBXBuildFile; fileRef = 9B38FFE6C8577E7F22DFEF2F; };
 		8FF45061553548B84D31A121 = {isa = PBXBuildFile; fileRef = 689794DAC80724A7C23A1759; };
@@ -67,6 +66,7 @@
 		02011069400D49AE29D3A8AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_plugin_client_AU_1.mm"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm"; sourceTree = "SOURCE_ROOT"; };
 		024CB198D719E920742AAF38 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V1.h"; path = "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"; sourceTree = "SOURCE_ROOT"; };
 		02CE6BB6202647637FF78A6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LAMEEncoderAudioFormat.h"; path = "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
+		02FB9A6955DBBBEAC8BB16D8 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		0362C38B47B2235F4443A98D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = zutil.c; path = "../../../../../modules/juce_core/zip/zlib/zutil.c"; sourceTree = "SOURCE_ROOT"; };
 		036F63DADE847F2C8CF7E777 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../../../../modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; };
 		03E9D79DB85F5A7AB13B3890 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; };
@@ -133,7 +133,6 @@
 		0EC44B4F782B363577DC6BB1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0EC5AD5447DD911B8294F413 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; };
 		0ECBC001B10ABD4E646F2141 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputSource.cpp"; path = "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"; sourceTree = "SOURCE_ROOT"; };
-		0ED2BEA90D9AB8F53ABAC23F = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		1000AB9EC17650FB0092DCD8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_DigiCode3.cpp"; path = "../../../../../modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp"; sourceTree = "SOURCE_ROOT"; };
 		10307599177903E1B8824E06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrayAllocationBase.h"; path = "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"; sourceTree = "SOURCE_ROOT"; };
 		103B4CFDB78F4A23AB769052 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_WebBrowserComponent.cpp"; path = "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -702,6 +701,7 @@
 		831D6FCD81612A1649B0CF08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../../../../modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; };
 		832774543B7277913460C41E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAutoDisposer.h; path = "../../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAAutoDisposer.h"; sourceTree = "SOURCE_ROOT"; };
 		83E2EFC9133757FD09C67ABE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutManager.h"; path = "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"; sourceTree = "SOURCE_ROOT"; };
+		84361AF1AD46751899D33C5D = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		854BE217C612C256BED72308 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
 		857D93C46EF5F30B686666FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jctrans.c; path = "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c"; sourceTree = "SOURCE_ROOT"; };
 		863578C8C35502444456B6EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V3.cpp"; path = "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -725,11 +725,12 @@
 		8A604B4BD445F2F0F2ED6C96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8AB1217C7D9CEC5CA4CE87B9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPositionBehaviours.h"; path = "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"; sourceTree = "SOURCE_ROOT"; };
 		8B2B33EB8FE2027523BD9ADD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
-		8B61BBC7490B7EB09164C24E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; };
+		8D2F64C046BBAAA084369818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8D3B6133B6EFF1551DA6A0B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "residue_8.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h"; sourceTree = "SOURCE_ROOT"; };
 		8DC3D1402CD78E1E728A885C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST_Wrapper.cpp"; path = "../../../../../modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8E11074D4A9A023AE33D2777 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CheckSettingMacros.h"; path = "../../../../../modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h"; sourceTree = "SOURCE_ROOT"; };
 		8E5677A16F98C56CAA7F2842 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_16.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h"; sourceTree = "SOURCE_ROOT"; };
+		8EE2300EB5893E6FE4447464 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		90593FC8C1E0DF38F5C4E13C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "setup_32.h"; path = "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h"; sourceTree = "SOURCE_ROOT"; };
 		91B36A38A2515EACFDB74FF2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "stream_encoder.h"; path = "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h"; sourceTree = "SOURCE_ROOT"; };
 		91DC52EFEE54AA6A25F414F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilter.h"; path = "../../../../../modules/juce_audio_basics/effects/juce_IIRFilter.h"; sourceTree = "SOURCE_ROOT"; };
@@ -751,10 +752,10 @@
 		89BE99C79A12FAA559AB0958 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioCDReader.cpp"; path = "../../../../../modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8A0648AE319C0CEA55D7AD88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8ACBFC171B28F02B7C79EC9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
+		8B61BBC7490B7EB09164C24E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; };
 		8B8C8E45262B02EE3013C440 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8C3432BC2BDC534720A9DBB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngrutil.c; path = "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c"; sourceTree = "SOURCE_ROOT"; };
 		8D136314D0A9E7C7A20F5252 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = infback.c; path = "../../../../../modules/juce_core/zip/zlib/infback.c"; sourceTree = "SOURCE_ROOT"; };
-		8D2F64C046BBAAA084369818 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8D7431A21F329A0623106F9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StandaloneFilterApp.cpp"; path = "../../../../../modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8D8276FB197AE7CF5FBB3AB0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
 		8DCC53AC83A1540BF58AF95D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../../../../modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1659,6 +1660,7 @@
 					35B628AB8DFBC44E9BBF1EF9,
 					907ECB8961B34F538328C66D, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		B03491D4B8689C8544B25B87 = {isa = PBXGroup; children = (
+					8EE2300EB5893E6FE4447464,
 					4B133B1F9874EBA8953DCDF9, ); name = AAX; sourceTree = "<group>"; };
 		DA59CA30765E869649A5C076 = {isa = PBXGroup; children = (
 					458D73FCC89935898F0D2C23,
@@ -1719,12 +1721,10 @@
 					9497F6127D98FC93F698D42F, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		682B81CC505D8F57DEA7E0AC = {isa = PBXGroup; children = (
 					DA59CA30765E869649A5C076,
-					A120FD8A1529CD1910D93F52,
 					E8154A3245B28F12461708E8,
 					7BD189FD9F797A43D5818C6A,
-					3A925CFFB7F60920C14EC144,
-					0ED2BEA90D9AB8F53ABAC23F, ); name = AU; sourceTree = "<group>"; };
-		F780A21E1C3DA3D40B592D7A = {isa = PBXGroup; children = (
+					3A925CFFB7F60920C14EC144, ); name = AU; sourceTree = "<group>"; };
+		E314FF34EAECD51445016614 = {isa = PBXGroup; children = (
 					5583A45CA7C609741BB8B9EF,
 					55DFDE807E321ABD1E879E41,
 					AB04D06155A5E52B0658F3D6,
@@ -1732,10 +1732,10 @@
 					7D2CA0CEB4019C90AE75474C,
 					C52ED1AAE029660B7F7E195A,
 					283ADB95E9375730B1389880, ); name = RTAS; sourceTree = "<group>"; };
-		D67F6C60D18A07F957783FCA = {isa = PBXGroup; children = (
+		18C29C50CF51AC97F9938ADF = {isa = PBXGroup; children = (
 					8D7431A21F329A0623106F9F,
 					F468166F5B1642808084C964, ); name = Standalone; sourceTree = "<group>"; };
-		FAD31EA8ACFB57F726B6B00A = {isa = PBXGroup; children = (
+		0B1A4F8E5F393124D0B107B5 = {isa = PBXGroup; children = (
 					EDF3BB834AA5EA021B07F5FA,
 					8E11074D4A9A023AE33D2777,
 					377EE4F29DE0ECCB0B0F8EBD,
@@ -1745,22 +1745,23 @@
 					ADCF8757250D34CD709BF18E,
 					F6AE18B04CC3D2BB90189253,
 					D7D538F79741F629EC0B174F, ); name = utility; sourceTree = "<group>"; };
-		CFB2A255E91D41F8C12E5150 = {isa = PBXGroup; children = (
+		2B8EF8A8BCA0AB75EDE7FB7A = {isa = PBXGroup; children = (
 					8DC3D1402CD78E1E728A885C,
 					897466367AE90A6757BD78AA, ); name = VST; sourceTree = "<group>"; };
-		B71E23C0ADB4B7F7D300A2B9 = {isa = PBXGroup; children = (
+		6BA032A25FA6EF715361DBA9 = {isa = PBXGroup; children = (
 					C97229429AD64768E560F4AD, ); name = VST3; sourceTree = "<group>"; };
 		3C13BDA7064F6A67ED81C57C = {isa = PBXGroup; children = (
 					B03491D4B8689C8544B25B87,
 					682B81CC505D8F57DEA7E0AC,
-					F780A21E1C3DA3D40B592D7A,
-					D67F6C60D18A07F957783FCA,
-					FAD31EA8ACFB57F726B6B00A,
-					CFB2A255E91D41F8C12E5150,
-					B71E23C0ADB4B7F7D300A2B9,
+					E314FF34EAECD51445016614,
+					18C29C50CF51AC97F9938ADF,
+					0B1A4F8E5F393124D0B107B5,
+					2B8EF8A8BCA0AB75EDE7FB7A,
+					6BA032A25FA6EF715361DBA9,
 					764CC7C9098B8A13EE1E2BDD,
 					5E4DECB460D73AB4F75A0807,
 					98DEEE52698DC2DD0C22A537,
+					02FB9A6955DBBBEAC8BB16D8,
 					02011069400D49AE29D3A8AA,
 					C5AC6B7D92F08E36C6CC81D0,
 					DC26D1CA02600B967A955667,
@@ -2846,8 +2847,7 @@
 					3E67AEA9A0FD3291E8C1B486,
 					F02875DC328E400B3141069D,
 					19E1189C678E9189ECD11DEF,
-					7B09ECEA92A79A22173B9A1A,
-					A0BFEED17AF0E43A7401189C, ); name = Resources; sourceTree = "<group>"; };
+					7B09ECEA92A79A22173B9A1A, ); name = Resources; sourceTree = "<group>"; };
 		18B9690A5C364D20F5C100E3 = {isa = PBXGroup; children = (
 					52EEFA8ED8C29967F5A9E1EE,
 					D8FC94038AF7B050BBADC027,
@@ -3279,7 +3279,7 @@
 		EED368527EBF92E628608D8B = {isa = XCConfigurationList; buildConfigurations = (
 					C73902ED4D2E8620A64FB955,
 					10FD9778667189623A2CDD86, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		662E24C61A67634787C1DDDA = {isa = PBXAggregateTarget; buildConfigurationList = EED368527EBF92E628608D8B; dependencies = (
+		662E24C61A67634787C1DDDA = {isa = PBXAggregateTarget; buildConfigurationList = EED368527EBF92E628608D8B; buildPhases = (  ); buildRules = ( ); dependencies = (
 					5FC77F15FFD6E6F3449B16D6,
 					32FFC55D51387C8C331E25B9,
 					53E1E3FE56FEC27499FA8243,
@@ -3289,8 +3289,7 @@
 					EB917BF8D9134F341F138D54,
 					4C0FBAEF448A6C797FB6DD45, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		C6635CD032CBB46EE84BE2BD = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					2191E7D09CE99E98C2CCCF54,
-					841F2C2B98BCB5059C093CCA, ); runOnlyForDeploymentPostprocessing = 0; };
+					2191E7D09CE99E98C2CCCF54, ); runOnlyForDeploymentPostprocessing = 0; };
 		7DBFF07EA24A761249FDB194 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					E03A96B10126A69293C044FD, ); runOnlyForDeploymentPostprocessing = 0; };
 		2E087F2A8528F2C788D09A5E = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3315,8 +3314,7 @@
 					61074CD12CE591486A05A574,
 					7FCB6817E56D52F78EC1AE71, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		82A795FF64B3DC1673E6DFFD = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					2191E7D09CE99E98C2CCCF54,
-					841F2C2B98BCB5059C093CCA, ); runOnlyForDeploymentPostprocessing = 0; };
+					2191E7D09CE99E98C2CCCF54, ); runOnlyForDeploymentPostprocessing = 0; };
 		C40118D5AA68EA22C25990A9 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					CEBB3C6F336A43045FFF411D, ); runOnlyForDeploymentPostprocessing = 0; };
 		38083A2E2A2930885CC53FC0 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3341,10 +3339,9 @@
 					E32045A65CECB559C0FB4C68,
 					1D54A1AEFE13AA013860EF06, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		6A3AF05F6EAA6537996C2F42 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					2191E7D09CE99E98C2CCCF54,
-					841F2C2B98BCB5059C093CCA, ); runOnlyForDeploymentPostprocessing = 0; };
+					2191E7D09CE99E98C2CCCF54, ); runOnlyForDeploymentPostprocessing = 0; };
 		EE0E282E33E11BDEEC93785F = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					A36135867496E3E1F6C08770, ); runOnlyForDeploymentPostprocessing = 0; };
+					B68A16DE8AEEE404657DB343, ); runOnlyForDeploymentPostprocessing = 0; };
 		6AF7D8B2A0C3D350ECF9E451 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					64624CD6DC9AD04D81B9E401,
 					057B3431395E851B7328AE02, ); runOnlyForDeploymentPostprocessing = 0; };
@@ -3373,8 +3370,7 @@
 					6097E35463A00493A0E17C6D,
 					B376411945AB7D80ECC98A26, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		5276FC9AAD3BF2140C19513D = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					2191E7D09CE99E98C2CCCF54,
-					841F2C2B98BCB5059C093CCA, ); runOnlyForDeploymentPostprocessing = 0; };
+					2191E7D09CE99E98C2CCCF54, ); runOnlyForDeploymentPostprocessing = 0; };
 		9CA62E78DD58EF6DCD1F513E = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					F07C6D3843A293AF087DC6AA, ); runOnlyForDeploymentPostprocessing = 0; };
 		E0725217929C36E3C067C5DB = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
diff --git a/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj b/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj
index 3e3be5e..c143d07 100644
--- a/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj
+++ b/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj
@@ -1952,6 +1952,7 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2449,7 +2450,8 @@
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters b/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters
index 4068097..d05b2ce 100644
--- a/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters
+++ b/examples/PlugInSamples/Surround/Builds/VisualStudio2015/Surround.vcxproj.filters
@@ -2679,6 +2679,9 @@
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4166,8 +4169,11 @@
     <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h b/examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h
index 4638b17..ebad711 100644
--- a/examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h
+++ b/examples/PlugInSamples/Surround/JuceLibraryCode/AppConfig.h
@@ -111,6 +111,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -253,10 +260,10 @@
  #define JucePlugin_ManufacturerEmail      ""
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'ROLI'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'Srrd'
+ #define JucePlugin_PluginCode             0x53727264 // 'Srrd'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                0
diff --git a/examples/PlugInSamples/Surround/Surround.jucer b/examples/PlugInSamples/Surround/Surround.jucer
index 6537d20..8c5852c 100644
--- a/examples/PlugInSamples/Surround/Surround.jucer
+++ b/examples/PlugInSamples/Surround/Surround.jucer
@@ -9,7 +9,7 @@
               pluginIsMidiEffectPlugin="0" pluginSilenceInIsSilenceOut="0"
               pluginEditorRequiresKeys="0" pluginAUExportPrefix="SurroundAU"
               pluginRTASCategory="" aaxIdentifier="com.ROLI.Surround" pluginAAXCategory="AAX_ePlugInCategory_Dynamics"
-              jucerVersion="4.2.1" buildAUv3="0">
+              jucerVersion="4.2.3" buildAUv3="0">
   <MAINGROUP id="dEAH7t" name="Surround">
     <GROUP id="{1CB41212-BD0E-AC71-15E8-C40AD59BD2EE}" name="Source">
       <FILE id="sLk2ic" name="SurroundProcessor.cpp" compile="1" resource="0"
diff --git a/examples/SimpleFFTExample/SimpleFFTExample.jucer b/examples/SimpleFFTExample/SimpleFFTExample.jucer
index 124571b..18d927f 100644
--- a/examples/SimpleFFTExample/SimpleFFTExample.jucer
+++ b/examples/SimpleFFTExample/SimpleFFTExample.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="cgcxPd" name="SimpleFFTExample" projectType="guiapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.SimpleFFTExample" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1">
+              jucerVersion="4.2.3">
   <MAINGROUP id="rZCHr8" name="SimpleFFTExample">
     <GROUP id="{8DC23B3F-98AC-AB1C-B26A-E693AF2DF0D2}" name="Source">
       <FILE id="B1L62H" name="SpectrogramComponent.h" compile="0" resource="0"
diff --git a/examples/SimpleFFTExample/Source/SpectrogramComponent.h b/examples/SimpleFFTExample/Source/SpectrogramComponent.h
index a715eff..9f9ab4d 100644
--- a/examples/SimpleFFTExample/Source/SpectrogramComponent.h
+++ b/examples/SimpleFFTExample/Source/SpectrogramComponent.h
@@ -56,7 +56,7 @@ public:
         g.fillAll (Colours::black);
 
         g.setOpacity (1.0f);
-        g.drawImageWithin (spectrogramImage, 0, 0, getWidth(), getHeight(), RectanglePlacement::stretchToFit);
+        g.drawImage (spectrogramImage, getLocalBounds().toFloat());
     }
 
     void timerCallback() override
diff --git a/examples/audio plugin demo/Builds/Linux/Makefile b/examples/audio plugin demo/Builds/Linux/Makefile
index 641c996..fa163ac 100644
--- a/examples/audio plugin demo/Builds/Linux/Makefile	
+++ b/examples/audio plugin demo/Builds/Linux/Makefile	
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/audio plugin demo/Builds/MacOSX/Info-AU.plist b/examples/audio plugin demo/Builds/MacOSX/Info-AU.plist
index 614903a..069adb2 100644
--- a/examples/audio plugin demo/Builds/MacOSX/Info-AU.plist	
+++ b/examples/audio plugin demo/Builds/MacOSX/Info-AU.plist	
@@ -35,7 +35,7 @@
         <key>factoryFunction</key>
         <string>JuceDemoProjectAUFactory</string>
         <key>manufacturer</key>
-        <string>Roli</string>
+        <string>ROLI</string>
         <key>type</key>
         <string>aumf</string>
         <key>subtype</key>
diff --git a/examples/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj b/examples/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj
index 4af5908..09ea0de 100644
--- a/examples/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj	
+++ b/examples/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj	
@@ -23,10 +23,9 @@
 		221F46E90C0A8651AB76A0E5 = {isa = PBXBuildFile; fileRef = 58E978708BAA8613A40F61E3; };
 		B46C12D99498E9FA8F1D083A = {isa = PBXBuildFile; fileRef = A59A08DCC76EE0FC7EBE1203; };
 		B003460B11C0B7C1CC07E666 = {isa = PBXBuildFile; fileRef = 0926E36205F4D676343AB6E7; };
-		984317B46E5445CE1D8E4096 = {isa = PBXBuildFile; fileRef = F5E9ED24FCF950C2B09ED67C; };
 		E32999B782F688D3746FEB08 = {isa = PBXBuildFile; fileRef = 9EC0C4C02099C656EEF39DA9; };
 		8265E59547F2C5DDD10F58BF = {isa = PBXBuildFile; fileRef = 682D51082D9FE9859F364A10; };
-		71BB1850016434ACD2C733E3 = {isa = PBXBuildFile; fileRef = BD5793B7DA291D1C1B991DDC; };
+		839CB91EF7AAB3086CD898FE = {isa = PBXBuildFile; fileRef = 550FAA1B7314518C5237CB46; };
 		A135B77ECC75825288B59AD1 = {isa = PBXBuildFile; fileRef = F68C44DED59A1830DEC06DDB; };
 		CBEE8BA08EA81BC9612EB237 = {isa = PBXBuildFile; fileRef = 0E062265A0862663225F3BE4; };
 		57CCDB4997DD3ADCE483C6D9 = {isa = PBXBuildFile; fileRef = F87AC3FCCA31FB0B419456B2; };
@@ -114,6 +113,7 @@
 		0BEC77B5C0B5DCE51EE24DA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectSound.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0C4BA1D16AD18E7FD8D242EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; };
 		0C68BAE8F95098A8AD14F2A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; };
+		0C8BB62A92D20349100A4EDA = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_RTAS.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r"; sourceTree = "SOURCE_ROOT"; };
 		0CD474E9C69F05868EF8D9EA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_CommonFile.cpp"; path = "../../../../modules/juce_core/native/juce_linux_CommonFile.cpp"; sourceTree = "SOURCE_ROOT"; };
 		0CF861C9A12A38A47B7BC43C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LagrangeInterpolator.h"; path = "../../../../modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h"; sourceTree = "SOURCE_ROOT"; };
 		0D06541766ED7D5D99E403C8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; };
@@ -454,6 +454,7 @@
 		5484ACC1742F9FA740314458 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jccolor.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c"; sourceTree = "SOURCE_ROOT"; };
 		54A2AD39C0C739C9880E35B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_11.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h"; sourceTree = "SOURCE_ROOT"; };
 		54DD8BD688BB54E3F94A19A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; };
+		550FAA1B7314518C5237CB46 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_audio_plugin_client_AU.r"; path = "../../../../modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		551EB50AA3CCA08ABE8CB458 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdapimin.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c"; sourceTree = "SOURCE_ROOT"; };
 		5532406796823FC4FB6ADC39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bitmath.h; path = "../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h"; sourceTree = "SOURCE_ROOT"; };
 		5535A6B1099BB113B17C42DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDReader.mm"; path = "../../../../modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm"; sourceTree = "SOURCE_ROOT"; };
@@ -948,7 +949,6 @@
 		BCE8039887ABB9343A257AFC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessor.h"; path = "../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h"; sourceTree = "SOURCE_ROOT"; };
 		BD1EC91E61ECEAB657C78D5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; };
 		BD443A9D110E97DAB8EBB131 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAThreadSafeList.h; path = "../../../../modules/juce_audio_plugin_client/AU/CoreAudioUtilityClasses/CAThreadSafeList.h"; sourceTree = "SOURCE_ROOT"; };
-		BD5793B7DA291D1C1B991DDC = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_RezResources_AU.r"; path = "../../../../modules/juce_audio_plugin_client/AU/juce_RezResources_AU.r"; sourceTree = "SOURCE_ROOT"; };
 		BD8E1F131237E716EC029375 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IPAddress.h"; path = "../../../../modules/juce_core/network/juce_IPAddress.h"; sourceTree = "SOURCE_ROOT"; };
 		BDAAC3539C137CDDEF894B3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jdpostct.c; path = "../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c"; sourceTree = "SOURCE_ROOT"; };
 		BDB897B2503C29D7ABDDB656 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1004,6 +1004,7 @@
 		C7CC2605B8131869099F0D1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MainMenu.mm"; path = "../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm"; sourceTree = "SOURCE_ROOT"; };
 		C8302DD07934EBD796C2BFBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C83B8AC79590CB5FBF6CEDB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "psych_44.h"; path = "../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h"; sourceTree = "SOURCE_ROOT"; };
+		C83FE0526DC2E3078BCAFC5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AAX_Modifier_Injector.h"; path = "../../../../modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h"; sourceTree = "SOURCE_ROOT"; };
 		C854266C28A55C3F34489746 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C859B01B55EAB67BC10ED803 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiDocumentPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
 		C8741583F363ECB8C2010509 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1614,6 +1615,7 @@
 					0687D10EFBEEEC129BC807D3,
 					2AA92DC1171DAF0BA4BB0E63, ); name = "juce_audio_formats"; sourceTree = "<group>"; };
 		B663729F88A22F9325C3C9D0 = {isa = PBXGroup; children = (
+					C83FE0526DC2E3078BCAFC5D,
 					1BAAB47A9C5B1D76D28FA282, ); name = AAX; sourceTree = "<group>"; };
 		35F768B6427149AF0129BB8C = {isa = PBXGroup; children = (
 					3AA0960DF09414DBA0A2255B,
@@ -1674,12 +1676,10 @@
 					49386674C08BAD7864966166, ); name = CoreAudioUtilityClasses; sourceTree = "<group>"; };
 		E96D0837CDD1CE8B768E4077 = {isa = PBXGroup; children = (
 					35F768B6427149AF0129BB8C,
-					20BA6A1962016CD285EB30F2,
 					3F16A54F45ED278001F4CA09,
 					EE149F9075819C0132879D4C,
-					833921AD05E4BAF484FC7749,
-					BD5793B7DA291D1C1B991DDC, ); name = AU; sourceTree = "<group>"; };
-		B002DD058A40E158192BAEE5 = {isa = PBXGroup; children = (
+					833921AD05E4BAF484FC7749, ); name = AU; sourceTree = "<group>"; };
+		10721EE9E840AA7BC5F61764 = {isa = PBXGroup; children = (
 					CD61A73C6A090CD85EC57354,
 					9C9DEB7FB75C42C4F47AF999,
 					F7454AD16EE05969CCF5FD7C,
@@ -1687,10 +1687,10 @@
 					3755479207D218969425F91F,
 					17EC828C9226E13D4EF03E85,
 					1D4AFBEC703C6F373B292D9A, ); name = RTAS; sourceTree = "<group>"; };
-		69EEEA6D294205148B1E268A = {isa = PBXGroup; children = (
+		5B3F9588F32C646D12DE0ACE = {isa = PBXGroup; children = (
 					12D74EEE2F7F5D8E17C746EA,
 					A13CE6DC3E31158D49337C8F, ); name = Standalone; sourceTree = "<group>"; };
-		18E6563C4672B4D77223D259 = {isa = PBXGroup; children = (
+		0356C38F32660D46D5EE6554 = {isa = PBXGroup; children = (
 					7B870EE6D43B984CADE69C28,
 					94AA9AF4939F914AD00CEE1F,
 					58CEA1474B2E77B7287D735B,
@@ -1700,22 +1700,23 @@
 					841B6783475386C5471CA039,
 					8C0D1A1E000E47D09B771963,
 					7E588E8934AFA6EA5C58C133, ); name = utility; sourceTree = "<group>"; };
-		0EB0BD7272CEB2232D7F7BD2 = {isa = PBXGroup; children = (
+		0720EF699B01F6EB0A2C4E3A = {isa = PBXGroup; children = (
 					1E496F7BF3B3C59E5ECACCDE,
 					8EB324480D60B3E3A81541E5, ); name = VST; sourceTree = "<group>"; };
-		DBCC2B2AF371A45272E6FA21 = {isa = PBXGroup; children = (
+		E090AC75C454B0E281AB5C5A = {isa = PBXGroup; children = (
 					6CEFF94C7852DB3BFA5E29EB, ); name = VST3; sourceTree = "<group>"; };
 		09C66663E0BF7CD43C73C7E6 = {isa = PBXGroup; children = (
 					B663729F88A22F9325C3C9D0,
 					E96D0837CDD1CE8B768E4077,
-					B002DD058A40E158192BAEE5,
-					69EEEA6D294205148B1E268A,
-					18E6563C4672B4D77223D259,
-					0EB0BD7272CEB2232D7F7BD2,
-					DBCC2B2AF371A45272E6FA21,
+					10721EE9E840AA7BC5F61764,
+					5B3F9588F32C646D12DE0ACE,
+					0356C38F32660D46D5EE6554,
+					0720EF699B01F6EB0A2C4E3A,
+					E090AC75C454B0E281AB5C5A,
 					E65E231978B796AA7868DC4A,
 					BB2CD1B0323135818D0AB47F,
 					2A6E2BC2F602472C0FC70E68,
+					550FAA1B7314518C5237CB46,
 					CB93B445C37845467DFFA948,
 					D79CAC82B4607BE7DEED1045,
 					DFB0C0515543105C1C262D1F,
@@ -2742,8 +2743,7 @@
 					12E665A9E9A675668AF160A9,
 					CF99F55660DC79DAE3D0D1A2,
 					8B67A16CB449160267AA05BB,
-					0926E36205F4D676343AB6E7,
-					F5E9ED24FCF950C2B09ED67C, ); name = Resources; sourceTree = "<group>"; };
+					0926E36205F4D676343AB6E7, ); name = Resources; sourceTree = "<group>"; };
 		7EA0AEAFB626CDF5E0038ED5 = {isa = PBXGroup; children = (
 					537D65EF3BBBDFC4651D389D,
 					A206765795252391D3F60EA4,
@@ -3087,7 +3087,7 @@
 		66A99B0A3E2094889407A133 = {isa = XCConfigurationList; buildConfigurations = (
 					155E2212057EC38829899A3C,
 					103368FE85719AF0B91BA072, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
-		D4A200CA175E6673EB359B63 = {isa = PBXAggregateTarget; buildConfigurationList = 66A99B0A3E2094889407A133; dependencies = (
+		D4A200CA175E6673EB359B63 = {isa = PBXAggregateTarget; buildConfigurationList = 66A99B0A3E2094889407A133; buildPhases = (  ); buildRules = ( ); dependencies = (
 					3D94E4E73BA4376BD0C954BB,
 					96A187ABC229B69131A7A553,
 					F1D7CFC05961A0332974083D,
@@ -3096,8 +3096,7 @@
 					A4B12DFADE1730C6014F332B,
 					D56C28DC5C3854D6AA9E04C2, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		A9C5EEDC68735C4FD82BD179 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					B003460B11C0B7C1CC07E666,
-					984317B46E5445CE1D8E4096, ); runOnlyForDeploymentPostprocessing = 0; };
+					B003460B11C0B7C1CC07E666, ); runOnlyForDeploymentPostprocessing = 0; };
 		8FC8AA9EA1AC4A26A5275F62 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					2A10495092621B672B55C020, ); runOnlyForDeploymentPostprocessing = 0; };
 		401B24CA453ED2BFC0EB2E89 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3120,8 +3119,7 @@
 					AD749722210AC59435D40744,
 					5B39217A95807DE26271788F, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		0F2E05BC557F712359B8A9EB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					B003460B11C0B7C1CC07E666,
-					984317B46E5445CE1D8E4096, ); runOnlyForDeploymentPostprocessing = 0; };
+					B003460B11C0B7C1CC07E666, ); runOnlyForDeploymentPostprocessing = 0; };
 		0F041AFA4DBFCC6D0F1BAF6D = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					4B8B36CA49A9DEFEF84C4554, ); runOnlyForDeploymentPostprocessing = 0; };
 		543F0A994B5AC3479C27489E = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
@@ -3144,10 +3142,9 @@
 					1FA913B64C8ADDFFCA9768E1,
 					9E686ABA5935BF9B713A0C5A, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
 		98265196468E8519A8CB7DDB = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
-					B003460B11C0B7C1CC07E666,
-					984317B46E5445CE1D8E4096, ); runOnlyForDeploymentPostprocessing = 0; };
+					B003460B11C0B7C1CC07E666, ); runOnlyForDeploymentPostprocessing = 0; };
 		60542F4F7805D965FF306DF1 = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = (
-					71BB1850016434ACD2C733E3, ); runOnlyForDeploymentPostprocessing = 0; };
+					839CB91EF7AAB3086CD898FE, ); runOnlyForDeploymentPostprocessing = 0; };
 		37F22BD1952B828C02A1154C = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					7F77BD3679C81BEB8057BE4F,
 					A001C0EF302F42D8784EF150, ); runOnlyForDeploymentPostprocessing = 0; };
diff --git a/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj b/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj
index 36e6393..734d9f9 100644
--- a/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj	
+++ b/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj	
@@ -1917,6 +1917,7 @@
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\sampler\juce_Sampler.h"/>
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h"/>
+    <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h"/>
     <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h"/>
     <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBaseHelper.h"/>
     <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBuffer.h"/>
@@ -2389,7 +2390,8 @@
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\flac\Flac Licence.txt"/>
     <None Include="..\..\..\..\modules\juce_audio_formats\codecs\oggvorbis\Ogg Vorbis Licence.txt"/>
     <None Include="..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r"/>
-    <None Include="..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r"/>
+    <None Include="..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r"/>
+    <None Include="..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r"/>
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt"/>
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\pnglib\libpng_readme.txt"/>
   </ItemGroup>
diff --git a/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj.filters b/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj.filters
index dd30b79..0c2e50c 100644
--- a/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj.filters	
+++ b/examples/audio plugin demo/Builds/VisualStudio2015/JuceDemoPlugin.vcxproj.filters	
@@ -2610,6 +2610,9 @@
     <ClInclude Include="..\..\..\..\modules\juce_audio_formats\juce_audio_formats.h">
       <Filter>Juce Modules\juce_audio_formats</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AAX\juce_AAX_Modifier_Injector.h">
+      <Filter>Juce Modules\juce_audio_plugin_client\AAX</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\..\..\modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses\AUBase.h">
       <Filter>Juce Modules\juce_audio_plugin_client\AU\CoreAudioUtilityClasses</Filter>
     </ClInclude>
@@ -4022,8 +4025,11 @@
     <None Include="..\..\..\..\modules\juce_audio_plugin_client\AU\AUResources.r">
       <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
     </None>
-    <None Include="..\..\..\..\modules\juce_audio_plugin_client\AU\juce_RezResources_AU.r">
-      <Filter>Juce Modules\juce_audio_plugin_client\AU</Filter>
+    <None Include="..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_AU.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
+    </None>
+    <None Include="..\..\..\..\modules\juce_audio_plugin_client\juce_audio_plugin_client_RTAS.r">
+      <Filter>Juce Modules\juce_audio_plugin_client</Filter>
     </None>
     <None Include="..\..\..\..\modules\juce_graphics\image_formats\jpglib\changes to libjpeg for JUCE.txt">
       <Filter>Juce Modules\juce_graphics\image_formats\jpglib</Filter>
diff --git a/examples/audio plugin demo/JuceDemoPlugin.jucer b/examples/audio plugin demo/JuceDemoPlugin.jucer
index 78394d1..a2dce7b 100644
--- a/examples/audio plugin demo/JuceDemoPlugin.jucer	
+++ b/examples/audio plugin demo/JuceDemoPlugin.jucer	
@@ -3,12 +3,12 @@
 <JUCERPROJECT id="0nRd9LLGO" name="JuceDemoPlugin" projectType="audioplug"
               version="1.0.0" juceLinkage="amalg_multi" buildVST="1" buildRTAS="0"
               buildAU="1" pluginName="Juce Demo Plugin" pluginDesc="Juce Demo Plugin"
-              pluginManufacturer="ROLI Ltd." pluginManufacturerCode="Roli"
+              pluginManufacturer="ROLI Ltd." pluginManufacturerCode="ROLI"
               pluginCode="Jcdm" pluginChannelConfigs="{1, 1}, {2, 2}" pluginIsSynth="0"
               pluginWantsMidiIn="1" pluginProducesMidiOut="1" pluginSilenceInIsSilenceOut="0"
               pluginTailLength="0" pluginEditorRequiresKeys="1" pluginAUExportPrefix="JuceDemoProjectAU"
               pluginAUViewClass="JuceDemoProjectAU_V1" pluginRTASCategory=""
-              bundleIdentifier="com.juce.JuceDemoPlugin" jucerVersion="4.2.1"
+              bundleIdentifier="com.juce.JuceDemoPlugin" jucerVersion="4.2.3"
               companyName="ROLI Ltd." aaxIdentifier="com.yourcompany.JuceDemoPlugin"
               buildAAX="0" pluginAAXCategory="AAX_ePlugInCategory_Dynamics"
               includeBinaryInAppConfig="1" buildVST3="1" pluginManufacturerEmail="support at yourcompany.com"
diff --git a/examples/audio plugin demo/JuceLibraryCode/AppConfig.h b/examples/audio plugin demo/JuceLibraryCode/AppConfig.h
index f7f9e32..08cf3a6 100644
--- a/examples/audio plugin demo/JuceLibraryCode/AppConfig.h	
+++ b/examples/audio plugin demo/JuceLibraryCode/AppConfig.h	
@@ -109,6 +109,13 @@
 #endif
 
 //==============================================================================
+// juce_audio_plugin_client flags:
+
+#ifndef    JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ //#define JUCE_FORCE_USE_LEGACY_PARAM_IDS
+#endif
+
+//==============================================================================
 // juce_audio_processors flags:
 
 #ifndef    JUCE_PLUGINHOST_VST
@@ -232,10 +239,10 @@
  #define JucePlugin_ManufacturerEmail      "info at juce.com"
 #endif
 #ifndef  JucePlugin_ManufacturerCode
- #define JucePlugin_ManufacturerCode       'Roli'
+ #define JucePlugin_ManufacturerCode       0x524f4c49 // 'ROLI'
 #endif
 #ifndef  JucePlugin_PluginCode
- #define JucePlugin_PluginCode             'Jcdm'
+ #define JucePlugin_PluginCode             0x4a63646d // 'Jcdm'
 #endif
 #ifndef  JucePlugin_IsSynth
  #define JucePlugin_IsSynth                0
diff --git a/examples/audio plugin demo/Source/PluginEditor.cpp b/examples/audio plugin demo/Source/PluginEditor.cpp
index 091d5aa..463a603 100644
--- a/examples/audio plugin demo/Source/PluginEditor.cpp	
+++ b/examples/audio plugin demo/Source/PluginEditor.cpp	
@@ -82,9 +82,8 @@ JuceDemoPluginAudioProcessorEditor::JuceDemoPluginAudioProcessorEditor (JuceDemo
     timecodeDisplayLabel.setColour (Label::textColourId, Colours::blue);
     timecodeDisplayLabel.setFont (Font (Font::getDefaultMonospacedFontName(), 15.0f, Font::plain));
 
-    // add the triangular resizer component for the bottom-right of the UI
-    addAndMakeVisible (resizer = new ResizableCornerComponent (this, &resizeLimits));
-    resizeLimits.setSizeLimits (150, 150, 800, 300);
+    // set resize limits for this plug-in
+    setResizeLimits (400, 200, 800, 300);
 
     // set our component's initial size to be the last one that was stored in the filter's settings
     setSize (owner.lastUIWidth,
@@ -120,8 +119,6 @@ void JuceDemoPluginAudioProcessorEditor::resized()
     gainSlider->setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth() / 2)));
     delaySlider->setBounds (sliderArea.removeFromLeft (jmin (180, sliderArea.getWidth())));
 
-    resizer->setBounds (getWidth() - 16, getHeight() - 16, 16, 16);
-
     getProcessor().lastUIWidth = getWidth();
     getProcessor().lastUIHeight = getHeight();
 }
@@ -136,14 +133,14 @@ void JuceDemoPluginAudioProcessorEditor::timerCallback()
 // quick-and-dirty function to format a timecode string
 static String timeToTimecodeString (double seconds)
 {
-    const int millisecs = roundToInt (std::abs (seconds * 1000.0));
+    const int millisecs = roundToInt (seconds * 1000.0);
+    const int absMillisecs = std::abs (millisecs);
 
-    return String::formatted ("%s%02d:%02d:%02d.%03d",
-                              seconds < 0 ? "-" : "",
+    return String::formatted ("%02d:%02d:%02d.%03d",
                               millisecs / 360000,
-                              (millisecs / 60000) % 60,
-                              (millisecs / 1000) % 60,
-                              millisecs % 1000);
+                              (absMillisecs / 60000) % 60,
+                              (absMillisecs / 1000) % 60,
+                              absMillisecs % 1000);
 }
 
 // quick-and-dirty function to format a bars/beats string
@@ -165,25 +162,20 @@ static String quarterNotePositionToBarsBeatsString (double quarterNotes, int num
 // Updates the text in our position label.
 void JuceDemoPluginAudioProcessorEditor::updateTimecodeDisplay (AudioPlayHead::CurrentPositionInfo pos)
 {
-    if (lastDisplayedPosition != pos)
-    {
-        lastDisplayedPosition = pos;
-
-        MemoryOutputStream displayText;
-
-        displayText << "[" << SystemStats::getJUCEVersion() << "]   "
-                    << String (pos.bpm, 2) << " bpm, "
-                    << pos.timeSigNumerator << '/' << pos.timeSigDenominator
-                    << "  -  " << timeToTimecodeString (pos.timeInSeconds)
-                    << "  -  " << quarterNotePositionToBarsBeatsString (pos.ppqPosition,
-                                                                        pos.timeSigNumerator,
-                                                                        pos.timeSigDenominator);
-
-        if (pos.isRecording)
-            displayText << "  (recording)";
-        else if (pos.isPlaying)
-            displayText << "  (playing)";
-
-        timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification);
-    }
+    MemoryOutputStream displayText;
+
+    displayText << "[" << SystemStats::getJUCEVersion() << "]   "
+                << String (pos.bpm, 2) << " bpm, "
+                << pos.timeSigNumerator << '/' << pos.timeSigDenominator
+                << "  -  " << timeToTimecodeString (pos.timeInSeconds)
+                << "  -  " << quarterNotePositionToBarsBeatsString (pos.ppqPosition,
+                                                                    pos.timeSigNumerator,
+                                                                    pos.timeSigDenominator);
+
+    if (pos.isRecording)
+        displayText << "  (recording)";
+    else if (pos.isPlaying)
+        displayText << "  (playing)";
+
+    timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification);
 }
diff --git a/examples/audio plugin demo/Source/PluginEditor.h b/examples/audio plugin demo/Source/PluginEditor.h
index d62250d..5ba46d5 100644
--- a/examples/audio plugin demo/Source/PluginEditor.h	
+++ b/examples/audio plugin demo/Source/PluginEditor.h	
@@ -36,10 +36,6 @@ private:
     MidiKeyboardComponent midiKeyboard;
     Label timecodeDisplayLabel, gainLabel, delayLabel;
     ScopedPointer<ParameterSlider> gainSlider, delaySlider;
-    ScopedPointer<ResizableCornerComponent> resizer;
-    ComponentBoundsConstrainer resizeLimits;
-
-    AudioPlayHead::CurrentPositionInfo lastDisplayedPosition;
 
     //==============================================================================
     JuceDemoPluginAudioProcessor& getProcessor() const
diff --git a/examples/audio plugin demo/Source/PluginProcessor.cpp b/examples/audio plugin demo/Source/PluginProcessor.cpp
index b045d43..5a16b9e 100644
--- a/examples/audio plugin demo/Source/PluginProcessor.cpp	
+++ b/examples/audio plugin demo/Source/PluginProcessor.cpp	
@@ -344,8 +344,8 @@ void JuceDemoPluginAudioProcessor::setStateInformation (const void* data, int si
         if (xmlState->hasTagName ("MYPLUGINSETTINGS"))
         {
             // ok, now pull out our last window size..
-            lastUIWidth  = xmlState->getIntAttribute ("uiWidth", lastUIWidth);
-            lastUIHeight = xmlState->getIntAttribute ("uiHeight", lastUIHeight);
+            lastUIWidth  = jmax (xmlState->getIntAttribute ("uiWidth", lastUIWidth), 400);
+            lastUIHeight = jmax (xmlState->getIntAttribute ("uiHeight", lastUIHeight), 200);
 
             // Now reload our parameters..
             for (int i = 0; i < getNumParameters(); ++i)
diff --git a/examples/audio plugin host/Builds/Linux/Makefile b/examples/audio plugin host/Builds/Linux/Makefile
index b9dac0e..2257e6f 100644
--- a/examples/audio plugin host/Builds/Linux/Makefile	
+++ b/examples/audio plugin host/Builds/Linux/Makefile	
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/VST3\ SDK -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/examples/audio plugin host/Plugin Host.jucer b/examples/audio plugin host/Plugin Host.jucer
index ca29861..c306882 100644
--- a/examples/audio plugin host/Plugin Host.jucer	
+++ b/examples/audio plugin host/Plugin Host.jucer	
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="NTe0XB0ij" name="Plugin Host" projectType="guiapp" version="1.0.0"
               juceFolder="../../../juce" vstFolderMac="~/SDKs/vstsdk2.4" vstFolderPC="c:\SDKs\vstsdk2.4"
-              bundleIdentifier="com.roli.pluginhost" jucerVersion="4.2.1" companyName="ROLI Ltd."
+              bundleIdentifier="com.roli.pluginhost" jucerVersion="4.2.3" companyName="ROLI Ltd."
               includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="" rtasFolder="~/SDKs/PT_80_SDK"
diff --git a/extras/AudioPerformanceTest/AudioPerformanceTest.jucer b/extras/AudioPerformanceTest/AudioPerformanceTest.jucer
index d15f4ca..c2df6ee 100644
--- a/extras/AudioPerformanceTest/AudioPerformanceTest.jucer
+++ b/extras/AudioPerformanceTest/AudioPerformanceTest.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="AKfc5m" name="AudioPerformanceTest" projectType="guiapp"
               version="1.0.0" bundleIdentifier="com.juce.AudioPerformanceTest"
-              includeBinaryInAppConfig="1" jucerVersion="4.2.1">
+              includeBinaryInAppConfig="1" jucerVersion="4.2.3">
   <MAINGROUP id="b1eVTe" name="AudioPerformanceTest">
     <GROUP id="{AB66118C-9D88-1C3A-D95C-42892D828E4B}" name="Source">
       <FILE id="SqGU9p" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
diff --git a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
index 5aba42a..adb7689 100644
--- a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
+++ b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/extras/Projucer/Builds/LinuxMakefile/Makefile b/extras/Projucer/Builds/LinuxMakefile/Makefile
index c98167c..dd33a82 100644
--- a/extras/Projucer/Builds/LinuxMakefile/Makefile
+++ b/extras/Projucer/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=4.2.1" -D "JUCE_APP_VERSION_HEX=0x40201" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=4.2.3 -DJUCE_APP_VERSION_HEX=0x40203 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 -std=c++11
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt -lcurl 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=4.2.1" -D "JUCE_APP_VERSION_HEX=0x40201" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=4.2.3 -DJUCE_APP_VERSION_HEX=0x40203 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3 -std=c++11
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -ldl -lfreetype -lpthread -lrt -lcurl 
diff --git a/extras/Projucer/Builds/MacOSX/Info-App.plist b/extras/Projucer/Builds/MacOSX/Info-App.plist
index 50cd38f..86a8b55 100644
--- a/extras/Projucer/Builds/MacOSX/Info-App.plist
+++ b/extras/Projucer/Builds/MacOSX/Info-App.plist
@@ -33,9 +33,9 @@
     <key>CFBundleSignature</key>
     <string>????</string>
     <key>CFBundleShortVersionString</key>
-    <string>4.2.1</string>
+    <string>4.2.3</string>
     <key>CFBundleVersion</key>
-    <string>4.2.1</string>
+    <string>4.2.3</string>
     <key>NSHumanReadableCopyright</key>
     <string></string>
     <key>NSHighResolutionCapable</key>
diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
index 4b31c6b..ce66ba6 100644
--- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
+++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
@@ -2372,8 +2372,8 @@
 					"_DEBUG=1",
 					"DEBUG=1",
 					"JUCER_XCODE_MAC_F6D2F4CF=1",
-					"JUCE_APP_VERSION=4.2.1",
-					"JUCE_APP_VERSION_HEX=0x40201", );
+					"JUCE_APP_VERSION=4.2.3",
+					"JUCE_APP_VERSION_HEX=0x40203", );
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
 				INFOPLIST_FILE = Info-App.plist;
@@ -2396,8 +2396,8 @@
 					"_NDEBUG=1",
 					"NDEBUG=1",
 					"JUCER_XCODE_MAC_F6D2F4CF=1",
-					"JUCE_APP_VERSION=4.2.1",
-					"JUCE_APP_VERSION_HEX=0x40201", );
+					"JUCE_APP_VERSION=4.2.3",
+					"JUCE_APP_VERSION_HEX=0x40203", );
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
diff --git a/extras/Projucer/Builds/VisualStudio2013/Projucer.vcxproj b/extras/Projucer/Builds/VisualStudio2013/Projucer.vcxproj
index 23d5a01..de6498d 100644
--- a/extras/Projucer/Builds/VisualStudio2013/Projucer.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2013/Projucer.vcxproj
@@ -58,7 +58,7 @@
       <Optimization>Disabled</Optimization>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=4.2.1;JUCE_APP_VERSION_HEX=0x40201;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=4.2.3;JUCE_APP_VERSION_HEX=0x40203;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader/>
@@ -97,7 +97,7 @@
     <ClCompile>
       <Optimization>Full</Optimization>
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=4.2.1;JUCE_APP_VERSION_HEX=0x40201;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;JUCE_APP_VERSION=4.2.3;JUCE_APP_VERSION_HEX=0x40203;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader/>
diff --git a/extras/Projucer/Builds/VisualStudio2013/resources.rc b/extras/Projucer/Builds/VisualStudio2013/resources.rc
index 0cb9c20..21778ec 100644
--- a/extras/Projucer/Builds/VisualStudio2013/resources.rc
+++ b/extras/Projucer/Builds/VisualStudio2013/resources.rc
@@ -7,16 +7,16 @@
 #include <windows.h>
 
 VS_VERSION_INFO VERSIONINFO
-FILEVERSION  4,2,1,0
+FILEVERSION  4,2,3,0
 BEGIN
   BLOCK "StringFileInfo"
   BEGIN
     BLOCK "040904E4"
     BEGIN
       VALUE "FileDescription",  "Projucer\0"
-      VALUE "FileVersion",  "4.2.1\0"
+      VALUE "FileVersion",  "4.2.3\0"
       VALUE "ProductName",  "Projucer\0"
-      VALUE "ProductVersion",  "4.2.1\0"
+      VALUE "ProductVersion",  "4.2.3\0"
     END
   END
 
diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer.vcxproj
index 106889b..59dc2ea 100644
--- a/extras/Projucer/Builds/VisualStudio2015/Projucer.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2015/Projucer.vcxproj
@@ -58,7 +58,7 @@
       <Optimization>Disabled</Optimization>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=4.2.1;JUCE_APP_VERSION_HEX=0x40201;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=4.2.3;JUCE_APP_VERSION_HEX=0x40203;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader/>
@@ -97,7 +97,7 @@
     <ClCompile>
       <Optimization>Full</Optimization>
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=4.2.1;JUCE_APP_VERSION_HEX=0x40201;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=4.2.3;JUCE_APP_VERSION_HEX=0x40203;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader/>
diff --git a/extras/Projucer/Builds/VisualStudio2015/resources.rc b/extras/Projucer/Builds/VisualStudio2015/resources.rc
index 0cb9c20..21778ec 100644
--- a/extras/Projucer/Builds/VisualStudio2015/resources.rc
+++ b/extras/Projucer/Builds/VisualStudio2015/resources.rc
@@ -7,16 +7,16 @@
 #include <windows.h>
 
 VS_VERSION_INFO VERSIONINFO
-FILEVERSION  4,2,1,0
+FILEVERSION  4,2,3,0
 BEGIN
   BLOCK "StringFileInfo"
   BEGIN
     BLOCK "040904E4"
     BEGIN
       VALUE "FileDescription",  "Projucer\0"
-      VALUE "FileVersion",  "4.2.1\0"
+      VALUE "FileVersion",  "4.2.3\0"
       VALUE "ProductName",  "Projucer\0"
-      VALUE "ProductVersion",  "4.2.1\0"
+      VALUE "ProductVersion",  "4.2.3\0"
     END
   END
 
diff --git a/extras/Projucer/JuceLibraryCode/JuceHeader.h b/extras/Projucer/JuceLibraryCode/JuceHeader.h
index 1a71a18..8db2f1c 100644
--- a/extras/Projucer/JuceLibraryCode/JuceHeader.h
+++ b/extras/Projucer/JuceLibraryCode/JuceHeader.h
@@ -35,8 +35,8 @@
 namespace ProjectInfo
 {
     const char* const  projectName    = "Projucer";
-    const char* const  versionString  = "4.2.1";
-    const int          versionNumber  = 0x40201;
+    const char* const  versionString  = "4.2.3";
+    const int          versionNumber  = 0x40203;
 }
 #endif
 
diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer
index 9413a2c..5fc7dd2 100644
--- a/extras/Projucer/Projucer.jucer
+++ b/extras/Projucer/Projucer.jucer
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"
-              jucerVersion="4.2.1" version="4.2.1" bundleIdentifier="com.juce.theprojucer"
+              jucerVersion="4.2.3" version="4.2.3" bundleIdentifier="com.juce.theprojucer"
               defines="" includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
diff --git a/extras/Projucer/Source/ComponentEditor/components/jucer_TextButtonHandler.h b/extras/Projucer/Source/ComponentEditor/components/jucer_TextButtonHandler.h
index 185d0c7..f9cf452 100644
--- a/extras/Projucer/Source/ComponentEditor/components/jucer_TextButtonHandler.h
+++ b/extras/Projucer/Source/ComponentEditor/components/jucer_TextButtonHandler.h
@@ -30,48 +30,35 @@ public:
     {
         registerColour (TextButton::buttonColourId, "background (normal)", "bgColOff");
         registerColour (TextButton::buttonOnColourId, "background (on)", "bgColOn");
-        registerColour (TextButton::textColourOnId, "text colour (normal)", "textCol");
-        registerColour (TextButton::textColourOffId, "text colour (on)", "textColOn");
+        registerColour (TextButton::textColourOffId, "text colour (normal)", "textCol");
+        registerColour (TextButton::textColourOnId, "text colour (on)", "textColOn");
     }
 
     Component* createNewComponent (JucerDocument*)
     {
-        return new TextButton ("new button", String::empty);
+        return new TextButton ("new button", String());
     }
 
     void getEditableProperties (Component* component, JucerDocument& document, Array<PropertyComponent*>& props)
     {
         ButtonHandler::getEditableProperties (component, document, props);
-
         addColourProperties (component, document, props);
     }
 
     XmlElement* createXmlFor (Component* comp, const ComponentLayout* layout)
     {
-        XmlElement* e = ButtonHandler::createXmlFor (comp, layout);
-
-        //TextButton* tb = (TextButton*) comp;
-
-        return e;
+        return ButtonHandler::createXmlFor (comp, layout);
     }
 
     bool restoreFromXml (const XmlElement& xml, Component* comp, const ComponentLayout* layout)
     {
-        if (! ButtonHandler::restoreFromXml (xml, comp, layout))
-            return false;
-
-        //TextButton* tb = (TextButton*) comp;
-
-        return true;
+        return ButtonHandler::restoreFromXml (xml, comp, layout);
     }
 
     void fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName)
     {
         ButtonHandler::fillInCreationCode (code, component, memberVariableName);
 
-        //TextButton* const tb = dynamic_cast<TextButton*> (component);
-        //TextButton defaultButton (String::empty);
-
         String s;
 
         s << getColourIntialisationCode (component, memberVariableName)
diff --git a/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h
index c174c82..9f741b3 100644
--- a/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h	
+++ b/extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h	
@@ -335,6 +335,9 @@ protected:
         Value shouldGenerateManifestValue()         { return getValue (Ids::generateManifest); }
         bool shouldGenerateManifest() const         { return config [Ids::generateManifest]; }
 
+        Value shouldLinkIncrementalValue()          { return getValue (Ids::enableIncrementalLinking); }
+        bool shouldLinkIncremental() const          { return config [Ids::enableIncrementalLinking]; }
+
         Value getWholeProgramOptValue()             { return getValue (Ids::wholeProgramOptimisation); }
         bool shouldDisableWholeProgramOpt() const   { return static_cast<int> (config [Ids::wholeProgramOptimisation]) > 0; }
 
@@ -399,6 +402,12 @@ protected:
                                                         StringArray (wpoNames), Array<var> (wpoValues, numElementsInArray (wpoValues))));
             }
 
+            {
+                props.add (new BooleanPropertyComponent (shouldLinkIncrementalValue(), "Incremental Linking", "Enable"),
+                           "Enable to avoid linking from scratch for every new build. "
+                           "Disable to ensure that your final release build does not contain padding or thunks.");
+            }
+
             if (! isDebug())
                 props.add (new BooleanPropertyComponent (shouldGenerateDebugSymbolsValue(), "Debug Symbols", "Force generation of debug symbols"));
 
@@ -1026,6 +1035,7 @@ protected:
 
             linker->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : "");
             linker->setAttribute ("GenerateDebugInformation", (isDebug || config.shouldGenerateDebugSymbols()) ? "true" : "false");
+            linker->setAttribute ("LinkIncremental", config.shouldLinkIncremental() ? "2" : "1");
             linker->setAttribute ("ProgramDatabaseFile", getIntDirFile (config, config.getOutputFilename (".pdb", true)));
             linker->setAttribute ("SubSystem", msvcIsWindowsSubsystem ? "2" : "1");
 
@@ -1073,6 +1083,8 @@ protected:
 
                 linker->setAttribute ("OutputFile", getOutDirFile (config, config.getOutputFilename (msvcTargetSuffix, false)));
                 linker->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : "");
+
+                linker->setAttribute ("LinkIncremental", config.shouldLinkIncremental() ? "2" : "1");
             }
             else
             {
@@ -1370,6 +1382,9 @@ protected:
             if (! (config.isDebug() || config.shouldDisableWholeProgramOpt()))
                 e->createNewChildElement ("WholeProgramOptimization")->addTextElement ("true");
 
+            if (config.shouldLinkIncremental())
+                e->createNewChildElement ("LinkIncremental")->addTextElement ("true");
+
             if (config.is64Bit())
                 e->createNewChildElement ("PlatformToolset")->addTextElement (getPlatformToolset());
         }
diff --git a/extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h b/extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h
index 23c3b48..632b520 100644
--- a/extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h	
+++ b/extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h	
@@ -124,7 +124,7 @@ public:
     bool isOSX() const override                      { return ! iOS; }
     bool isiOS() const override                      { return iOS; }
 
-    bool supportsVST() const override                { return ! iOS; }
+    bool supportsVST() const override                { return true; }
     bool supportsVST3() const override               { return ! iOS; }
     bool supportsAAX() const override                { return ! iOS; }
     bool supportsRTAS() const override               { return ! iOS; }
@@ -1593,10 +1593,10 @@ private:
 
                 if (! projectType.isStaticLibrary() && target.type != Target::SharedCodeTarget)
                     target.addBuildPhase ("PBXFrameworksBuildPhase", target.frameworkIDs);
-
-                target.addShellScriptBuildPhase ("Post-build script", getPostBuildScript());
             }
 
+            target.addShellScriptBuildPhase ("Post-build script", getPostBuildScript());
+
             if (project.getProjectType().isAudioPlugin() && project.shouldBuildAUv3().getValue()
                 && project.shouldBuildStandalone().getValue() && target.type == Target::StandalonePlugIn)
                 embedAppExtension();
@@ -1661,11 +1661,8 @@ private:
         v->setProperty ("isa", target.type == Target::AggregateTarget ? "PBXAggregateTarget" : "PBXNativeTarget", nullptr);
         v->setProperty ("buildConfigurationList", createID (String ("__configList") + targetName), nullptr);
 
-        if (target.type != Target::AggregateTarget)
-        {
-            v->setProperty ("buildPhases", indentParenthesisedList (target.buildPhaseIDs), nullptr);
-            v->setProperty ("buildRules", "( )", nullptr);
-        }
+        v->setProperty ("buildPhases", indentParenthesisedList (target.buildPhaseIDs), nullptr);
+        v->setProperty ("buildRules", "( )", nullptr);
 
         v->setProperty ("dependencies", indentParenthesisedList (getTargetDependencies (target)), nullptr);
         v->setProperty (Ids::name, target.getXCodeSchemeName(), nullptr);
@@ -2204,20 +2201,23 @@ private:
         return refID;
     }
 
-    String addRezFile (const RelativePath& path) const
+    String addRezFile (const Project::Item& projectItem, const RelativePath& path) const
     {
         const String pathAsString (path.toUnixStyle());
         const String refID (addFileReference (path.toUnixStyle()));
 
-        Target* auTarget = getTargetOfType (Target::AudioUnitPlugIn);
-
-        if (auTarget == nullptr)
-            return String();
+        if (projectItem.isModuleCode())
+        {
+            if (Target* xcodeTarget = getTargetOfType (getTargetTypeFromFilePath (projectItem.getFile(), false)))
+            {
+                String rezFileID = addBuildFile (pathAsString, refID, false, false, xcodeTarget);
+                xcodeTarget->rezFileIDs.add (rezFileID);
 
-        String rezFileID = addBuildFile (pathAsString, refID, false, false, auTarget);
-        auTarget->rezFileIDs.add (rezFileID);
+                return refID;
+            }
+        }
 
-        return refID;
+        return String();
     }
 
     String getEntitlementsFileName() const
@@ -2270,25 +2270,12 @@ private:
             else
                 path = RelativePath (projectItem.getFile(), getTargetFolder(), RelativePath::buildTargetFolder);
 
-            if (path.hasFileExtension (".r") && LibraryModule::CompileUnit::hasSuffix (projectItem.getFile(), "_AU"))
-                return addRezFile (path);
+            if (path.hasFileExtension (".r"))
+                return addRezFile (projectItem, path);
 
             Target* xcodeTarget = nullptr;
             if (projectItem.isModuleCode() && projectItem.shouldBeCompiled())
-            {
-                const File& file = projectItem.getFile();
-
-                Target::Type targetType = Target::unspecified;
-                if      (LibraryModule::CompileUnit::hasSuffix (file, "_AU"))         targetType = Target::AudioUnitPlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_AUv3"))       targetType = Target::AudioUnitv3PlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_AAX"))        targetType = Target::AAXPlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_RTAS"))       targetType = Target::RTASPlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST2"))       targetType = Target::VSTPlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST3"))       targetType = Target::VST3PlugIn;
-                else if (LibraryModule::CompileUnit::hasSuffix (file, "_Standalone")) targetType = Target::StandalonePlugIn;
-
-                xcodeTarget = getTargetOfType (targetType);
-            }
+                xcodeTarget = getTargetOfType (getTargetTypeFromFilePath (projectItem.getFile(), false));
 
             return addFile (path, projectItem.shouldBeCompiled(),
                             projectItem.shouldBeAddedToBinaryResources(),
@@ -2392,6 +2379,19 @@ private:
         misc.add (v);
     }
 
+    static Target::Type getTargetTypeFromFilePath (const File& file, bool returnSharedTargetIfNoValidSuffic)
+    {
+        if      (LibraryModule::CompileUnit::hasSuffix (file, "_AU"))         return Target::AudioUnitPlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_AUv3"))       return Target::AudioUnitv3PlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_AAX"))        return Target::AAXPlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_RTAS"))       return Target::RTASPlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST2"))       return Target::VSTPlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_VST3"))       return Target::VST3PlugIn;
+        else if (LibraryModule::CompileUnit::hasSuffix (file, "_Standalone")) return Target::StandalonePlugIn;
+
+        return (returnSharedTargetIfNoValidSuffic ? Target::SharedCodeTarget : Target::unspecified);
+    }
+
     //==============================================================================
     void removeMismatchedXcuserdata() const
     {
diff --git a/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.cpp b/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.cpp
index df80d3e..31ab009 100644
--- a/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.cpp	
+++ b/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.cpp	
@@ -56,7 +56,16 @@ namespace
 
     inline String valueToCharLiteral (const var& v)
     {
-        return CppTokeniserFunctions::addEscapeChars (v.toString().trim().substring (0, 4)).quoted ('\'');
+        String fourCharCode = v.toString().trim().substring (0, 4);
+        uint32 hexRepresentation = 0;
+
+        for (int i = 0; i < 4; ++i)
+            hexRepresentation = (hexRepresentation << 8U)
+                             |  (static_cast<unsigned int> (fourCharCode[i]) & 0xffU);
+
+        return String ("0x") + String::toHexString (static_cast<int> (hexRepresentation))
+                             + String (" // ")
+                             + CppTokeniserFunctions::addEscapeChars (fourCharCode).quoted ('\'');
     }
 }
 
diff --git a/extras/Projucer/Source/Project/jucer_ConfigTree_Exporter.h b/extras/Projucer/Source/Project/jucer_ConfigTree_Exporter.h
index 15be8db..a103cbd 100644
--- a/extras/Projucer/Source/Project/jucer_ConfigTree_Exporter.h
+++ b/extras/Projucer/Source/Project/jucer_ConfigTree_Exporter.h
@@ -46,10 +46,7 @@ public:
     void paintIcon (Graphics& g, Rectangle<int> area) override
     {
         g.setColour (Colours::black);
-
-        g.drawImageWithin (icon, area.getX(), area.getY(),
-                           area.getWidth(), area.getHeight(),
-                           RectanglePlacement::centred, false);
+        g.drawImage (icon, area.toFloat(), RectanglePlacement::centred);
     }
 
     void deleteItem() override
diff --git a/extras/Projucer/Source/Project/jucer_Module.cpp b/extras/Projucer/Source/Project/jucer_Module.cpp
index cf8624c..ff59f9f 100644
--- a/extras/Projucer/Source/Project/jucer_Module.cpp
+++ b/extras/Projucer/Source/Project/jucer_Module.cpp
@@ -601,12 +601,6 @@ File EnabledModuleList::findLocalModuleFolder (const String& moduleID, bool useE
 
                     if (ModuleDescription (f).isValid())
                         return f;
-
-                    f = moduleFolder.getChildFile ("modules")
-                                    .getChildFile (moduleID);
-
-                    if (ModuleDescription (f).isValid())
-                        return f;
                 }
             }
         }
diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp
index 1ff64ff..29be7e3 100644
--- a/extras/Projucer/Source/Project/jucer_Project.cpp
+++ b/extras/Projucer/Source/Project/jucer_Project.cpp
@@ -1121,9 +1121,12 @@ String Project::getAUMainTypeString()
 
     if (s.isEmpty())
     {
-        if (getPluginIsSynth().getValue())              s = "kAudioUnitType_MusicDevice";
-        else if (getPluginWantsMidiInput().getValue())  s = "kAudioUnitType_MusicEffect";
-        else                                            s = "kAudioUnitType_Effect";
+        // Unfortunately, Rez uses a header where kAudioUnitType_MIDIProcessor is undefined
+        // Use aumi instead.
+        if      (getPluginIsMidiEffectPlugin().getValue()) s = "'aumi'";
+        else if (getPluginIsSynth().getValue())            s = "kAudioUnitType_MusicDevice";
+        else if (getPluginWantsMidiInput().getValue())     s = "kAudioUnitType_MusicEffect";
+        else                                               s = "kAudioUnitType_Effect";
     }
 
     return s;
diff --git a/extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp
index 1ea94cb..f65729f 100644
--- a/extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp
+++ b/extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp
@@ -446,11 +446,7 @@ struct EnableBuildComp   : public Component
 //==============================================================================
 Component* ProjectContentComponent::createBuildTab (CompileEngineChildProcess* child)
 {
-   #if JUCE_WINDOWS
-    ignoreUnused (child);
-    return new ProjucerDisabledComp ("Windows support is still under development - "
-                                     "please check for updates at www.juce.com!", false, false);
-   #elif JUCE_LINUX
+   #if JUCE_LINUX
     ignoreUnused (child);
     return new ProjucerDisabledComp ("Linux support is still under development - "
                                      "please check for updates at www.juce.com!", false, false);
@@ -1474,7 +1470,6 @@ void ProjectContentComponent::timerCallback()
 
 ReferenceCountedObjectPtr<CompileEngineChildProcess> ProjectContentComponent::getChildProcess()
 {
-   #if JUCE_MAC
     if (childProcess == nullptr && isBuildEnabled())
     {
         childProcess = ProjucerApplication::getApp().childProcessCache->getOrCreate (*project);
@@ -1482,7 +1477,6 @@ ReferenceCountedObjectPtr<CompileEngineChildProcess> ProjectContentComponent::ge
         if (childProcess != nullptr)
             childProcess->setContinuousRebuild (isContinuousRebuildEnabled());
     }
-   #endif
 
     return childProcess;
 }
diff --git a/extras/Projucer/Source/Utility/jucer_MiscUtilities.cpp b/extras/Projucer/Source/Utility/jucer_MiscUtilities.cpp
index f722a20..5a03034 100644
--- a/extras/Projucer/Source/Utility/jucer_MiscUtilities.cpp
+++ b/extras/Projucer/Source/Utility/jucer_MiscUtilities.cpp
@@ -138,10 +138,7 @@ String createGCCPreprocessorFlags (const StringPairArray& defs)
         if (value.isNotEmpty())
             def << "=" << value;
 
-        if (! def.endsWithChar ('"'))
-            def = def.quoted();
-
-        s += " -D " + def;
+        s += " -D" + def;
     }
 
     return s;
diff --git a/extras/Projucer/Source/Utility/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/jucer_PresetIDs.h
index 3bbb26e..f9203f3 100644
--- a/extras/Projucer/Source/Utility/jucer_PresetIDs.h
+++ b/extras/Projucer/Source/Utility/jucer_PresetIDs.h
@@ -117,6 +117,7 @@ namespace Ids
     DECLARE_ID (generateManifest);
     DECLARE_ID (useRuntimeLibDLL);
     DECLARE_ID (wholeProgramOptimisation);
+    DECLARE_ID (enableIncrementalLinking);
     DECLARE_ID (buildVST);
     DECLARE_ID (bundleIdentifier);
     DECLARE_ID (aaxIdentifier);
diff --git a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
index 40005af..68cd0d7 100644
--- a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
+++ b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCE_UNIT_TESTS=1" -D "JUCER_LINUX_MAKE_6D53C8B4=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_UNIT_TESTS=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O3
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -lGL -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt 
diff --git a/extras/UnitTestRunner/UnitTestRunner.jucer b/extras/UnitTestRunner/UnitTestRunner.jucer
index 5ae2d49..759f453 100644
--- a/extras/UnitTestRunner/UnitTestRunner.jucer
+++ b/extras/UnitTestRunner/UnitTestRunner.jucer
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="Z2Xzcp" name="UnitTestRunner" projectType="consoleapp" version="1.0.0"
               bundleIdentifier="com.yourcompany.UnitTestRunner" includeBinaryInAppConfig="1"
-              jucerVersion="4.2.1" defines="JUCE_UNIT_TESTS=1">
+              jucerVersion="4.2.3" defines="JUCE_UNIT_TESTS=1">
   <MAINGROUP id="GZdWCU" name="UnitTestRunner">
     <GROUP id="{22894462-E1A9-036F-ED94-B51A50C87552}" name="Source">
       <FILE id="ynaYaM" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
diff --git a/extras/binarybuilder/BinaryBuilder.jucer b/extras/binarybuilder/BinaryBuilder.jucer
index 8b56fb8..237f6a4 100644
--- a/extras/binarybuilder/BinaryBuilder.jucer
+++ b/extras/binarybuilder/BinaryBuilder.jucer
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <JUCERPROJECT id="3t6YqETY1" name="BinaryBuilder" projectType="consoleapp"
-              juceFolder="../../../juce" jucerVersion="4.2.1" bundleIdentifier="com.rawmaterialsoftware.binarybuilder"
+              juceFolder="../../../juce" jucerVersion="4.2.3" bundleIdentifier="com.rawmaterialsoftware.binarybuilder"
               includeBinaryInAppConfig="1" version="1.0.0">
   <EXPORTFORMATS>
     <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"
diff --git a/extras/binarybuilder/Builds/Linux/Makefile b/extras/binarybuilder/Builds/Linux/Makefile
index 0b5a81f..2e152da 100644
--- a/extras/binarybuilder/Builds/Linux/Makefile
+++ b/extras/binarybuilder/Builds/Linux/Makefile
@@ -18,7 +18,7 @@ ifeq ($(CONFIG),Debug)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -L/usr/X11R6/lib/ -ldl -lpthread -lrt 
@@ -38,7 +38,7 @@ ifeq ($(CONFIG),Release)
     TARGET_ARCH := -march=native
   endif
 
-  CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
+  CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCER_LINUX_MAKE_7346DA2A=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 -I /usr/include -I /usr/include/freetype2 -I ../../JuceLibraryCode -I ../../../../modules
   CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os
   CXXFLAGS += $(CFLAGS) -std=c++11
   LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -fvisibility=hidden -L/usr/X11R6/lib/ -ldl -lpthread -lrt 
diff --git a/extras/windows dll/jucedll.jucer b/extras/windows dll/jucedll.jucer
index fe12925..967c659 100644
--- a/extras/windows dll/jucedll.jucer	
+++ b/extras/windows dll/jucedll.jucer	
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="IvabE4" name="juce_dll" projectType="library" version="1.0.0"
               juceLinkage="none" bundleIdentifier="com.rawmaterialsoftware.juce"
-              jucerVersion="4.2.1" defines="JUCE_DLL_BUILD=1" includeBinaryInAppConfig="1">
+              jucerVersion="4.2.3" defines="JUCE_DLL_BUILD=1" includeBinaryInAppConfig="1">
   <EXPORTFORMATS>
     <VS2010 targetFolder="Builds/VisualStudio2010">
       <CONFIGURATIONS>
diff --git a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp
index 0f91bc2..0d60e3e 100644
--- a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp
+++ b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp
@@ -204,10 +204,11 @@ namespace FloatVectorHelpers
         typedef float Type;
         typedef float32x4_t ParallelType;
         typedef uint32x4_t IntegerType;
+        union signMaskUnion { ParallelType f; IntegerType i; };
         enum { numParallel = 4 };
 
-        static forcedinline IntegerType toint (ParallelType v) noexcept                 { union { ParallelType f; IntegerType i; } u; u.f = v; return u.i; }
-        static forcedinline ParallelType toflt (IntegerType v) noexcept                 { union { ParallelType f; IntegerType i; } u; u.i = v; return u.f; }
+        static forcedinline IntegerType toint (ParallelType v) noexcept                 { signMaskUnion u; u.f = v; return u.i; }
+        static forcedinline ParallelType toflt (IntegerType v) noexcept                 { signMaskUnion u; u.i = v; return u.f; }
 
         static forcedinline ParallelType load1 (Type v) noexcept                        { return vld1q_dup_f32 (&v); }
         static forcedinline ParallelType loadA (const Type* v) noexcept                 { return vld1q_f32 (v); }
@@ -235,10 +236,11 @@ namespace FloatVectorHelpers
         typedef double Type;
         typedef double ParallelType;
         typedef uint64 IntegerType;
+        union signMaskUnion { ParallelType f; IntegerType i; };
         enum { numParallel = 1 };
 
-        static forcedinline IntegerType toint (ParallelType v) noexcept                 { union { ParallelType f; IntegerType i; } u; u.f = v; return u.i; }
-        static forcedinline ParallelType toflt (IntegerType v) noexcept                 { union { ParallelType f; IntegerType i; } u; u.i = v; return u.f; }
+        static forcedinline IntegerType toint (ParallelType v) noexcept                 { signMaskUnion u; u.f = v; return u.i; }
+        static forcedinline ParallelType toflt (IntegerType v) noexcept                 { signMaskUnion u; u.i = v; return u.f; }
 
         static forcedinline ParallelType load1 (Type v) noexcept                        { return v; }
         static forcedinline ParallelType loadA (const Type* v) noexcept                 { return *v; }
@@ -346,6 +348,9 @@ namespace FloatVectorHelpers
     #define JUCE_LOAD_SRC1_SRC2_DEST(src1Load, src2Load, dstLoad)   const Mode::ParallelType d = dstLoad (dest), s1 = src1Load (src1), s2 = src2Load (src2);
     #define JUCE_LOAD_SRC_DEST(srcLoad, dstLoad)                    const Mode::ParallelType d = dstLoad (dest), s = srcLoad (src);
 
+    union signMask32 { float  f; uint32 i; };
+    union signMask64 { double d; uint64 i; };
+
    #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON
     template<int typeSize> struct ModeType    { typedef BasicOps32 Mode; };
     template<>             struct ModeType<8> { typedef BasicOps64 Mode; };
@@ -806,7 +811,7 @@ void FloatVectorOperations::abs (float* dest, const float* src, int num) noexcep
    #if JUCE_USE_VDSP_FRAMEWORK
     vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);
    #else
-    union { float f; uint32 i; } signMask;
+    FloatVectorHelpers::signMask32 signMask;
     signMask.i = 0x7fffffffUL;
     JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = fabsf (src[i]), Mode::bit_and (s, mask),
                                   JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,
@@ -821,7 +826,7 @@ void FloatVectorOperations::abs (double* dest, const double* src, int num) noexc
    #if JUCE_USE_VDSP_FRAMEWORK
     vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);
    #else
-    union {double d; uint64 i;} signMask;
+    FloatVectorHelpers::signMask64 signMask;
     signMask.i = 0x7fffffffffffffffULL;
 
     JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = fabs (src[i]), Mode::bit_and (s, mask),
diff --git a/modules/juce_audio_basics/juce_audio_basics.h b/modules/juce_audio_basics/juce_audio_basics.h
index 2ca734c..6742c9e 100644
--- a/modules/juce_audio_basics/juce_audio_basics.h
+++ b/modules/juce_audio_basics/juce_audio_basics.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_basics
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE audio and MIDI data classes
   description:      Classes for audio buffer manipulation, midi message handling, synthesis, etc.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp
index a334dfe..556c2d8 100644
--- a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp
+++ b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp
@@ -33,11 +33,23 @@ namespace MidiHelpers
     {
         return (uint8) jlimit (0, 127, v);
     }
+}
 
-    inline uint8 floatVelocityToByte (const float v) noexcept
-    {
-        return validVelocity (roundToInt (v * 127.0f));
-    }
+//==============================================================================
+uint8 MidiMessage::floatValueToMidiByte (const float v) noexcept
+{
+    return MidiHelpers::validVelocity (roundToInt (v * 127.0f));
+}
+
+uint16 MidiMessage::pitchbendToPitchwheelPos (const float pitchbend,
+                                 const float pitchbendRange) noexcept
+{
+    // can't translate a pitchbend value that is outside of the given range!
+    jassert (std::abs (pitchbend) <= pitchbendRange);
+
+    return static_cast<uint16> (pitchbend > 0.0f
+                                  ? jmap (pitchbend, 0.0f, pitchbendRange, 8192.0f, 16383.0f)
+                                  : jmap (pitchbend, -pitchbendRange, 0.0f, 0.0f, 8192.0f));
 }
 
 //==============================================================================
@@ -84,25 +96,24 @@ int MidiMessage::getMessageLengthFromFirstByte (const uint8 firstByte) noexcept
 MidiMessage::MidiMessage() noexcept
    : timeStamp (0), size (2)
 {
-    preallocatedData.asBytes[0] = 0xf0;
-    preallocatedData.asBytes[1] = 0xf7;
+    packedData.asBytes[0] = 0xf0;
+    packedData.asBytes[1] = 0xf7;
 }
 
 MidiMessage::MidiMessage (const void* const d, const int dataSize, const double t)
-   : timeStamp (t),
-     size (dataSize)
+   : timeStamp (t), size (dataSize)
 {
     jassert (dataSize > 0);
-    memcpy (allocateSpace (dataSize), d, (size_t) dataSize);
+    // this checks that the length matches the data..
+    jassert (dataSize > 3 || *(uint8*)d >= 0xf0 || getMessageLengthFromFirstByte (*(uint8*)d) == size);
 
-    // check that the length matches the data..
-    jassert (size > 3 || *(uint8*)d >= 0xf0 || getMessageLengthFromFirstByte (*(uint8*)d) == size);
+    memcpy (allocateSpace (dataSize), d, (size_t) dataSize);
 }
 
 MidiMessage::MidiMessage (const int byte1, const double t) noexcept
    : timeStamp (t), size (1)
 {
-    preallocatedData.asBytes[0] = (uint8) byte1;
+    packedData.asBytes[0] = (uint8) byte1;
 
     // check that the length matches the data..
     jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 1);
@@ -111,8 +122,8 @@ MidiMessage::MidiMessage (const int byte1, const double t) noexcept
 MidiMessage::MidiMessage (const int byte1, const int byte2, const double t) noexcept
    : timeStamp (t), size (2)
 {
-    preallocatedData.asBytes[0] = (uint8) byte1;
-    preallocatedData.asBytes[1] = (uint8) byte2;
+    packedData.asBytes[0] = (uint8) byte1;
+    packedData.asBytes[1] = (uint8) byte2;
 
     // check that the length matches the data..
     jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 2);
@@ -121,9 +132,9 @@ MidiMessage::MidiMessage (const int byte1, const int byte2, const double t) noex
 MidiMessage::MidiMessage (const int byte1, const int byte2, const int byte3, const double t) noexcept
    : timeStamp (t), size (3)
 {
-    preallocatedData.asBytes[0] = (uint8) byte1;
-    preallocatedData.asBytes[1] = (uint8) byte2;
-    preallocatedData.asBytes[2] = (uint8) byte3;
+    packedData.asBytes[0] = (uint8) byte1;
+    packedData.asBytes[1] = (uint8) byte2;
+    packedData.asBytes[2] = (uint8) byte3;
 
     // check that the length matches the data..
     jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 3);
@@ -132,29 +143,19 @@ MidiMessage::MidiMessage (const int byte1, const int byte2, const int byte3, con
 MidiMessage::MidiMessage (const MidiMessage& other)
    : timeStamp (other.timeStamp), size (other.size)
 {
-    if (other.allocatedData != nullptr)
-    {
-        allocatedData.malloc ((size_t) size);
-        memcpy (allocatedData, other.allocatedData, (size_t) size);
-    }
+    if (isHeapAllocated())
+        memcpy (allocateSpace (size), other.getData(), (size_t) size);
     else
-    {
-        preallocatedData.asInt32 = other.preallocatedData.asInt32;
-    }
+        packedData.allocatedData = other.packedData.allocatedData;
 }
 
 MidiMessage::MidiMessage (const MidiMessage& other, const double newTimeStamp)
    : timeStamp (newTimeStamp), size (other.size)
 {
-    if (other.allocatedData != nullptr)
-    {
-        allocatedData.malloc ((size_t) size);
-        memcpy (allocatedData, other.allocatedData, (size_t) size);
-    }
+    if (isHeapAllocated())
+        memcpy (allocateSpace (size), other.getData(), (size_t) size);
     else
-    {
-        preallocatedData.asInt32 = other.preallocatedData.asInt32;
-    }
+        packedData.allocatedData = other.packedData.allocatedData;
 }
 
 MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const uint8 lastStatusByte,
@@ -229,16 +230,15 @@ MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const
         }
         else
         {
-            preallocatedData.asInt32 = 0;
             size = getMessageLengthFromFirstByte ((uint8) byte);
-            preallocatedData.asBytes[0] = (uint8) byte;
+            packedData.asBytes[0] = (uint8) byte;
 
             if (size > 1)
             {
-                preallocatedData.asBytes[1] = src[0];
+                packedData.asBytes[1] = src[0];
 
                 if (size > 2)
-                    preallocatedData.asBytes[2] = src[1];
+                    packedData.asBytes[2] = src[1];
             }
         }
 
@@ -246,7 +246,7 @@ MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const
     }
     else
     {
-        preallocatedData.asInt32 = 0;
+        packedData.allocatedData = nullptr;
         size = 0;
     }
 }
@@ -255,19 +255,25 @@ MidiMessage& MidiMessage::operator= (const MidiMessage& other)
 {
     if (this != &other)
     {
-        timeStamp = other.timeStamp;
-        size = other.size;
-
-        if (other.allocatedData != nullptr)
+        if (other.isHeapAllocated())
         {
-            allocatedData.malloc ((size_t) size);
-            memcpy (allocatedData, other.allocatedData, (size_t) size);
+            if (isHeapAllocated())
+                packedData.allocatedData = static_cast<uint8*> (std::realloc (packedData.allocatedData, (size_t) other.size));
+            else
+                packedData.allocatedData = static_cast<uint8*> (std::malloc ((size_t) other.size));
+
+            memcpy (packedData.allocatedData, other.packedData.allocatedData, (size_t) other.size);
         }
         else
         {
-            allocatedData.free();
-            preallocatedData.asInt32 = other.preallocatedData.asInt32;
+            if (isHeapAllocated())
+                std::free (packedData.allocatedData);
+
+            packedData.allocatedData = other.packedData.allocatedData;
         }
+
+        timeStamp = other.timeStamp;
+        size = other.size;
     }
 
     return *this;
@@ -277,36 +283,36 @@ MidiMessage& MidiMessage::operator= (const MidiMessage& other)
 MidiMessage::MidiMessage (MidiMessage&& other) noexcept
    : timeStamp (other.timeStamp), size (other.size)
 {
-    if (other.allocatedData != nullptr)
-        allocatedData.swapWith (other.allocatedData);
-    else
-        preallocatedData.asInt32 = other.preallocatedData.asInt32;
+    packedData.allocatedData = other.packedData.allocatedData;
+    other.size = 0;
 }
 
 MidiMessage& MidiMessage::operator= (MidiMessage&& other) noexcept
 {
-    jassert (this != &other); // shouldn't be possible
-
+    packedData.allocatedData = other.packedData.allocatedData;
     timeStamp = other.timeStamp;
     size = other.size;
-    allocatedData.swapWith (other.allocatedData);
-    preallocatedData.asInt32 = other.preallocatedData.asInt32;
-
+    other.size = 0;
     return *this;
 }
 #endif
 
-MidiMessage::~MidiMessage() {}
+MidiMessage::~MidiMessage() noexcept
+{
+    if (isHeapAllocated())
+        std::free (packedData.allocatedData);
+}
 
 uint8* MidiMessage::allocateSpace (int bytes)
 {
-    if (bytes > 4)
+    if (bytes > (int) sizeof (packedData))
     {
-        allocatedData.malloc ((size_t) bytes);
-        return allocatedData;
+        uint8* d = static_cast<uint8*> (std::malloc ((size_t) bytes));
+        packedData.allocatedData = d;
+        return d;
     }
 
-    return preallocatedData.asBytes;
+    return packedData.asBytes;
 }
 
 String MidiMessage::getDescription() const
@@ -416,7 +422,7 @@ float MidiMessage::getFloatVelocity() const noexcept
 void MidiMessage::setVelocity (const float newVelocity) noexcept
 {
     if (isNoteOnOrOff())
-        getData()[2] = MidiHelpers::floatVelocityToByte (newVelocity);
+        getData()[2] = floatValueToMidiByte (newVelocity);
 }
 
 void MidiMessage::multiplyVelocity (const float scaleFactor) noexcept
@@ -563,7 +569,7 @@ MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const
 
 MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const float velocity) noexcept
 {
-    return noteOn (channel, noteNumber, MidiHelpers::floatVelocityToByte (velocity));
+    return noteOn (channel, noteNumber, floatValueToMidiByte (velocity));
 }
 
 MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber, uint8 velocity) noexcept
@@ -577,7 +583,7 @@ MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber, uint8
 
 MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber, float velocity) noexcept
 {
-    return noteOff (channel, noteNumber, MidiHelpers::floatVelocityToByte (velocity));
+    return noteOff (channel, noteNumber, floatValueToMidiByte (velocity));
 }
 
 MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber) noexcept
@@ -722,9 +728,10 @@ MidiMessage MidiMessage::textMetaEvent (int type, StringRef text)
     header[--n] = 0xff;
 
     const size_t headerLen = sizeof (header) - n;
+    const int totalSize = (int) (headerLen + textSize);
 
-    uint8* const dest = result.allocateSpace ((int) (headerLen + textSize));
-    result.size = (int) (headerLen + textSize);
+    uint8* const dest = result.allocateSpace (totalSize);
+    result.size = totalSize;
 
     memcpy (dest, header + n, headerLen);
     memcpy (dest + headerLen, text.text.getAddress(), textSize);
@@ -1010,7 +1017,7 @@ String MidiMessage::getMidiNoteName (int note, bool useSharps, bool includeOctav
     return String();
 }
 
-double MidiMessage::getMidiNoteInHertz (int noteNumber, const double frequencyOfA) noexcept
+double MidiMessage::getMidiNoteInHertz (const int noteNumber, const double frequencyOfA) noexcept
 {
     return frequencyOfA * pow (2.0, (noteNumber - 69) / 12.0);
 }
diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.h b/modules/juce_audio_basics/midi/juce_MidiMessage.h
index 10fd0b2..bfaaa02 100644
--- a/modules/juce_audio_basics/midi/juce_MidiMessage.h
+++ b/modules/juce_audio_basics/midi/juce_MidiMessage.h
@@ -104,7 +104,7 @@ public:
     MidiMessage (const MidiMessage&, double newTimeStamp);
 
     /** Destructor. */
-    ~MidiMessage();
+    ~MidiMessage() noexcept;
 
     /** Copies this message from another one. */
     MidiMessage& operator= (const MidiMessage& other);
@@ -118,7 +118,7 @@ public:
     /** Returns a pointer to the raw midi data.
         @see getRawDataSize
     */
-    const uint8* getRawData() const noexcept            { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; }
+    const uint8* getRawData() const noexcept            { return getData(); }
 
     /** Returns the number of bytes of data in the message.
         @see getRawData
@@ -851,7 +851,7 @@ public:
 
         The value passed in must be 0x80 or higher.
     */
-    static int getMessageLengthFromFirstByte (const uint8 firstByte) noexcept;
+    static int getMessageLengthFromFirstByte (uint8 firstByte) noexcept;
 
     //==============================================================================
     /** Returns the name of a midi note number.
@@ -878,7 +878,7 @@ public:
         The frequencyOfA parameter is an optional frequency for 'A', normally 440-444Hz for concert pitch.
         @see getMidiNoteName
     */
-    static double getMidiNoteInHertz (int noteNumber, const double frequencyOfA = 440.0) noexcept;
+    static double getMidiNoteInHertz (int noteNumber, double frequencyOfA = 440.0) noexcept;
 
     /** Returns true if the given midi note number is a black key. */
     static bool isMidiNoteBlack (int noteNumber) noexcept;
@@ -905,21 +905,29 @@ public:
     */
     static const char* getControllerName (int controllerNumber);
 
+    /** Converts a floating-point value between 0 and 1 to a MIDI 7-bit value between 0 and 127. */
+    static uint8 floatValueToMidiByte (float valueBetween0and1) noexcept;
+
+    /** Converts a pitchbend value in semitones to a MIDI 14-bit pitchwheel position value. */
+    static uint16 pitchbendToPitchwheelPos (float pitchbendInSemitones,
+                                            float pitchbendRangeInSemitones) noexcept;
+
 private:
     //==============================================================================
-    double timeStamp;
-    HeapBlock<uint8> allocatedData;
-    int size;
-
    #ifndef DOXYGEN
-    union
+    union PackedData
     {
-        uint8 asBytes[4];
-        uint32 asInt32;
-    } preallocatedData;
+        uint8* allocatedData;
+        uint8 asBytes[sizeof (uint8*)];
+    };
+
+    PackedData packedData;
+    double timeStamp;
+    int size;
    #endif
 
-    inline uint8* getData() noexcept   { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; }
+    inline bool isHeapAllocated() const noexcept  { return size > (int) sizeof (packedData); }
+    inline uint8* getData() const noexcept        { return isHeapAllocated() ? packedData.allocatedData : (uint8*) packedData.asBytes; }
     uint8* allocateSpace (int);
 };
 
diff --git a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h
index 2f55e2d..3e04245 100644
--- a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h
+++ b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h
@@ -48,6 +48,18 @@ public:
     /** Replaces this sequence with another one. */
     MidiMessageSequence& operator= (const MidiMessageSequence&);
 
+   #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
+    MidiMessageSequence (MidiMessageSequence&& other) noexcept
+        : list (static_cast<OwnedArray<MidiEventHolder>&&> (other.list))
+    {}
+
+    MidiMessageSequence& operator= (MidiMessageSequence&& other) noexcept
+    {
+        list = static_cast<OwnedArray<MidiEventHolder>&&> (other.list);
+        return *this;
+    }
+   #endif
+
     /** Destructor. */
     ~MidiMessageSequence();
 
diff --git a/modules/juce_audio_basics/mpe/juce_MPEZone.h b/modules/juce_audio_basics/mpe/juce_MPEZone.h
index d9d6c3e..c677d3c 100644
--- a/modules/juce_audio_basics/mpe/juce_MPEZone.h
+++ b/modules/juce_audio_basics/mpe/juce_MPEZone.h
@@ -69,27 +69,35 @@ struct JUCE_API  MPEZone
              int perNotePitchbendRange = 48,
              int masterPitchbendRange = 2) noexcept;
 
-    /* Returns the MIDI master channel of this zone. */
+    /* Returns the MIDI master channel number (in the range 1-16) of this zone. */
     int getMasterChannel() const noexcept;
 
     /** Returns the number of note channels occupied by this zone. */
     int getNumNoteChannels() const noexcept;
 
-    /* Returns the MIDI channel number of the lowest-numbered note channel of this zone.  */
+    /* Returns the MIDI channel number (in the range 1-16) of the
+       lowest-numbered note channel of this zone.
+    */
     int getFirstNoteChannel() const noexcept;
 
-    /* Returns the MIDI channel number of the highest-numbered note channel of this zone.  */
+    /* Returns the MIDI channel number (in the range 1-16) of the
+       highest-numbered note channel of this zone.
+    */
     int getLastNoteChannel() const noexcept;
 
-    /** Returns the MIDI channel numbers of the note channels of this zone as a Range. */
+    /** Returns the MIDI channel numbers (in the range 1-16) of the
+        note channels of this zone as a Range.
+    */
     Range<int> getNoteChannelRange() const noexcept;
 
     /** Returns true if the MIDI channel (in the range 1-16) is used by this zone
-        either as a note channel or as the master channel; false otherwise. */
+        either as a note channel or as the master channel; false otherwise.
+    */
     bool isUsingChannel (int channel) const noexcept;
 
     /** Returns true if the MIDI channel (in the range 1-16) is used by this zone
-        as a note channel; false otherwise. */
+        as a note channel; false otherwise.
+    */
     bool isUsingChannelAsNoteChannel (int channel) const noexcept;
 
     /** Returns the per-note pitchbend range in semitones set for this zone. */
diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
index e70ae7c..25678d7 100755
--- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
+++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
@@ -346,8 +346,8 @@ String AudioDeviceManager::initialiseFromXML (const XmlElement& xml,
             currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName();
     }
 
-    setup.bufferSize = xml.getIntAttribute ("audioDeviceBufferSize");
-    setup.sampleRate = xml.getDoubleAttribute ("audioDeviceRate");
+    setup.bufferSize = xml.getIntAttribute ("audioDeviceBufferSize", setup.bufferSize);
+    setup.sampleRate = xml.getDoubleAttribute ("audioDeviceRate", setup.sampleRate);
 
     setup.inputChannels .parseString (xml.getStringAttribute ("audioDeviceInChans",  "11"), 2);
     setup.outputChannels.parseString (xml.getStringAttribute ("audioDeviceOutChans", "11"), 2);
diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h
index 66d6b32..a342c9c 100644
--- a/modules/juce_audio_devices/juce_audio_devices.h
+++ b/modules/juce_audio_devices/juce_audio_devices.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_devices
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE audio and MIDI I/O device classes
   description:      Classes to play and record from audio and MIDI I/O devices
   website:          http://www.juce.com/juce
diff --git a/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h b/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h
index 62eb534..28ba667 100644
--- a/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h
+++ b/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h
@@ -71,8 +71,7 @@ public:
                     // the normal message, handle it now..
                     if (*d >= 0xf8 && *d <= 0xfe)
                     {
-                        const MidiMessage m (*d++, time);
-                        callback.handleIncomingMidiMessage (input, m);
+                        callback.handleIncomingMidiMessage (input, MidiMessage (*d++, time));
                         --numBytes;
                     }
                     else
@@ -83,7 +82,15 @@ public:
                         data[len++] = *d++;
                         --numBytes;
 
-                        if (len >= MidiMessage::getMessageLengthFromFirstByte (data[0]))
+                        const uint8 firstByte = data[0];
+
+                        if (firstByte < 0x80 || firstByte == 0xf7)
+                        {
+                            len = 0;
+                            break;   // ignore this malformed MIDI message..
+                        }
+
+                        if (len >= MidiMessage::getMessageLengthFromFirstByte (firstByte))
                             break;
                     }
                 }
diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp
index f0da980..d4734a0 100644
--- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp
+++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp
@@ -287,7 +287,14 @@ public:
         return r;
     }
 
-    int getDefaultBufferSize() override         { return 256; }
+    int getDefaultBufferSize() override
+    {
+       #if TARGET_IPHONE_SIMULATOR
+        return 512;
+       #else
+        return 256;
+       #endif
+    }
 
     String open (const BigInteger& inputChannelsWanted,
                  const BigInteger& outputChannelsWanted,
@@ -682,14 +689,20 @@ private:
         UInt32 framesPerSlice;
         UInt32 dataSize = sizeof (framesPerSlice);
 
-        if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &framesPerSlice, &dataSize) == noErr
-               && dataSize == sizeof (framesPerSlice) && framesPerSlice != actualBufferSize)
+        AudioUnitInitialize (audioUnit);
+
+        AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice,
+                              kAudioUnitScope_Global, 0, &actualBufferSize, sizeof (actualBufferSize));
+
+
+        if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice,
+                                  kAudioUnitScope_Global, 0, &framesPerSlice, &dataSize) == noErr
+            && dataSize == sizeof (framesPerSlice) && static_cast<int> (framesPerSlice) != actualBufferSize)
         {
-            actualBufferSize = framesPerSlice;
+            actualBufferSize = static_cast<int> (framesPerSlice);
             prepareFloatBuffers (actualBufferSize);
         }
 
-        AudioUnitInitialize (audioUnit);
         return true;
     }
 
diff --git a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp
index 1a06a89..0285726 100644
--- a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp
+++ b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp
@@ -290,6 +290,8 @@ public:
             }
         }
 
+        updateActivePorts();
+
         return lastError;
     }
 
diff --git a/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm b/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm
index 1ef5bd3..a67d3cf 100644
--- a/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm
+++ b/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm
@@ -137,8 +137,7 @@ AudioCDReader* AudioCDReader::createReaderForCD (const int index)
 AudioCDReader::AudioCDReader (const File& volume)
    : AudioFormatReader (0, "CD Audio"),
      volumeDir (volume),
-     currentReaderTrack (-1),
-     reader (0)
+     currentReaderTrack (-1)
 {
      sampleRate = 44100.0;
      bitsPerSample = 16;
diff --git a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp
index cbe963f..542b3db 100644
--- a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp
+++ b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp
@@ -365,17 +365,18 @@ public:
     void updateSampleRates()
     {
         // find a list of sample rates..
-        const int possibleSampleRates[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };
         Array<double> newRates;
 
         if (asioObject != nullptr)
         {
+            const int possibleSampleRates[] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 };
+
             for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index)
                 if (asioObject->canSampleRate ((double) possibleSampleRates[index]) == 0)
                     newRates.add ((double) possibleSampleRates[index]);
         }
 
-        if (newRates.size() == 0)
+        if (newRates.isEmpty())
         {
             double cr = getSampleRate();
             JUCE_ASIO_LOG ("No sample rates supported - current rate: " + String ((int) cr));
diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
index 2afebbe..dd3d525 100644
--- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
+++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
@@ -24,6 +24,66 @@
 
 #if JUCE_USE_FLAC
 
+}
+
+#if defined _WIN32 && !defined __CYGWIN__
+ #include <io.h>
+#else
+ #include <unistd.h>
+#endif
+
+#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
+ #include <sys/types.h> /* for off_t */
+#endif
+
+#if HAVE_INTTYPES_H
+ #define __STDC_FORMAT_MACROS
+ #include <inttypes.h>
+#endif
+
+#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__
+ #include <io.h> /* for _setmode(), chmod() */
+ #include <fcntl.h> /* for _O_BINARY */
+#else
+ #include <unistd.h> /* for chown(), unlink() */
+#endif
+
+#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
+ #if defined __BORLANDC__
+  #include <utime.h> /* for utime() */
+ #else
+  #include <sys/utime.h> /* for utime() */
+ #endif
+#else
+ #include <sys/types.h> /* some flavors of BSD (like OS X) require this to get time_t */
+ #include <utime.h> /* for utime() */
+#endif
+
+#if defined _MSC_VER
+ #if _MSC_VER >= 1600
+  #include <stdint.h>
+ #else
+  #include <limits.h>
+ #endif
+#endif
+
+#ifdef _WIN32
+ #include <stdio.h>
+ #include <sys/stat.h>
+ #include <stdarg.h>
+ #include <windows.h>
+#endif
+
+#ifdef DEBUG
+ #include <assert.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+namespace juce
+{
+
 namespace FlacNamespace
 {
 #if JUCE_INCLUDE_FLAC_CODE || ! defined (JUCE_INCLUDE_FLAC_CODE)
@@ -62,7 +122,7 @@ namespace FlacNamespace
   #define FLAC__HAS_X86INTRIN 1
  #endif
 
- #undef __STDC_LIMIT_MACROS
+#undef __STDC_LIMIT_MACROS
  #define __STDC_LIMIT_MACROS 1
  #define flac_max jmax
  #define flac_min jmin
diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
index 1351a45..5253597 100644
--- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
+++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
@@ -656,7 +656,10 @@ namespace WavFileHelpers
 
                 if (infoLength > 0)
                 {
-                    infoLength = jlimit ((int64) 0, infoLength, (int64) input.readInt());
+                    infoLength = jmin (infoLength, (int64) input.readInt());
+
+                    if (infoLength <= 0)
+                        return;
 
                     for (int i = 0; i < numElementsInArray (types); ++i)
                     {
diff --git a/modules/juce_audio_formats/juce_audio_formats.h b/modules/juce_audio_formats/juce_audio_formats.h
index 4990620..ee94cee 100644
--- a/modules/juce_audio_formats/juce_audio_formats.h
+++ b/modules/juce_audio_formats/juce_audio_formats.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_formats
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE audio file format codecs
   description:      Classes for reading and writing various audio file formats.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h
similarity index 64%
copy from modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp
copy to modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h
index 7843aa4..db3ae30 100644
--- a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp
+++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h
@@ -2,7 +2,7 @@
   ==============================================================================
 
    This file is part of the JUCE library.
-   Copyright (c) 2015 - ROLI Ltd.
+   Copyright (c) 2016 - ROLI Ltd.
 
    Permission is granted to use this software under the terms of either:
    a) the GPL v2 (or any later version)
@@ -22,15 +22,20 @@
   ==============================================================================
 */
 
-#if JUCE_WINDOWS || JUCE_LINUX || JUCE_MAC
+#ifndef JUCE_AAX_MODIFIER_INJECTOR_H_INCLUDED
+#define JUCE_AAX_MODIFIER_INJECTOR_H_INCLUDED
 
-SystemTrayIconComponent::SystemTrayIconComponent()
+struct ModifierKeyProvider
 {
-    addToDesktop (0);
-}
+    virtual ~ModifierKeyProvider() {}
+    virtual int getWin32Modifiers() const = 0;
+};
 
-SystemTrayIconComponent::~SystemTrayIconComponent()
+struct ModifierKeyReceiver
 {
-}
+    virtual ~ModifierKeyReceiver() {}
+    virtual void setModifierKeyProvider (ModifierKeyProvider* provider) = 0;
+    virtual void removeModifierKeyProvider () = 0;
+};
 
-#endif
+#endif
\ No newline at end of file
diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
index 5ddbfed..d6722ae 100644
--- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
+++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
@@ -93,22 +93,30 @@
 
 #undef check
 
+namespace juce
+{
+ #include "juce_AAX_Modifier_Injector.h"
+}
+
 const int32_t juceChunkType = 'juce';
 const int maxAAXChannels = 8;
 
-JUCE_DEFINE_WRAPPER_TYPE (wrapperType_AAX);
-
 //==============================================================================
 struct AAXClasses
 {
-    static void check (AAX_Result result)
+    static int32 getAAXParamHash (AAX_CParamID paramID) noexcept
     {
-        jassert (result == AAX_SUCCESS); ignoreUnused (result);
+        int32 result = 0;
+
+        while (*paramID != 0)
+            result = (31 * result) + (*paramID++);
+
+        return result;
     }
 
-    static int getParamIndexFromID (AAX_CParamID paramID) noexcept
+    static void check (AAX_Result result)
     {
-        return atoi (paramID);
+        jassert (result == AAX_SUCCESS); ignoreUnused (result);
     }
 
     static bool isBypassParam (AAX_CParamID paramID) noexcept
@@ -323,7 +331,7 @@ struct AAXClasses
    #endif
 
     //==============================================================================
-    class JuceAAX_GUI   : public AAX_CEffectGUI
+    class JuceAAX_GUI   : public AAX_CEffectGUI, public ModifierKeyProvider
     {
     public:
         JuceAAX_GUI() {}
@@ -356,6 +364,9 @@ struct AAXClasses
                 {
                     component->setVisible (true);
                     component->addToDesktop (0, nativeViewToAttachTo);
+
+                    if (ModifierKeyReceiver* modReceiver = dynamic_cast<ModifierKeyReceiver*> (component->getPeer()))
+                        modReceiver->setModifierKeyProvider (this);
                 }
             }
         }
@@ -366,6 +377,9 @@ struct AAXClasses
             {
                 JUCE_AUTORELEASEPOOL
                 {
+                    if (ModifierKeyReceiver* modReceiver = dynamic_cast<ModifierKeyReceiver*> (component->getPeer()))
+                        modReceiver->removeModifierKeyProvider();
+
                     component->removeFromDesktop();
                     component = nullptr;
                 }
@@ -409,7 +423,41 @@ struct AAXClasses
             return AAX_ERROR_NULL_OBJECT;
         }
 
+        int getWin32Modifiers() const override
+        {
+            int modifierFlags = 0;
+
+            if (const AAX_IViewContainer* viewContainer = GetViewContainer())
+            {
+                uint32 aaxViewMods = 0;
+                const_cast<AAX_IViewContainer*>(viewContainer)->GetModifiers (&aaxViewMods);
+
+                if ((aaxViewMods & AAX_eModifiers_Shift) != 0) modifierFlags |= ModifierKeys::shiftModifier;
+                if ((aaxViewMods & AAX_eModifiers_Alt )  != 0) modifierFlags |= ModifierKeys::altModifier;
+            }
+
+            return modifierFlags;
+        }
+
     private:
+        //==============================================================================
+        inline int getParamIndexFromID (AAX_CParamID paramID) const noexcept
+        {
+            if (const JuceAAX_Processor* params = dynamic_cast<const JuceAAX_Processor*> (GetEffectParameters()))
+                return params->getParamIndexFromID (paramID);
+
+            return -1;
+        }
+
+        inline AAX_CParamID getAAXParamIDFromJuceIndex (int index) const noexcept
+        {
+            if (const JuceAAX_Processor* params = dynamic_cast<const JuceAAX_Processor*> (GetEffectParameters()))
+                return params->getAAXParamIDFromJuceIndex (index);
+
+            return nullptr;
+        }
+
+        //==============================================================================
         struct ContentWrapperComponent  : public Component
         {
             ContentWrapperComponent (JuceAAX_GUI& gui, AudioProcessor& plugin)
@@ -449,11 +497,12 @@ struct AAXClasses
                 {
                     const int parameterIndex = pluginEditor->getControlParameterIndex (*e.eventComponent);
 
-                    if (parameterIndex >= 0)
+                    if (AAX_CParamID aaxParamID = owner.getAAXParamIDFromJuceIndex (parameterIndex))
                     {
                         uint32_t mods = 0;
                         vc->GetModifiers (&mods);
-                        (vc->*method) (IndexAsParamID (parameterIndex), mods);
+
+                        (vc->*method) (aaxParamID, mods);
                     }
                 }
             }
@@ -498,7 +547,7 @@ struct AAXClasses
     {
     public:
         JuceAAX_Processor()  : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_AAX)),
-                               busUtils (*pluginInstance, false, maxAAXChannels),
+                               isPrepared (false), busUtils (*pluginInstance, false, maxAAXChannels),
                                sampleRate (0), lastBufferSize (1024), maxBufferSize (1024),
                                hasSidechain (false)
         {
@@ -512,10 +561,21 @@ struct AAXClasses
 
         static AAX_CEffectParameters* AAX_CALLBACK Create()
         {
-            JUCE_DECLARE_WRAPPER_TYPE (wrapperType_AAX);
+            PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX;
             return new JuceAAX_Processor();
         }
 
+        AAX_Result Uninitialize() override
+        {
+            if (isPrepared && pluginInstance != nullptr)
+            {
+                isPrepared = false;
+                pluginInstance->releaseResources();
+            }
+
+            return AAX_CEffectParameters::Uninitialize();
+        }
+
         AAX_Result EffectInit() override
         {
             AAX_Result err;
@@ -606,7 +666,7 @@ struct AAXClasses
             const int numParameters = pluginInstance->getNumParameters();
 
             for (int i = 0; i < numParameters; ++i)
-                SetParameterNormalizedValue (IndexAsParamID (i), (double) pluginInstance->getParameter(i));
+                SetParameterNormalizedValue (getAAXParamIDFromJuceIndex (i), (double) pluginInstance->getParameter(i));
 
             return AAX_SUCCESS;
         }
@@ -844,7 +904,7 @@ struct AAXClasses
 
         void audioProcessorParameterChanged (AudioProcessor* /*processor*/, int parameterIndex, float newValue) override
         {
-            SetParameterNormalizedValue (IndexAsParamID (parameterIndex), (double) newValue);
+            SetParameterNormalizedValue (getAAXParamIDFromJuceIndex (parameterIndex), (double) newValue);
         }
 
         void audioProcessorChanged (AudioProcessor* processor) override
@@ -855,12 +915,12 @@ struct AAXClasses
 
         void audioProcessorParameterChangeGestureBegin (AudioProcessor* /*processor*/, int parameterIndex) override
         {
-            TouchParameter (IndexAsParamID (parameterIndex));
+            TouchParameter (getAAXParamIDFromJuceIndex (parameterIndex));
         }
 
         void audioProcessorParameterChangeGestureEnd (AudioProcessor* /*processor*/, int parameterIndex) override
         {
-            ReleaseParameter (IndexAsParamID (parameterIndex));
+            ReleaseParameter (getAAXParamIDFromJuceIndex (parameterIndex));
         }
 
         AAX_Result NotificationReceived (AAX_CTypeID type, const void* data, uint32_t size) override
@@ -935,6 +995,8 @@ struct AAXClasses
         bool supportsSidechain() const noexcept { return hasSidechain; };
 
     private:
+        friend class JuceAAX_GUI;
+
         void process (float* const* channels, const int numChans, const int bufferSize,
                       const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodesOut)
         {
@@ -1030,14 +1092,27 @@ struct AAXClasses
         void addAudioProcessorParameters()
         {
             AudioProcessor& audioProcessor = getPluginInstance();
+
             const int numParameters = audioProcessor.getNumParameters();
 
+           #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+            const bool usingManagedParameters = false;
+           #else
+            const bool usingManagedParameters = (audioProcessor.getParameters().size() == numParameters);
+           #endif
+
             for (int parameterIndex = 0; parameterIndex < numParameters; ++parameterIndex)
             {
+                aaxParamIDs.add (usingManagedParameters ? audioProcessor.getParameterID (parameterIndex)
+                                                        : String (parameterIndex));
+
                 AAX_CString paramName (audioProcessor.getParameterName (parameterIndex, 31).toRawUTF8());
+                AAX_CParamID paramID = aaxParamIDs.getReference (parameterIndex).getCharPointer();
+
+                paramMap.set (AAXClasses::getAAXParamHash (paramID), parameterIndex);
 
                 AAX_IParameter* parameter
-                    = new AAX_CParameter<float> (IndexAsParamID (parameterIndex),
+                    = new AAX_CParameter<float> (paramID,
                                                  paramName,
                                                  audioProcessor.getParameterDefaultValue (parameterIndex),
                                                  AAX_CLinearTaperDelegate<float, 0>(),
@@ -1064,6 +1139,7 @@ struct AAXClasses
         AAX_Result preparePlugin()
         {
             AudioProcessor& audioProcessor = getPluginInstance();
+            bool hasSomethingChanged = false;
 
            #if JucePlugin_IsMidiEffect
             // MIDI effect plug-ins do not support any audio channels
@@ -1081,39 +1157,74 @@ struct AAXClasses
 
             if (  (inputSet  == AudioChannelSet::disabled() && inputStemFormat  != AAX_eStemFormat_None)
                || (outputSet == AudioChannelSet::disabled() && outputStemFormat != AAX_eStemFormat_None))
+            {
+                if (isPrepared)
+                {
+                    isPrepared = false;
+                    audioProcessor.releaseResources();
+                }
+
                 return AAX_ERROR_UNIMPLEMENTED;
+            }
+
 
             bool success = true;
 
             if (busUtils.getBusCount (true) > 0)
-                success = audioProcessor.setPreferredBusArrangement (true, 0, inputSet);
+                success = setPreferredBusArrangement (busUtils, true, 0, inputSet, hasSomethingChanged);
 
             if (success && busUtils.getBusCount (false) > 0)
-                success = audioProcessor.setPreferredBusArrangement (false, 0, outputSet);
+                success = setPreferredBusArrangement (busUtils, false, 0, outputSet, hasSomethingChanged);
 
             // This should never happen as the plugin reported that this layout is supported
             jassert (success);
 
-            hasSidechain = enableAuxBusesForCurrentFormat (busUtils, inputSet, outputSet);
-            if (hasSidechain)
+            hasSidechain = enableAuxBusesForCurrentFormat (busUtils, inputSet, outputSet, hasSomethingChanged);
+            if (hasSidechain && hasSomethingChanged)
                 sideChainBuffer.realloc (static_cast<size_t> (maxBufferSize));
 
             // recheck the format
             if ( (busUtils.getBusCount (true)  > 0 && busUtils.getChannelSet (true, 0)  != inputSet)
               || (busUtils.getBusCount (false) > 0 && busUtils.getChannelSet (false, 0) != outputSet)
               || (hasSidechain && busUtils.getNumChannels(true, 1) != 1))
+            {
+                if (isPrepared)
+                {
+                    isPrepared = false;
+                    audioProcessor.releaseResources();
+                }
+
                 return AAX_ERROR_UNIMPLEMENTED;
+            }
 
-            rebuildChannelMapArrays (true);
-            rebuildChannelMapArrays (false);
+            if (hasSomethingChanged)
+            {
+                rebuildChannelMapArrays (true);
+                rebuildChannelMapArrays (false);
+            }
            #endif
 
-            audioProcessor.setRateAndBufferSizeDetails (sampleRate, maxBufferSize);
-            audioProcessor.prepareToPlay (sampleRate, lastBufferSize);
-            maxBufferSize = lastBufferSize;
+            hasSomethingChanged = (sampleRate != audioProcessor.getSampleRate()
+                             || maxBufferSize != lastBufferSize
+                             || hasSomethingChanged);
+
+            if (hasSomethingChanged || (! isPrepared))
+            {
+                if (isPrepared)
+                {
+                    isPrepared = false;
+                    audioProcessor.releaseResources();
+                }
+
+                audioProcessor.setRateAndBufferSizeDetails (sampleRate, lastBufferSize);
+                audioProcessor.prepareToPlay (sampleRate, lastBufferSize);
+                maxBufferSize = lastBufferSize;
+            }
 
             check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples()));
 
+            isPrepared = true;
+
             return AAX_SUCCESS;
         }
 
@@ -1141,9 +1252,24 @@ struct AAXClasses
             }
         }
 
+        //==============================================================================
+        inline int getParamIndexFromID (AAX_CParamID paramID) const noexcept
+        {
+            return paramMap [AAXClasses::getAAXParamHash (paramID)];
+        }
+
+        inline AAX_CParamID getAAXParamIDFromJuceIndex (int index) const noexcept
+        {
+            if (! isPositiveAndBelow (index, aaxParamIDs.size())) return nullptr;
+
+            return aaxParamIDs.getReference (index).getCharPointer();
+        }
+
+        //==============================================================================
         ScopedJuceInitialiser_GUI libraryInitialiser;
 
         ScopedPointer<AudioProcessor> pluginInstance;
+        bool isPrepared;
         PluginBusUtilities busUtils;
         MidiBuffer midiBuffer;
         Array<float*> channelList;
@@ -1154,6 +1280,9 @@ struct AAXClasses
         HeapBlock<float> sideChainBuffer;
         Array<int> inputLayoutMap, outputLayoutMap;
 
+        Array<String> aaxParamIDs;
+        HashMap<int32, int> paramMap;
+
         struct ChunkMemoryBlock  : public ReferenceCountedObject
         {
             juce::MemoryBlock data;
@@ -1174,36 +1303,6 @@ struct AAXClasses
     };
 
     //==============================================================================
-    struct IndexAsParamID
-    {
-        inline explicit IndexAsParamID (int i) noexcept : index (i) {}
-
-        operator AAX_CParamID() noexcept
-        {
-            jassert (index >= 0);
-
-            char* t = name + sizeof (name);
-            *--t = 0;
-            int v = index;
-
-            do
-            {
-                *--t = (char) ('0' + (v % 10));
-                v /= 10;
-
-            } while (v > 0);
-
-            return static_cast<AAX_CParamID> (t);
-        }
-
-    private:
-        int index;
-        char name[32];
-
-        JUCE_DECLARE_NON_COPYABLE (IndexAsParamID)
-    };
-
-    //==============================================================================
     struct AAXFormatConfiguration
     {
         AAXFormatConfiguration() noexcept
@@ -1245,7 +1344,8 @@ struct AAXClasses
     }
 
     static bool enableAuxBusesForCurrentFormat (PluginBusUtilities& busUtils, const AudioChannelSet& inputLayout,
-                                                                              const AudioChannelSet& outputLayout)
+                                                                              const AudioChannelSet& outputLayout,
+                                                                              bool& hasSomethingChanged)
     {
         const int numOutBuses = busUtils.getBusCount (false);
         const int numInputBuses = busUtils.getBusCount(true);
@@ -1263,7 +1363,7 @@ struct AAXClasses
                 if (layout == AudioChannelSet::disabled())
                 {
                     layout = busUtils.getDefaultLayoutForBus (false, busIdx);
-                    busUtils.processor.setPreferredBusArrangement (false, busIdx, layout);
+                    setPreferredBusArrangement (busUtils, false, busIdx, layout, hasSomethingChanged);
                 }
             }
 
@@ -1271,15 +1371,17 @@ struct AAXClasses
             bool success = true;
 
             if (numInputBuses > 0)
-                success = busUtils.processor.setPreferredBusArrangement (true, 0, inputLayout);
+                success = setPreferredBusArrangement (busUtils, true, 0, inputLayout, hasSomethingChanged);
 
             if (success)
-                success = busUtils.processor.setPreferredBusArrangement (false, 0, outputLayout);
+                success = setPreferredBusArrangement (busUtils, false, 0, outputLayout, hasSomethingChanged);
 
             // was the above successful
             if (success && (numInputBuses == 0 || busUtils.getChannelSet (true,  0) == inputLayout)
                         && busUtils.getChannelSet (false, 0) == outputLayout)
                 layoutRestorer.release();
+            else
+                hasSomethingChanged = true;
         }
 
         // does the plug-in have side-chain support? Check the following:
@@ -1293,10 +1395,12 @@ struct AAXClasses
 
             const AudioChannelSet set = busUtils.getDefaultLayoutForChannelNumAndBus (true, 1, 1);
             if (! set.isDisabled())
-                hasSidechain = busUtils.processor.setPreferredBusArrangement (true, 1, set);
+                hasSidechain = setPreferredBusArrangement (busUtils, true, 1, set, hasSomethingChanged);
 
             if (! hasSidechain)
-                success = busUtils.processor.setPreferredBusArrangement (true, 1, AudioChannelSet::disabled());
+                success = setPreferredBusArrangement (busUtils, true, 1,
+                                                      AudioChannelSet::disabled(),
+                                                      hasSomethingChanged);
 
             // AAX requires your processor's first sidechain to be either mono or that
             // it can be disabled
@@ -1305,7 +1409,9 @@ struct AAXClasses
             // disable all other input buses
             for (int busIdx = 2; busIdx < numInputBuses; ++busIdx)
             {
-                success = busUtils.processor.setPreferredBusArrangement (true, busIdx, AudioChannelSet::disabled());
+                success = setPreferredBusArrangement (busUtils, true, busIdx,
+                                                      AudioChannelSet::disabled(),
+                                                      hasSomethingChanged);
 
                 // AAX can only have a single side-chain input. Therefore, your processor must either
                 // only have a single side-chain input or allow disabling all other side-chains
@@ -1315,21 +1421,34 @@ struct AAXClasses
             if (hasSidechain)
             {
                 if (busUtils.getBusCount (false) == 0 || busUtils.getBusCount (true) == 0 ||
-                   (busUtils.getChannelSet (true, 0)  == inputLayout && busUtils.getChannelSet (false, 0) == outputLayout))
+                   (busUtils.getChannelSet (true, 0) == inputLayout && busUtils.getChannelSet (false, 0) == outputLayout))
                     return true;
 
                 // restore the old layout
                 if (busUtils.getBusCount(true) > 0)
-                    busUtils.processor.setPreferredBusArrangement (true,  0, inputLayout);
+                    setPreferredBusArrangement (busUtils, true,  0, inputLayout, hasSomethingChanged);
 
                 if (busUtils.getBusCount (false) > 0)
-                    busUtils.processor.setPreferredBusArrangement (false, 0, outputLayout);
+                    setPreferredBusArrangement (busUtils, false, 0, outputLayout, hasSomethingChanged);
             }
         }
 
         return false;
     }
 
+    // wrap setPreferredBusArrangement calls with this to prevent excessive calls to the plug-in
+    static bool setPreferredBusArrangement (PluginBusUtilities& busUtils, bool isInput, int busIdx,
+                                                                          const AudioChannelSet& layout,
+                                                                          bool& didChangePlugin)
+    {
+        // no need to do anything
+        if (busUtils.getChannelSet (isInput, busIdx) == layout)
+            return true;
+
+        didChangePlugin = true;
+        return busUtils.processor.setPreferredBusArrangement (isInput, busIdx, layout);
+    }
+
     //==============================================================================
     static void createDescriptor (AAX_IComponentDescriptor& desc, int configIndex, PluginBusUtilities& busUtils,
                                   const AudioChannelSet& inputLayout, const AudioChannelSet& outputLayout,
@@ -1392,7 +1511,8 @@ struct AAXClasses
         properties->AddProperty (AAX_eProperty_SupportsSaveRestore, false);
        #endif
 
-        if (enableAuxBusesForCurrentFormat (busUtils, inputLayout, outputLayout))
+        bool ignore;
+        if (enableAuxBusesForCurrentFormat (busUtils, inputLayout, outputLayout, ignore))
         {
             check (desc.AddSideChainIn (JUCEAlgorithmIDs::sideChainBuffers));
             properties->AddProperty (AAX_eProperty_SupportsSideChainInput, true);
@@ -1427,7 +1547,7 @@ struct AAXClasses
 
     static void getPlugInDescription (AAX_IEffectDescriptor& descriptor)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_AAX);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX;
 
         ScopedPointer<AudioProcessor> plugin = createPluginFilterOfType (AudioProcessor::wrapperType_AAX);
         PluginBusUtilities busUtils (*plugin, false, maxAAXChannels);
@@ -1454,7 +1574,7 @@ struct AAXClasses
 
        #if JucePlugin_IsMidiEffect
         // MIDI effect plug-ins do not support any audio channels
-        jassert (getBusCount (true) == 0 && getBusCount (false) == 0);
+        jassert (busUtils.getBusCount (true) == 0 && busUtils.getBusCount (false) == 0);
 
         if (AAX_IComponentDescriptor* const desc = descriptor.NewComponentDescriptor())
         {
diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp
index f7d7d11..7410b86 100644
--- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp
+++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp
@@ -46,8 +46,6 @@
  #pragma clang diagnostic ignored "-Wcomment"
 #endif
 
-JUCE_DEFINE_WRAPPER_TYPE (wrapperType_RTAS);
-
 /* Note about include paths
    ------------------------
 
@@ -479,8 +477,19 @@ public:
         AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true));
         DefineMasterBypassControlIndex (bypassControlIndex);
 
-        for (int i = 0; i < juceFilter->getNumParameters(); ++i)
-            AddControl (new JucePluginControl (*juceFilter, i));
+        const int numParameters = juceFilter->getNumParameters();
+
+       #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+        const bool usingManagedParameters = false;
+       #else
+        const bool usingManagedParameters = (juceFilter->getParameters().size() == numParameters);
+       #endif
+
+        for (int i = 0; i < numParameters; ++i)
+        {
+            OSType rtasParamID = static_cast<OSType> (usingManagedParameters ? juceFilter->getParameterID (i).hashCode() : i);
+            AddControl (new JucePluginControl (*juceFilter, i, rtasParamID));
+        }
 
         // we need to do this midi log-in to get timecode, regardless of whether
         // the plugin actually uses midi...
@@ -816,14 +825,14 @@ private:
     {
     public:
         //==============================================================================
-        JucePluginControl (AudioProcessor& p, const int i)
-            : processor (p), index (i)
+        JucePluginControl (AudioProcessor& p, const int i, OSType rtasParamID)
+            : processor (p), index (i), paramID (rtasParamID)
         {
             CPluginControl::SetValue (GetDefaultValue());
         }
 
         //==============================================================================
-        OSType GetID() const            { return index + 1; }
+        OSType GetID() const            { return paramID; }
         long GetDefaultValue() const    { return floatToLong (processor.getParameterDefaultValue (index)); }
         void SetDefaultValue (long)     {}
         long GetNumSteps() const        { return processor.getParameterNumSteps (index); }
@@ -868,6 +877,7 @@ private:
         //==============================================================================
         AudioProcessor& processor;
         const int index;
+        const OSType paramID;
 
         JUCE_DECLARE_NON_COPYABLE (JucePluginControl)
     };
@@ -946,7 +956,7 @@ private:
        #if JUCE_WINDOWS
         Process::setCurrentModuleInstanceHandle (gThisModule);
        #endif
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_RTAS);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_RTAS;
         initialiseJuce_GUI();
 
         return new JucePlugInProcess();
diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp
index 1eb2acb..647346c 100644
--- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp
+++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp
@@ -35,8 +35,6 @@
 #include <juce_gui_extra/juce_gui_extra.h>
 #include <juce_audio_utils/juce_audio_utils.h>
 
-JUCE_DEFINE_WRAPPER_TYPE (wrapperType_Standalone);
-
 // You can set this flag in your build if you need to specify a different
 // standalone JUCEApplication class for your app to use. If you don't
 // set it then by default we'll just create a simple one as below.
@@ -55,7 +53,7 @@ class StandaloneFilterApp  : public JUCEApplication
 public:
     StandaloneFilterApp()
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_Standalone);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Standalone;
     }
 
     const String getApplicationName() override              { return JucePlugin_Name; }
@@ -91,10 +89,8 @@ public:
         quit();
     }
 
-private:
+protected:
     ScopedPointer<StandaloneFilterWindow> mainWindow;
 };
 
-START_JUCE_APPLICATION (StandaloneFilterApp);
-
 #endif
diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
index 60c88e3..d1f3ea0 100644
--- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
+++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
@@ -83,8 +83,8 @@ public:
         jassert (processor != nullptr); // Your createPluginFilter() function must return a valid object!
 
         // try to disable sidechain and aux buses
-        const int numInBuses  = processor->busArrangement.inputBuses.size();
-        const int numOutBuses = processor->busArrangement.inputBuses.size();
+        const int numInBuses  = processor->busArrangement.inputBuses. size();
+        const int numOutBuses = processor->busArrangement.outputBuses.size();
 
         for (int busIdx = 1; busIdx < numInBuses; ++busIdx)
             processor->setPreferredBusArrangement (true, busIdx, AudioChannelSet::disabled());
diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
index 2d9ffdf..7d67152 100644
--- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
+++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
@@ -111,8 +111,6 @@
 class JuceVSTWrapper;
 static bool recursionCheck = false;
 
-JUCE_DEFINE_WRAPPER_TYPE (wrapperType_VST);
-
 namespace juce
 {
  #if JUCE_MAC
@@ -272,11 +270,13 @@ public:
          firstProcessCallback (true),
          shouldDeleteEditor (false),
         #if JUCE_64BIT
-         useNSView (true),
+         useNSView (true)
         #else
-         useNSView (false),
+         useNSView (false)
+        #endif
+        #if ! JUCE_IOS
+         , hostWindow (0)
         #endif
-         hostWindow (0)
     {
         busUtils.init();
 
@@ -343,7 +343,9 @@ public:
                 delete filter;
                 filter = nullptr;
 
+               #if ! JUCE_IOS
                 jassert (editorComp == 0);
+               #endif
 
                 deleteTempChannels();
 
@@ -386,13 +388,13 @@ public:
     //==============================================================================
     bool getEffectName (char* name) override
     {
-        String (JucePlugin_Name).copyToUTF8 (name, 64);
+        String (JucePlugin_Name).copyToUTF8 (name, 64 + 1);
         return true;
     }
 
     bool getVendorString (char* text) override
     {
-        String (JucePlugin_Manufacturer).copyToUTF8 (text, 64);
+        String (JucePlugin_Manufacturer).copyToUTF8 (text, 64 + 1);
         return true;
     }
 
@@ -822,14 +824,14 @@ public:
     void getProgramName (char* name) override
     {
         if (filter != nullptr)
-            filter->getProgramName (filter->getCurrentProgram()).copyToUTF8 (name, 24);
+            filter->getProgramName (filter->getCurrentProgram()).copyToUTF8 (name, 24 + 1);
     }
 
     bool getProgramNameIndexed (VstInt32 /*category*/, VstInt32 index, char* text) override
     {
         if (filter != nullptr && isPositiveAndBelow (index, filter->getNumPrograms()))
         {
-            filter->getProgramName (index).copyToUTF8 (text, 24);
+            filter->getProgramName (index).copyToUTF8 (text, 24 + 1);
             return true;
         }
 
@@ -860,7 +862,7 @@ public:
         if (filter != nullptr)
         {
             jassert (isPositiveAndBelow (index, filter->getNumParameters()));
-            filter->getParameterText (index, 24).copyToUTF8 (text, 24); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
+            filter->getParameterText (index, 24).copyToUTF8 (text, 24 + 1); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
         }
     }
 
@@ -885,7 +887,7 @@ public:
         if (filter != nullptr)
         {
             jassert (isPositiveAndBelow (index, filter->getNumParameters()));
-            filter->getParameterName (index, 16).copyToUTF8 (text, 16); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
+            filter->getParameterName (index, 16).copyToUTF8 (text, 16 + 1); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
         }
     }
 
@@ -894,7 +896,7 @@ public:
         if (filter != nullptr)
         {
             jassert (isPositiveAndBelow (index, filter->getNumParameters()));
-            filter->getParameterLabel (index).copyToUTF8 (text, 24); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
+            filter->getParameterLabel (index).copyToUTF8 (text, 24 + 1); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more.
         }
     }
 
@@ -1064,8 +1066,8 @@ public:
 
         String channelName = busInfo.name + String (" ") + abbvChannelName;
 
-        channelName.copyToUTF8 (properties.label, (size_t) (kVstMaxLabelLen - 1));
-        channelName.copyToUTF8 (properties.shortLabel, (size_t) (kVstMaxShortLabelLen - 1));
+        channelName.copyToUTF8 (properties.label, (size_t) (kVstMaxLabelLen + 1));
+        channelName.copyToUTF8 (properties.shortLabel, (size_t) (kVstMaxShortLabelLen + 1));
 
         properties.flags = kVstPinUseSpeaker | kVstPinIsActive;
         properties.arrangementType = SpeakerMappings::channelSetToVstArrangementType (busInfo.channels);
@@ -1331,6 +1333,7 @@ public:
 
     void createEditorComp()
     {
+       #if ! JUCE_IOS
         if (hasShutdown || filter == nullptr)
             return;
 
@@ -1349,12 +1352,16 @@ public:
                 cEffect.flags &= ~effFlagsHasEditor;
             }
         }
+       #endif
 
         shouldDeleteEditor = false;
     }
 
     void deleteEditor (bool canDeleteLaterIfModal)
     {
+       #if JUCE_IOS
+        ignoreUnused (canDeleteLaterIfModal);
+       #else
         JUCE_AUTORELEASEPOOL
         {
             PopupMenu::dismissAllActiveMenus();
@@ -1396,6 +1403,7 @@ public:
             hostWindow = 0;
            #endif
         }
+       #endif
     }
 
     VstIntPtr dispatcher (VstInt32 opCode, VstInt32 index, VstIntPtr value, void* ptr, float opt) override
@@ -1403,6 +1411,7 @@ public:
         if (hasShutdown)
             return 0;
 
+       #if ! JUCE_IOS
         if (opCode == effEditIdle)
         {
             doIdleCallback();
@@ -1432,7 +1441,7 @@ public:
                 hostWindow = (Window) ptr;
                 Window editorWnd = (Window) editorComp->getWindowHandle();
                 XReparentWindow (display, editorWnd, hostWindow, 0, 0);
-              #else
+              #elif JUCE_MAC
                 hostWindow = attachComponentToWindowRefVST (editorComp, ptr, useNSView);
               #endif
                 editorComp->setVisible (true);
@@ -1467,10 +1476,11 @@ public:
 
             return 0;
         }
-
+       #endif
         return AudioEffectX::dispatcher (opCode, index, value, ptr, opt);
     }
 
+   #if ! JUCE_IOS
     void resizeHostWindow (int newWidth, int newHeight)
     {
         if (editorComp != nullptr)
@@ -1659,6 +1669,7 @@ public:
 
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper)
     };
+   #endif
 
     //==============================================================================
 private:
@@ -1666,8 +1677,10 @@ private:
     PluginBusUtilities busUtils;
     juce::MemoryBlock chunkMemory;
     juce::uint32 chunkMemoryTime;
+   #if ! JUCE_IOS
     ScopedPointer<EditorCompWrapper> editorComp;
     ERect editorSize;
+   #endif
     MidiBuffer midiEvents;
     VSTMidiEventList outgoingEvents;
     bool isProcessing, isBypassed, hasShutdown, isInSizeWindow, firstProcessCallback;
@@ -1680,7 +1693,7 @@ private:
     void* hostWindow;
    #elif JUCE_LINUX
     Window hostWindow;
-   #else
+   #elif JUCE_WINDOWS
     HWND hostWindow;
    #endif
 
@@ -1974,23 +1987,29 @@ namespace
 
 //==============================================================================
 // Mac startup code..
-#if JUCE_MAC
+#if JUCE_MAC || JUCE_IOS
 
     JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster);
     JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
+       #if JUCE_MAC
         initialiseMacVST();
+       #endif
+
         return pluginEntryPoint (audioMaster);
     }
 
     JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster);
     JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
+       #if JUCE_MAC
         initialiseMacVST();
+       #endif
+
         return pluginEntryPoint (audioMaster);
     }
 
@@ -2001,7 +2020,7 @@ namespace
     JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster);
     JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
         SharedMessageThread::getInstance();
         return pluginEntryPoint (audioMaster);
@@ -2010,7 +2029,7 @@ namespace
     JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster) asm ("main");
     JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
         return VSTPluginMain (audioMaster);
     }
@@ -2025,7 +2044,7 @@ namespace
 
     extern "C" __declspec (dllexport) AEffect* VSTPluginMain (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
         return pluginEntryPoint (audioMaster);
     }
@@ -2033,7 +2052,7 @@ namespace
    #ifndef JUCE_64BIT // (can't compile this on win64, but it's not needed anyway with VST2.4)
     extern "C" __declspec (dllexport) int main (audioMasterCallback audioMaster)
     {
-        JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST);
+        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;
 
         return (int) pluginEntryPoint (audioMaster);
     }
diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm
index 55370bc..929b31e 100644
--- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm
+++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm
@@ -23,6 +23,9 @@
 */
 
 #include "../../juce_core/system/juce_TargetPlatform.h"
+
+#if JUCE_MAC
+
 #include "../utility/juce_CheckSettingMacros.h"
 
 #if JucePlugin_Build_VST || JucePlugin_Build_VST3
@@ -311,3 +314,4 @@ bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView)
 } // (juce namespace)
 
 #endif
+#endif
diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
index 7dc6aa9..794f791 100644
--- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
+++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
@@ -27,7 +27,15 @@
 //==============================================================================
 #if JucePlugin_Build_VST3 && (__APPLE_CPP__ || __APPLE_CC__ || _WIN32 || _WIN64)
 
+#if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS)
+ #undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY
+ #define JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY 1
+#endif
+
 #include "../../juce_audio_processors/format_types/juce_VST3Headers.h"
+
+#undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY
+
 #include "../utility/juce_CheckSettingMacros.h"
 #include "../utility/juce_IncludeModuleHeaders.h"
 #include "../utility/juce_WindowsHooks.h"
@@ -55,8 +63,6 @@
  #endif
 #endif
 
-JUCE_DEFINE_WRAPPER_TYPE (wrapperType_VST3);
-
 namespace juce
 {
 
@@ -102,6 +108,8 @@ private:
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor)
 };
 
+class JuceVST3Component;
+
 //==============================================================================
 class JuceVST3EditController : public Vst::EditController,
                                public Vst::IMidiMapping,
@@ -109,6 +117,9 @@ class JuceVST3EditController : public Vst::EditController,
 {
 public:
     JuceVST3EditController (Vst::IHostApplication* host)
+       #if ! JUCE_FORCE_USE_LEGACY_PARAM_IDS
+        : usingManagedParameter (false)
+       #endif
     {
         if (host != nullptr)
             host->queryInterface (FUnknown::iid, (void**) &hostContext);
@@ -180,11 +191,18 @@ public:
     }
 
     //==============================================================================
+    enum InternalParameters
+    {
+        paramPreset               = 0x70727374, // 'prst'
+        paramBypass               = 0x62797073, // 'byps'
+        paramMidiControllerOffset = 0x6d636d00  // 'mdm*'
+    };
+
     struct Param  : public Vst::Parameter
     {
-        Param (AudioProcessor& p, int index)  : owner (p), paramIndex (index)
+        Param (AudioProcessor& p, int index, Vst::ParamID paramID)  : owner (p), paramIndex (index)
         {
-            info.id = (Vst::ParamID) index;
+            info.id = paramID;
             toString128 (info.title, p.getParameterName (index));
             toString128 (info.shortTitle, p.getParameterName (index, 8));
             toString128 (info.units, p.getParameterLabel (index));
@@ -251,9 +269,9 @@ public:
     //==============================================================================
     struct BypassParam  : public Vst::Parameter
     {
-        BypassParam (AudioProcessor& p, int index)  : owner (p), paramIndex (index)
+        BypassParam (AudioProcessor& p, Vst::ParamID vstParamID)  : owner (p)
         {
-            info.id = (Vst::ParamID) index;
+            info.id = vstParamID;
             toString128 (info.title, "Bypass");
             toString128 (info.shortTitle, "Bypass");
             toString128 (info.units, "");
@@ -329,12 +347,84 @@ public:
 
     private:
         AudioProcessor& owner;
-        int paramIndex;
 
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BypassParam)
     };
 
     //==============================================================================
+    struct ProgramChangeParameter  : public Vst::Parameter
+    {
+        ProgramChangeParameter (AudioProcessor& p)  : owner (p)
+        {
+            jassert (owner.getNumPrograms() > 1);
+
+            info.id = paramPreset;
+            toString128 (info.title, "Program");
+            toString128 (info.shortTitle, "Program");
+            toString128 (info.units, "");
+            info.stepCount = owner.getNumPrograms() - 1;
+            info.defaultNormalizedValue = static_cast<Vst::ParamValue> (owner.getCurrentProgram()) / static_cast<Vst::ParamValue> (info.stepCount);
+            info.unitId = Vst::kRootUnitId;
+            info.flags = Vst::ParameterInfo::kIsProgramChange | Vst::ParameterInfo::kCanAutomate;
+        }
+
+        virtual ~ProgramChangeParameter() {}
+
+        bool setNormalized (Vst::ParamValue v) override
+        {
+            Vst::ParamValue program = v * info.stepCount;
+
+            if (! isPositiveAndBelow ((int) program, owner.getNumPrograms()))
+                return false;
+
+            if (valueNormalized != v)
+            {
+                valueNormalized = v;
+                changed();
+                return true;
+            }
+
+            return false;
+        }
+
+        void toString (Vst::ParamValue value, Vst::String128 result) const override
+        {
+            Vst::ParamValue program = value * info.stepCount;
+            toString128 (result, owner.getProgramName ((int) program));
+        }
+
+        bool fromString (const Vst::TChar* text, Vst::ParamValue& outValueNormalized) const override
+        {
+            const String paramValueString (getStringFromVstTChars (text));
+
+            const int n = owner.getNumPrograms();
+            for (int i = 0; i < n; ++i)
+            {
+                if (paramValueString == owner.getProgramName (i))
+                {
+                    outValueNormalized = static_cast<Vst::ParamValue> (i) / info.stepCount;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        static String getStringFromVstTChars (const Vst::TChar* text)
+        {
+            return juce::String (juce::CharPointer_UTF16 (reinterpret_cast<const juce::CharPointer_UTF16::CharType*> (text)));
+        }
+
+        Vst::ParamValue toPlain (Vst::ParamValue v) const override       { return v * info.stepCount; }
+        Vst::ParamValue toNormalized (Vst::ParamValue v) const override  { return v / info.stepCount; }
+
+    private:
+        AudioProcessor& owner;
+
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProgramChangeParameter)
+    };
+
+    //==============================================================================
     tresult PLUGIN_API setComponentState (IBStream* stream) override
     {
         // Cubase and Nuendo need to inform the host of the current parameter values
@@ -343,9 +433,13 @@ public:
             const int numParameters = pluginInstance->getNumParameters();
 
             for (int i = 0; i < numParameters; ++i)
-                setParamNormalized ((Vst::ParamID) i, (double) pluginInstance->getParameter (i));
+                setParamNormalized (getVSTParamIDForIndex (i), (double) pluginInstance->getParameter (i));
 
-            setParamNormalized ((Vst::ParamID) numParameters, audioProcessor->isBypassed ? 1.0f : 0.0f);
+            setParamNormalized (bypassParamID, audioProcessor->isBypassed ? 1.0f : 0.0f);
+
+            const int numPrograms = pluginInstance->getNumPrograms();
+            if (numPrograms > 1)
+                setParamNormalized (paramPreset, static_cast<Vst::ParamValue> (pluginInstance->getCurrentProgram()) / static_cast<Vst::ParamValue> (numPrograms - 1));
         }
 
         return Vst::EditController::setComponentState (stream);
@@ -382,15 +476,15 @@ public:
     tresult PLUGIN_API getMidiControllerAssignment (Steinberg::int32 /*busIndex*/, Steinberg::int16 channel,
                                                     Vst::CtrlNumber midiControllerNumber, Vst::ParamID& resultID) override
     {
-        resultID = (Vst::ParamID) midiControllerToParameter[channel][midiControllerNumber];
+        resultID = midiControllerToParameter[channel][midiControllerNumber];
 
         return kResultTrue; // Returning false makes some hosts stop asking for further MIDI Controller Assignments
     }
 
     // Converts an incoming parameter index to a MIDI controller:
-    bool getMidiControllerForParameter (int index, int& channel, int& ctrlNumber)
+    bool getMidiControllerForParameter (Vst::ParamID index, int& channel, int& ctrlNumber)
     {
-        const int mappedIndex = index - parameterToMidiControllerOffset;
+        const int mappedIndex = static_cast<int> (index - parameterToMidiControllerOffset);
 
         if (isPositiveAndBelow (mappedIndex, numElementsInArray (parameterToMidiController)))
         {
@@ -407,6 +501,13 @@ public:
         return false;
     }
 
+    inline bool isMidiControllerParamID (Vst::ParamID paramID) const noexcept
+    {
+        return (paramID >= parameterToMidiControllerOffset
+                    && isPositiveAndBelow (paramID - parameterToMidiControllerOffset,
+                                           static_cast<Vst::ParamID> (numElementsInArray (parameterToMidiController))));
+    }
+
     //==============================================================================
     IPlugView* PLUGIN_API createView (const char* name) override
     {
@@ -423,19 +524,26 @@ public:
     }
 
     //==============================================================================
-    void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override        { beginEdit ((Vst::ParamID) index); }
+    void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override        { beginEdit (getVSTParamIDForIndex (index)); }
 
     void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override
     {
         // NB: Cubase has problems if performEdit is called without setParamNormalized
-        EditController::setParamNormalized ((Vst::ParamID) index, (double) newValue);
-        performEdit ((Vst::ParamID) index, (double) newValue);
+        EditController::setParamNormalized (getVSTParamIDForIndex (index), (double) newValue);
+        performEdit (getVSTParamIDForIndex (index), (double) newValue);
     }
 
-    void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override          { endEdit ((Vst::ParamID) index); }
+    void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override          { endEdit (getVSTParamIDForIndex (index)); }
 
     void audioProcessorChanged (AudioProcessor*) override
     {
+        if (AudioProcessor* pluginInstance = getPluginInstance())
+        {
+            if (pluginInstance->getNumPrograms() > 1)
+                EditController::setParamNormalized (paramPreset, static_cast<Vst::ParamValue> (pluginInstance->getCurrentProgram())
+                                                               / static_cast<Vst::ParamValue> (pluginInstance->getNumPrograms() - 1));
+        }
+
         if (componentHandler != nullptr)
             componentHandler->restartComponent (Vst::kLatencyChanged | Vst::kParamValuesChanged);
     }
@@ -450,6 +558,9 @@ public:
     }
 
 private:
+
+    friend class JuceVST3Component;
+
     //==============================================================================
     ComSmartPtr<JuceAudioProcessor> audioProcessor;
     ScopedJuceInitialiser_GUI libraryInitialiser;
@@ -462,9 +573,17 @@ private:
     };
 
     enum { numMIDIChannels = 16 };
-    int parameterToMidiControllerOffset;
+    Vst::ParamID parameterToMidiControllerOffset;
     MidiController parameterToMidiController[numMIDIChannels * Vst::kCountCtrlNumber];
-    int midiControllerToParameter[numMIDIChannels][Vst::kCountCtrlNumber];
+    Vst::ParamID midiControllerToParameter[numMIDIChannels][Vst::kCountCtrlNumber];
+
+    //==============================================================================
+   #if ! JUCE_FORCE_USE_LEGACY_PARAM_IDS
+    bool usingManagedParameter;
+    Array<Vst::ParamID> vstParamIDs;
+   #endif
+    Vst::ParamID bypassParamID;
+
 
     //==============================================================================
     void setupParameters()
@@ -473,40 +592,61 @@ private:
         {
             pluginInstance->addListener (this);
 
+           #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+            const bool usingManagedParameter = false;
+           #endif
+
             if (parameters.getParameterCount() <= 0)
             {
                 const int numParameters = pluginInstance->getNumParameters();
 
+              #if ! JUCE_FORCE_USE_LEGACY_PARAM_IDS
+                usingManagedParameter = (pluginInstance->getParameters().size() == numParameters);
+              #endif
+
                 for (int i = 0; i < numParameters; ++i)
-                    parameters.addParameter (new Param (*pluginInstance, i));
+                {
+                   #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+                    const Vst::ParamID vstParamID = static_cast<Vst::ParamID> (i);
+                   #else
+                    const Vst::ParamID vstParamID = generateVSTParamIDForIndex (pluginInstance, i);
+                    vstParamIDs.add (vstParamID);
+                   #endif
+
+                    parameters.addParameter (new Param (*pluginInstance, i, vstParamID));
+                }
 
-                parameters.addParameter (new BypassParam (*pluginInstance, numParameters));
+                bypassParamID = static_cast<Vst::ParamID> (usingManagedParameter ? paramBypass : numParameters);
+                parameters.addParameter (new BypassParam (*pluginInstance, bypassParamID));
+
+                if (pluginInstance->getNumPrograms() > 1)
+                    parameters.addParameter (new ProgramChangeParameter (*pluginInstance));
             }
 
            #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS
-            // (NB: the +1 is to account for the bypass parameter)
-            initialiseMidiControllerMappings (pluginInstance->getNumParameters() + 1);
+            parameterToMidiControllerOffset = static_cast<Vst::ParamID> (usingManagedParameter ? paramMidiControllerOffset
+                                                                                               : parameters.getParameterCount());
+
+            initialiseMidiControllerMappings ();
            #endif
 
             audioProcessorChanged (pluginInstance);
         }
     }
 
-    void initialiseMidiControllerMappings (const int numVstParameters)
+    void initialiseMidiControllerMappings ()
     {
-        parameterToMidiControllerOffset = numVstParameters;
-
         for (int c = 0, p = 0; c < numMIDIChannels; ++c)
         {
             for (int i = 0; i < Vst::kCountCtrlNumber; ++i, ++p)
             {
-                midiControllerToParameter[c][i] = p + parameterToMidiControllerOffset;
+                midiControllerToParameter[c][i] = static_cast<Vst::ParamID> (p) + parameterToMidiControllerOffset;
                 parameterToMidiController[p].channel = c;
                 parameterToMidiController[p].ctrlNumber = i;
 
                 parameters.addParameter (new Vst::Parameter (toString ("MIDI CC " + String (c) + "|" + String (i)),
-                                         (Vst::ParamID) (p + parameterToMidiControllerOffset), 0, 0, 0,
-                                         Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
+                                          static_cast<Vst::ParamID> (p) + parameterToMidiControllerOffset, 0, 0, 0,
+                                          Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
             }
         }
     }
@@ -525,6 +665,34 @@ private:
     }
 
     //==============================================================================
+   #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+    inline Vst::ParamID getVSTParamIDForIndex (int paramIndex) const noexcept   { return static_cast<Vst::ParamID> (paramIndex); }
+   #else
+    static Vst::ParamID generateVSTParamIDForIndex (AudioProcessor* const pluginFilter, int paramIndex)
+    {
+        jassert (pluginFilter != nullptr);
+
+        const int n = pluginFilter->getNumParameters();
+        const bool managedParameter = (pluginFilter->getParameters().size() == n);
+
+        if (isPositiveAndBelow (paramIndex, n))
+        {
+            const String& juceParamID = pluginFilter->getParameterID (paramIndex);
+            return managedParameter ? static_cast<Vst::ParamID> (juceParamID.hashCode())
+                                    : static_cast<Vst::ParamID> (juceParamID.getIntValue());
+        }
+
+        return static_cast<Vst::ParamID> (-1);
+    }
+
+    inline Vst::ParamID getVSTParamIDForIndex (int paramIndex) const noexcept
+    {
+        return usingManagedParameter ? vstParamIDs.getReference (paramIndex)
+                                     : static_cast<Vst::ParamID> (paramIndex);
+    }
+   #endif
+
+    //==============================================================================
     class JuceVST3Editor : public Vst::EditorView
     {
     public:
@@ -627,14 +795,30 @@ private:
             return kResultFalse;
         }
 
-        tresult PLUGIN_API canResize() override         { return kResultTrue; }
+        tresult PLUGIN_API canResize() override
+        {
+            if (component != nullptr)
+                if (AudioProcessorEditor* editor = component->pluginEditor)
+                    return editor->isResizable() ? kResultTrue : kResultFalse;
+
+            return kResultFalse;
+        }
 
         tresult PLUGIN_API checkSizeConstraint (ViewRect* rectToCheck) override
         {
             if (rectToCheck != nullptr && component != nullptr)
             {
-                rectToCheck->right  = rectToCheck->left + component->getWidth();
-                rectToCheck->bottom = rectToCheck->top  + component->getHeight();
+                // checkSizeConstraint
+                Rectangle<int> juceRect = Rectangle<int>::leftTopRightBottom (rectToCheck->left, rectToCheck->top,
+                                                                              rectToCheck->right, rectToCheck->bottom);
+                if (AudioProcessorEditor* editor = component->pluginEditor)
+                    if (ComponentBoundsConstrainer* constrainer = editor->getConstrainer())
+                        juceRect.setSize (jlimit (constrainer->getMinimumWidth(),  constrainer->getMaximumWidth(),  juceRect.getWidth()),
+                                          jlimit (constrainer->getMinimumHeight(), constrainer->getMaximumHeight(), juceRect.getHeight()));
+
+                rectToCheck->right  = rectToCheck->left + juceRect.getWidth();
+                rectToCheck->bottom = rectToCheck->top  + juceRect.getHeight();
+
                 return kResultTrue;
             }
 
@@ -648,8 +832,8 @@ private:
         {
         public:
             ContentWrapperComponent (JuceVST3Editor& editor, AudioProcessor& plugin)
-               : owner (editor),
-                 pluginEditor (plugin.createEditorIfNeeded())
+               : pluginEditor (plugin.createEditorIfNeeded()),
+                 owner (editor)
             {
                 setOpaque (true);
                 setBroughtToFrontOnMouseClick (true);
@@ -720,9 +904,10 @@ private:
                 }
             }
 
+            ScopedPointer<AudioProcessorEditor> pluginEditor;
+
         private:
             JuceVST3Editor& owner;
-            ScopedPointer<AudioProcessorEditor> pluginEditor;
 
             JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentWrapperComponent)
         };
@@ -803,7 +988,11 @@ public:
         processSetup.sampleRate = 44100.0;
         processSetup.symbolicSampleSize = Vst::kSample32;
 
-        vstBypassParameterId = pluginInstance->getNumParameters();
+       #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+        vstBypassParameterId = static_cast<Vst::ParamID> (pluginInstance->getNumParameters());
+       #else
+        cacheParameterIDs();
+       #endif
 
         pluginInstance->setPlayHead (this);
     }
@@ -1256,7 +1445,7 @@ public:
     {
         if (listIndex == 0)
         {
-            info.id = paramPreset;
+            info.id = JuceVST3EditController::paramPreset;
             info.programCount = (Steinberg::int32) getPluginInstance().getNumPrograms();
 
             toString128 (info.name, TRANS("Factory Presets"));
@@ -1271,7 +1460,7 @@ public:
 
     tresult PLUGIN_API getProgramName (Vst::ProgramListID listId, Steinberg::int32 programIndex, Vst::String128 name) override
     {
-        if (listId == paramPreset
+        if (listId == JuceVST3EditController::paramPreset
             && isPositiveAndBelow ((int) programIndex, getPluginInstance().getNumPrograms()))
         {
             toString128 (name, getPluginInstance().getProgramName ((int) programIndex));
@@ -1399,7 +1588,7 @@ public:
             info.flags = Vst::BusInfo::kDefaultActive;
 
            #if JucePlugin_WantsMidiInput
-            if (dir == Vst::kInput)
+            if (dir == Vst::kInput && index == 0)
             {
                 info.mediaType = Vst::kEvent;
                 info.direction = dir;
@@ -1411,7 +1600,7 @@ public:
            #endif
 
            #if JucePlugin_ProducesMidiOutput
-            if (dir == Vst::kOutput)
+            if (dir == Vst::kOutput && index == 0)
             {
                 info.mediaType = Vst::kEvent;
                 info.direction = dir;
@@ -1613,22 +1802,35 @@ public:
 
                 if (paramQueue->getPoint (numPoints - 1,  offsetSamples, value) == kResultTrue)
                 {
-                    const int id = (int) paramQueue->getParameterId();
+                    const Vst::ParamID vstParamID = paramQueue->getParameterId();
 
-                    if (isPositiveAndBelow (id, pluginInstance->getNumParameters()))
-                        pluginInstance->setParameter (id, static_cast<float> (value));
-                    else if (id == vstBypassParameterId)
+                    if (vstParamID == vstBypassParameterId)
                         setBypassed (static_cast<float> (value) != 0.0f);
                    #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS
-                    else
-                        addParameterChangeToMidiBuffer (offsetSamples, id, value);
+                    else if (juceVST3EditController->isMidiControllerParamID (vstParamID))
+                        addParameterChangeToMidiBuffer (offsetSamples, vstParamID, value);
                    #endif
+                    else if (vstParamID == JuceVST3EditController::paramPreset)
+                    {
+                        const int numPrograms  = pluginInstance->getNumPrograms();
+                        const int programValue = roundToInt (value * numPrograms);
+
+                        if (numPrograms > 1 && isPositiveAndBelow (programValue, numPrograms)
+                                            && programValue != pluginInstance->getCurrentProgram())
+                            pluginInstance->setCurrentProgram (programValue);
+                    }
+                    else
+                    {
+                        const int index = getJuceIndexForVSTParamID (vstParamID);
+                        if (isPositiveAndBelow (index, pluginInstance->getNumParameters()))
+                            pluginInstance->setParameter (index, static_cast<float> (value));
+                    }
                 }
             }
         }
     }
 
-    void addParameterChangeToMidiBuffer (const Steinberg::int32 offsetSamples, const int id, const double value)
+    void addParameterChangeToMidiBuffer (const Steinberg::int32 offsetSamples, const Vst::ParamID id, const double value)
     {
         // If the parameter is mapped to a MIDI CC message then insert it into the midiBuffer.
         int channel, ctrlNumber;
@@ -1717,7 +1919,12 @@ private:
 
     ScopedJuceInitialiser_GUI libraryInitialiser;
 
-    int vstBypassParameterId;
+   #if ! JUCE_FORCE_USE_LEGACY_PARAM_IDS
+    bool usingManagedParameter;
+    Array<Vst::ParamID> vstParamIDs;
+    HashMap<int32, int> paramMap;
+   #endif
+    Vst::ParamID vstBypassParameterId;
 
     static const char* kJucePrivateDataIdentifier;
 
@@ -1862,12 +2069,6 @@ private:
         return AudioBusPointerHelper<FloatType>::impl (data);
     }
 
-    //==============================================================================
-    enum InternalParameters
-    {
-        paramPreset = 'prst'
-    };
-
     void preparePlugin (double sampleRate, int bufferSize)
     {
         AudioProcessor& p = getPluginInstance();
@@ -1877,6 +2078,40 @@ private:
     }
 
     //==============================================================================
+   #if JUCE_FORCE_USE_LEGACY_PARAM_IDS
+    inline Vst::ParamID getVSTParamIDForIndex (int paramIndex) const noexcept   { return static_cast<Vst::ParamID> (paramIndex); }
+    inline int getJuceIndexForVSTParamID (Vst::ParamID paramID) const noexcept  { return static_cast<int> (paramID); }
+   #else
+    void cacheParameterIDs()
+    {
+        const int numParameters = pluginInstance->getNumParameters();
+        usingManagedParameter = (pluginInstance->getParameters().size() == numParameters);
+
+        vstBypassParameterId = static_cast<Vst::ParamID> (usingManagedParameter ? JuceVST3EditController::paramBypass : numParameters);
+
+        for (int i = 0; i < numParameters; ++i)
+        {
+            const Vst::ParamID paramID = JuceVST3EditController::generateVSTParamIDForIndex (pluginInstance, i);
+
+            vstParamIDs.add (paramID);
+            paramMap.set (static_cast<int32> (paramID), i);
+        }
+    }
+
+    inline Vst::ParamID getVSTParamIDForIndex (int paramIndex) const noexcept
+    {
+        return usingManagedParameter ? vstParamIDs.getReference (paramIndex)
+                                     : static_cast<Vst::ParamID> (paramIndex);
+    }
+
+    inline int getJuceIndexForVSTParamID (Vst::ParamID paramID) const noexcept
+    {
+        return usingManagedParameter ? paramMap[static_cast<int32> (paramID)]
+                                     : static_cast<int> (paramID);
+    }
+   #endif
+
+    //==============================================================================
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component)
 };
 
@@ -2264,7 +2499,7 @@ private:
 // The VST3 plugin entry point.
 JUCE_EXPORTED_FUNCTION IPluginFactory* PLUGIN_API GetPluginFactory()
 {
-    JUCE_DECLARE_WRAPPER_TYPE (wrapperType_VST3);
+    PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST3;
 
    #if JUCE_WINDOWS
     // Cunning trick to force this function to be exported. Life's too short to
diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h
index ade0118..5dbbb6c 100644
--- a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h
+++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_plugin_client
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE audio plugin wrapper classes
   description:      Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.
   website:          http://www.juce.com/juce
@@ -53,6 +53,17 @@
 #include <juce_audio_basics/juce_audio_basics.h>
 #include <juce_audio_processors/juce_audio_processors.h>
 
+/** Config: JUCE_FORCE_USE_LEGACY_PARAM_IDS
+
+    Enable this if you want to force JUCE to use a continuous parameter
+    index to identify a parameter in a DAW (this was the default in old
+    versions of JUCE). This is index is usually used by the DAW to save
+    automation data and enabling this may mess up user's DAW projects.
+*/
+#ifndef JUCE_FORCE_USE_LEGACY_PARAM_IDS
+ #define JUCE_FORCE_USE_LEGACY_PARAM_IDS 0
+#endif
+
 namespace juce
 {
  #include "utility/juce_PluginHostType.h"
diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r
new file mode 100644
index 0000000..2a345b2
--- /dev/null
+++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r
@@ -0,0 +1,69 @@
+/*
+  ==============================================================================
+
+   This file is part of the JUCE library.
+   Copyright (c) 2015 - ROLI Ltd.
+
+   Permission is granted to use this software under the terms of either:
+   a) the GPL v2 (or any later version)
+   b) the Affero GPL v3
+
+   Details of these licenses can be found at: www.gnu.org/licenses
+
+   JUCE 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.
+
+   ------------------------------------------------------------------------------
+
+   To release a closed-source product which uses JUCE, commercial licenses are
+   available: visit www.juce.com for more information.
+
+  ==============================================================================
+*/
+
+#define UseExtendedThingResource 1
+#include <AudioUnit/AudioUnit.r>
+
+//==============================================================================
+/*  The AppConfig.h file should be a file in your project, containing info to describe the
+    plugin's name, type, etc. The introjucer will generate this file automatically for you.
+
+    You may need to adjust the include path of your project to make sure it can be 
+    found by this include statement. (Don't hack this file to change the include path)
+*/
+#include "AppConfig.h"
+
+
+//==============================================================================
+// component resources for Audio Unit
+#define RES_ID          1000
+#define COMP_TYPE       JucePlugin_AUMainType
+#define COMP_SUBTYPE    JucePlugin_AUSubType
+#define COMP_MANUF      JucePlugin_AUManufacturerCode
+#define VERSION         JucePlugin_VersionCode
+#define NAME            JucePlugin_Manufacturer ": " JucePlugin_Name
+#define DESCRIPTION     JucePlugin_Desc
+#define ENTRY_POINT     JucePlugin_AUExportPrefixQuoted "Entry"
+
+#include "AUResources.r"
+
+//==============================================================================
+// component resources for Audio Unit Carbon View
+
+#ifndef BUILD_AU_CARBON_UI
+ #define BUILD_AU_CARBON_UI 1
+#endif
+
+#if BUILD_AU_CARBON_UI
+ #define RES_ID         2000
+ #define COMP_TYPE      kAudioUnitCarbonViewComponentType
+ #define COMP_SUBTYPE   JucePlugin_AUSubType
+ #define COMP_MANUF		JucePlugin_AUManufacturerCode
+ #define VERSION        JucePlugin_VersionCode
+ #define NAME           JucePlugin_Manufacturer ": " JucePlugin_Name " View"
+ #define DESCRIPTION    NAME
+ #define ENTRY_POINT    JucePlugin_AUExportPrefixQuoted "ViewEntry"
+
+ #include "AUResources.r"
+#endif
diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r b/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r
new file mode 100644
index 0000000..a40e1f3
--- /dev/null
+++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r
@@ -0,0 +1,6 @@
+
+/*
+   This dummy file is added to the resources section of the project to
+   force XCode to create some resources for the dpm. If there aren't any
+   resources, PT will refuse to load the plugin..
+*/
diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp
index 5309244..cf78781 100644
--- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp
+++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp
@@ -27,3 +27,7 @@
 #endif
 
 #include "Standalone/juce_StandaloneFilterApp.cpp"
+
+#if ! JUCE_USE_CUSTOM_AU3_STANDALONE_APP
+ START_JUCE_APPLICATION (StandaloneFilterApp);
+#endif
diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h b/modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h
index ec70261..143e2e9 100644
--- a/modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h
+++ b/modules/juce_audio_plugin_client/utility/juce_PluginBusUtilities.h
@@ -45,7 +45,7 @@ struct PluginBusUtilities
     AudioBusArray&       getFilterBus (bool inputBus) noexcept         { return inputBus ? processor.busArrangement.inputBuses : processor.busArrangement.outputBuses; }
     const AudioBusArray& getFilterBus (bool inputBus) const noexcept   { return inputBus ? processor.busArrangement.inputBuses : processor.busArrangement.outputBuses; }
     int getBusCount (bool inputBus) const noexcept                     { return getFilterBus (inputBus).size(); }
-    AudioChannelSet getChannelSet (bool inputBus, int bus) noexcept    { return getFilterBus (inputBus).getReference (bus).channels; }
+    AudioChannelSet getChannelSet (bool inp, int bus) noexcept         { return isPositiveAndBelow (bus, getBusCount (inp)) ? getFilterBus (inp).getReference (bus).channels : AudioChannelSet(); }
     int getNumChannels (bool inp, int bus) const noexcept              { return isPositiveAndBelow (bus, getBusCount (inp)) ? getFilterBus (inp).getReference (bus).channels.size() : 0; }
     bool isBusEnabled (bool inputBus, int bus) const noexcept          { return (getNumChannels (inputBus, bus) > 0); }
     bool hasInputs  (int bus) const noexcept                           { return isBusEnabled (true,  bus); }
diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h b/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h
index eb9d062..b779bf1 100644
--- a/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h
+++ b/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h
@@ -22,18 +22,6 @@
   ==============================================================================
 */
 
-#ifndef DOXYGEN
- // @internal
- extern JUCE_API int* jucePlugInClientCurrentWrapperType;
-
- // this is ugly hack is needed by juce_getExecutableFile to have a wrapper
- // dependent symbol
- #define JUCE_DEFINE_WRAPPER_TYPE(x) JUCE_API int jucePlugInClientCurrentWrapperType_ ## x = static_cast<int> (AudioProcessor::x);
- #define JUCE_DECLARE_WRAPPER_TYPE(x) jucePlugInClientCurrentWrapperType = &jucePlugInClientCurrentWrapperType_ ## x;
-
-#endif
-
-
 //==============================================================================
 class PluginHostType
 {
@@ -190,15 +178,15 @@ public:
 
          @see AudioProcessor::wrapperType
     */
-    static AudioProcessor::WrapperType getPluginLoadedAs() noexcept
-    {
-        if (jucePlugInClientCurrentWrapperType != nullptr)
-            return static_cast<AudioProcessor::WrapperType> (*jucePlugInClientCurrentWrapperType);
-
-        return AudioProcessor::wrapperType_Undefined;
-    }
+    static AudioProcessor::WrapperType getPluginLoadedAs() noexcept    { return jucePlugInClientCurrentWrapperType; }
 
     //==============================================================================
+
+   #ifndef DOXYGEN
+    // @internal
+    static AudioProcessor::WrapperType jucePlugInClientCurrentWrapperType;
+   #endif
+
 private:
     static HostType getHostType()
     {
diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
index d95c931..f9f4a2f 100644
--- a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
+++ b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
@@ -32,7 +32,7 @@
 
 namespace juce
 {
-    int* jucePlugInClientCurrentWrapperType = nullptr;
+    AudioProcessor::WrapperType PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Undefined;
 }
 
 #if _MSC_VER || JUCE_MINGW
diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp
index c908d5f..a6f8f1e 100644
--- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp
+++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp
@@ -65,11 +65,11 @@ void AudioPluginFormatManager::addDefaultFormats()
     // you should only call this method once!
     for (int i = formats.size(); --i >= 0;)
     {
-       #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WIN || JUCE_LINUX)
+       #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
         jassert (dynamic_cast<VSTPluginFormat*> (formats[i]) == nullptr);
        #endif
 
-       #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WIN)
+       #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS)
         jassert (dynamic_cast<VST3PluginFormat*> (formats[i]) == nullptr);
        #endif
 
@@ -87,11 +87,11 @@ void AudioPluginFormatManager::addDefaultFormats()
     formats.add (new AudioUnitPluginFormat());
    #endif
 
-   #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WIN || JUCE_LINUX)
+   #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
     formats.add (new VSTPluginFormat());
    #endif
 
-   #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WIN)
+   #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS)
     formats.add (new VST3PluginFormat());
    #endif
 
diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
index a94e782..552d415 100644
--- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
+++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
@@ -40,7 +40,9 @@
 #endif
 
 #ifndef JUCE_SUPPORTS_AUv3
- #if JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES && defined (MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8) && __OBJC2__
+ #if JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES && __OBJC2__  \
+      &&  ((defined (MAC_OS_X_VERSION_MIN_REQUIRED)    && defined (MAC_OS_X_VERSION_10_11) && (MAC_OS_X_VERSION_MIN_REQUIRED    >= MAC_OS_X_VERSION_10_11)) \
+       ||  (defined (__IPHONE_OS_VERSION_MIN_REQUIRED) && defined (__IPHONE_9_0)           && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0)))
   #define JUCE_SUPPORTS_AUv3 1
  #else
   #define JUCE_SUPPORTS_AUv3 0
@@ -340,50 +342,55 @@ public:
         jassert (AudioUnitFormatHelpers::insideCallback.get() == 0);
        #endif
 
-      #if JUCE_MAC
-        if (eventListenerRef != 0)
-        {
-            AUListenerDispose (eventListenerRef);
-            eventListenerRef = 0;
-        }
-      #endif
-
         if (audioUnit != nullptr)
         {
-            if (prepared)
-                releaseResources();
-
             struct AUDeleter : public CallbackMessage
             {
-                AUDeleter (AudioComponentInstance& inInstance, WaitableEvent& inEvent)
+                AUDeleter (AudioUnitPluginInstance& inInstance, WaitableEvent& inEvent)
                     : auInstance (inInstance), completionSignal (inEvent)
                 {}
 
                 void messageCallback() override
                 {
-                    AudioComponentInstanceDispose (auInstance);
-                    auInstance = nullptr;
+                    auInstance.cleanup();
                     completionSignal.signal();
                 }
 
-                AudioComponentInstance& auInstance;
+                AudioUnitPluginInstance& auInstance;
                 WaitableEvent& completionSignal;
             };
 
             if (MessageManager::getInstance()->isThisTheMessageThread())
             {
-                AudioComponentInstanceDispose (audioUnit);
-                audioUnit = nullptr;
+                cleanup();
             }
             else
             {
                 WaitableEvent completionEvent;
-                (new AUDeleter (audioUnit, completionEvent))->post();
+                (new AUDeleter (*this, completionEvent))->post();
                 completionEvent.wait();
             }
         }
     }
 
+    // called from the destructer above
+    void cleanup()
+    {
+       #if JUCE_MAC
+        if (eventListenerRef != 0)
+        {
+            AUListenerDispose (eventListenerRef);
+            eventListenerRef = 0;
+        }
+       #endif
+
+        if (prepared)
+            releaseResources();
+
+        AudioComponentInstanceDispose (audioUnit);
+        audioUnit = nullptr;
+    }
+
     bool initialise (double rate, int blockSize)
     {
         updateNumChannels();
diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h
index 0636410..3c53519 100644
--- a/modules/juce_audio_processors/format_types/juce_VST3Common.h
+++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h
@@ -154,7 +154,7 @@ static inline Steinberg::Vst::Speaker getSpeakerType (AudioChannelSet::ChannelTy
         case AudioChannelSet::surround:          return kSpeakerS;
         case AudioChannelSet::leftRearSurround:  return kSpeakerSl;
         case AudioChannelSet::rightRearSurround: return kSpeakerSr;
-        case AudioChannelSet::topMiddle:         return kSpeakerTm;
+        case AudioChannelSet::topMiddle:         return (1 << 11); /* kSpeakerTm */
         case AudioChannelSet::topFrontLeft:      return kSpeakerTfl;
         case AudioChannelSet::topFrontCentre:    return kSpeakerTfc;
         case AudioChannelSet::topFrontRight:     return kSpeakerTfr;
@@ -185,7 +185,7 @@ static inline AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::Speak
         case kSpeakerS:     return AudioChannelSet::surround;
         case kSpeakerSl:    return AudioChannelSet::leftRearSurround;
         case kSpeakerSr:    return AudioChannelSet::rightRearSurround;
-        case kSpeakerTm:    return AudioChannelSet::topMiddle;
+        case (1 << 11):     return AudioChannelSet::topMiddle;  /* kSpeakerTm */
         case kSpeakerTfl:   return AudioChannelSet::topFrontLeft;
         case kSpeakerTfc:   return AudioChannelSet::topFrontCentre;
         case kSpeakerTfr:   return AudioChannelSet::topFrontRight;
diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h
index c5564db..49dc270 100644
--- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h
+++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h
@@ -81,6 +81,7 @@
  #include <pluginterfaces/vst/ivstunits.h>
  #include <pluginterfaces/vst/ivstmidicontrollers.h>
  #include <public.sdk/source/common/memorystream.h>
+ #include <public.sdk/source/vst/vsteditcontroller.h>
 #else
  #include <base/source/baseiids.cpp>
  #include <base/source/fatomic.cpp>
@@ -128,6 +129,10 @@ namespace Steinberg
  #pragma clang diagnostic pop
 #endif
 
+#if JUCE_WINDOWS
+ #include <windows.h>
+#endif
+
 //==============================================================================
 #undef ASSERT
 #undef WARNING
diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
index 43ffca2..486bf02 100644
--- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
+++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
@@ -22,20 +22,13 @@
   ==============================================================================
 */
 
-#if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WIN)
+#if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS)
 
 } // namespace juce
 
-#if JucePlugin_Build_VST3
- #undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY
- #define JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY 1
-#endif
-
 #include <map>
 #include "juce_VST3Headers.h"
 
-#undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY
-
 namespace juce
 {
 
@@ -405,7 +398,17 @@ public:
             return kResultFalse;
 
         owner->sendParamChangeMessageToListeners (index, (float) valueNormalized);
-        return owner->editController->setParamNormalized (paramID, valueNormalized);
+
+        {
+            Steinberg::int32 eventIndex;
+            owner->inputParameterChanges->addParameterData (paramID, eventIndex)->addPoint (0, valueNormalized, eventIndex);
+        }
+
+        // did the plug-in already update the parameter internally
+        if (owner->editController->getParamNormalized (paramID) != (float) valueNormalized)
+            return owner->editController->setParamNormalized (paramID, valueNormalized);
+
+        return kResultTrue;
     }
 
     tresult PLUGIN_API endEdit (Vst::ParamID paramID) override
@@ -693,8 +696,8 @@ public:
 
     tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override
     {
-        jassertfalse;
-        return kResultFalse;
+        owner->syncProgramNames();
+        return kResultTrue;
     }
 
     //==============================================================================
@@ -1154,7 +1157,10 @@ struct DLLHandle
             if (GetFactoryProc proc = (GetFactoryProc) getFunction ("GetPluginFactory"))
                 factory = proc();
 
-        jassert (factory != nullptr); // The plugin NEEDS to provide a factory to be able to be called a VST3!
+        // The plugin NEEDS to provide a factory to be able to be called a VST3!
+        // Most likely you are trying to load a 32-bit VST3 from a 64-bit host
+        // or vice versa.
+        jassert (factory != nullptr);
         return factory;
     }
 
@@ -1590,6 +1596,7 @@ public:
       : module (handle),
         numInputAudioBusses (0),
         numOutputAudioBusses (0),
+        programParameterID ((Vst::ParamID) -1),
         inputParameterChanges (new ParamValueQueueList()),
         outputParameterChanges (new ParamValueQueueList()),
         midiInputs (new MidiEventList()),
@@ -1659,6 +1666,7 @@ public:
         grabInformationObjects();
         synchroniseStates();
         interconnectComponentAndController();
+        syncProgramNames();
         setupIO();
         return true;
     }
@@ -1947,25 +1955,34 @@ public:
     }
 
     //==============================================================================
-    int getNumPrograms() override                        { return getProgramListInfo (0).programCount; }
-    int getCurrentProgram() override                     { return 0; }
-    void setCurrentProgram (int) override                {}
+    int getNumPrograms() override                        { return programNames.size(); }
+    const String getProgramName (int index) override     { return programNames[index]; }
+    int getCurrentProgram() override                     { return jmax (0, (int) editController->getParamNormalized (programParameterID) * (programNames.size() - 1)); }
     void changeProgramName (int, const String&) override {}
 
-    const String getProgramName (int index) override
+    void setCurrentProgram (int program) override
     {
-        Vst::String128 result;
-        unitInfo->getProgramName (getProgramListInfo (0).id, index, result);
-        return toString (result);
+        if (programNames.size() > 0 && editController != nullptr)
+        {
+            Vst::ParamValue value =
+                static_cast<Vst::ParamValue> (program) / static_cast<Vst::ParamValue> (programNames.size());
+
+            editController->setParamNormalized (programParameterID, value);
+            Steinberg::int32 index;
+            inputParameterChanges->addParameterData (programParameterID, index)->addPoint (0, value, index);
+        }
     }
 
     //==============================================================================
     void reset() override
     {
-        if (component != nullptr)
+        if (component != nullptr && processor != nullptr)
         {
+            processor->setProcessing (false);
             component->setActive (false);
+
             component->setActive (true);
+            processor->setProcessing (true);
         }
     }
 
@@ -2022,18 +2039,18 @@ public:
     class ParamValueQueueList  : public Vst::IParameterChanges
     {
     public:
-        ParamValueQueueList() {}
+        ParamValueQueueList() : numQueuesUsed (0) {}
         virtual ~ParamValueQueueList() {}
 
         JUCE_DECLARE_VST3_COM_REF_METHODS
         JUCE_DECLARE_VST3_COM_QUERY_METHODS
 
-        Steinberg::int32 PLUGIN_API getParameterCount() override                                { return (Steinberg::int32) queues.size(); }
-        Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override    { return queues[(int) index]; }
+        Steinberg::int32 PLUGIN_API getParameterCount() override                                { return numQueuesUsed; }
+        Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override    { return isPositiveAndBelow (static_cast<int> (index), numQueuesUsed) ? queues[(int) index] : nullptr; }
 
         Vst::IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, Steinberg::int32& index) override
         {
-            for (int i = queues.size(); --i >= 0;)
+            for (int i = numQueuesUsed; --i >= 0;)
             {
                 if (queues.getUnchecked (i)->getParameterId() == id)
                 {
@@ -2042,25 +2059,32 @@ public:
                 }
             }
 
-            index = getParameterCount();
-            return queues.add (new ParamValueQueue (id));
+            index = numQueuesUsed++;
+            ParamValueQueue* valueQueue = (index < queues.size() ? queues[index]
+                                                                 : queues.add (new ParamValueQueue));
+
+            valueQueue->clear();
+            valueQueue->setParamID (id);
+
+            return valueQueue;
         }
 
         void clearAllQueues() noexcept
         {
-            for (int i = queues.size(); --i >= 0;)
-                queues.getUnchecked (i)->clear();
+            numQueuesUsed = 0;
         }
 
         struct ParamValueQueue  : public Vst::IParamValueQueue
         {
-            ParamValueQueue (Vst::ParamID parameterID) : paramID (parameterID)
+            ParamValueQueue () : paramID (static_cast<Vst::ParamID> (-1))
             {
                 points.ensureStorageAllocated (1024);
             }
 
             virtual ~ParamValueQueue() {}
 
+            void setParamID (Vst::ParamID pID) noexcept    { paramID = pID; }
+
             JUCE_DECLARE_VST3_COM_REF_METHODS
             JUCE_DECLARE_VST3_COM_QUERY_METHODS
 
@@ -2112,7 +2136,7 @@ public:
             };
 
             Atomic<int> refCount;
-            const Vst::ParamID paramID;
+            Vst::ParamID paramID;
             Array<ParamPoint> points;
             CriticalSection pointLock;
 
@@ -2121,6 +2145,7 @@ public:
 
         Atomic<int> refCount;
         OwnedArray<ParamValueQueue> queues;
+        int numQueuesUsed;
 
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueueList)
     };
@@ -2160,6 +2185,9 @@ private:
     VST3FloatAndDoubleBusMapComposite inputBusMap, outputBusMap;
     Array<Vst::AudioBusBuffers> inputBusses, outputBusses;
 
+    StringArray programNames;
+    Vst::ParamID programParameterID;
+
     //==============================================================================
     template <typename Type>
     static void appendStateFrom (XmlElement& head, ComSmartPtr<Type>& object, const String& identifier)
@@ -2313,8 +2341,8 @@ private:
 
         if (componentConnection != nullptr && editControllerConnection != nullptr)
         {
-            warnOnFailure (editControllerConnection->connect (componentConnection));
             warnOnFailure (componentConnection->connect (editControllerConnection));
+            warnOnFailure (editControllerConnection->connect (componentConnection));
         }
     }
 
@@ -2380,6 +2408,7 @@ private:
         Vst::BusInfo busInfo;
         busInfo.mediaType = forAudio ? Vst::kAudio : Vst::kEvent;
         busInfo.direction = forInput ? Vst::kInput : Vst::kOutput;
+        busInfo.channelCount = 0;
 
         component->getBusInfo (busInfo.mediaType, busInfo.direction,
                                (Steinberg::int32) index, busInfo);
@@ -2446,6 +2475,77 @@ private:
         return paramInfo;
     }
 
+    void syncProgramNames ()
+    {
+        programNames.clear();
+
+        if (processor == nullptr || editController == nullptr)
+            return;
+
+        Vst::UnitID programUnitID;
+        Vst::ParameterInfo paramInfo = { 0 };
+
+        {
+            int idx, num = editController->getParameterCount();
+            for (idx = 0; idx < num; ++idx)
+                if (editController->getParameterInfo (idx, paramInfo) == kResultOk
+                     && (paramInfo.flags & Steinberg::Vst::ParameterInfo::kIsProgramChange) != 0)
+                    break;
+
+            if (idx >= num) return;
+
+            programParameterID = paramInfo.id;
+            programUnitID = paramInfo.unitId;
+        }
+
+        if (unitInfo != nullptr)
+        {
+            Vst::UnitInfo uInfo = { 0 };
+            const int unitCount = unitInfo->getUnitCount();
+
+            for (int idx = 0; idx < unitCount; ++idx)
+            {
+                if (unitInfo->getUnitInfo(idx, uInfo) == kResultOk
+                      && uInfo.id == programUnitID)
+                {
+                    const int programListCount = unitInfo->getProgramListCount();
+
+                    for (int j = 0; j < programListCount; ++j)
+                    {
+                        Vst::ProgramListInfo programListInfo = { 0 };
+
+                        if (unitInfo->getProgramListInfo (j, programListInfo) == kResultOk
+                              && programListInfo.id == uInfo.programListId)
+                        {
+                            Vst::String128 name;
+
+                            for (int k = 0; k < programListInfo.programCount; ++k)
+                                if (unitInfo->getProgramName (programListInfo.id, k, name) == kResultOk)
+                                    programNames.add (toString (name));
+
+                            return;
+                        }
+                    }
+
+                    break;
+                }
+            }
+        }
+
+        if (editController != nullptr
+               && paramInfo.stepCount > 0)
+        {
+            const int numPrograms = paramInfo.stepCount + 1;
+            for (int i = 0; i < numPrograms; ++i)
+            {
+                Vst::String128 programName;
+                Vst::ParamValue valueNormalized = static_cast<Vst::ParamValue> (i) / static_cast<Vst::ParamValue> (paramInfo.stepCount);
+                if (editController->getParamStringByValue (paramInfo.id, valueNormalized, programName) == kResultOk)
+                    programNames.add (toString (programName));
+            }
+        }
+    }
+
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginInstance)
 };
 
diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h
index 6b1b981..e9650e2 100644
--- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h
+++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h
@@ -25,7 +25,7 @@
 #ifndef JUCE_VST3PLUGINFORMAT_H_INCLUDED
 #define JUCE_VST3PLUGINFORMAT_H_INCLUDED
 
-#if (JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WIN)) || DOXYGEN
+#if (JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN
 
 /**
     Implements a plugin format for VST3s.
diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
index e8c53ce..46adb5c 100644
--- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
+++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
@@ -22,7 +22,7 @@
   ==============================================================================
 */
 
-#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WIN || JUCE_LINUX)
+#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
 
 //==============================================================================
 #if JUCE_MAC && JUCE_SUPPORT_CARBON
@@ -165,7 +165,7 @@ namespace
     {
        #if JUCE_WINDOWS
         return timeGetTime() * 1000000.0;
-       #elif JUCE_LINUX
+       #elif JUCE_LINUX || JUCE_IOS
         timeval micro;
         gettimeofday (&micro, 0);
         return micro.tv_usec * 1000.0;
@@ -342,7 +342,7 @@ public:
     }
 
     //==============================================================================
-    static ModuleHandle* findOrCreateModule (const File& file)
+    static Ptr findOrCreateModule (const File& file)
     {
         for (int i = getActiveModules().size(); --i >= 0;)
         {
@@ -352,33 +352,33 @@ public:
                 return module;
         }
 
-        _fpreset(); // (doesn't do any harm)
-
         const IdleCallRecursionPreventer icrp;
         shellUIDToCreate = 0;
+        _fpreset();
 
         JUCE_VST_LOG ("Attempting to load VST: " + file.getFullPathName());
 
-        ScopedPointer<ModuleHandle> m (new ModuleHandle (file));
-
-        if (! m->open())
-            m = nullptr;
+        Ptr m = new ModuleHandle (file, nullptr);
 
-        _fpreset(); // (doesn't do any harm)
+        if (m->open())
+        {
+            _fpreset();
+            return m;
+        }
 
-        return m.release();
+        return nullptr;
     }
 
     //==============================================================================
-    ModuleHandle (const File& f)
-        : file (f), moduleMain (nullptr), customMain (nullptr)
+    ModuleHandle (const File& f, MainCall customMainCall)
+        : file (f), moduleMain (customMainCall), customMain (nullptr)
          #if JUCE_MAC
            , resHandle (0), bundleRef (0), resFileId (0)
          #endif
     {
         getActiveModules().add (this);
 
-       #if JUCE_WINDOWS || JUCE_LINUX
+       #if JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS
         fullParentDirectoryPathName = f.getParentDirectory().getFullPathName();
        #elif JUCE_MAC
         FSRef ref;
@@ -394,12 +394,18 @@ public:
     }
 
     //==============================================================================
-#if JUCE_WINDOWS || JUCE_LINUX
-    DynamicLibrary module;
+   #if ! JUCE_MAC
     String fullParentDirectoryPathName;
+   #endif
+
+  #if JUCE_WINDOWS || JUCE_LINUX
+    DynamicLibrary module;
 
     bool open()
     {
+        if (moduleMain != nullptr)
+            return true;
+
         pluginName = file.getFileNameWithoutExtension();
 
         module.open (file.getFullPathName());
@@ -457,14 +463,20 @@ public:
         return String();
     }
    #endif
-#else
+  #else
     Handle resHandle;
     CFBundleRef bundleRef;
+
+   #if JUCE_MAC
+    CFBundleRefNum resFileId;
     FSSpec parentDirFSSpec;
-    ResFileRefNum resFileId;
+   #endif
 
     bool open()
     {
+        if (moduleMain != nullptr)
+            return true;
+
         bool ok = false;
 
         if (file.hasFileExtension (".vst"))
@@ -504,13 +516,18 @@ public:
                             if (pluginName.isEmpty())
                                 pluginName = file.getFileNameWithoutExtension();
 
+                           #if JUCE_MAC
                             resFileId = CFBundleOpenBundleResourceMap (bundleRef);
+                           #endif
 
                             ok = true;
 
                             Array<File> vstXmlFiles;
-                            file.getChildFile ("Contents")
+                            file
+                               #if JUCE_MAC
+                                .getChildFile ("Contents")
                                 .getChildFile ("Resources")
+                               #endif
                                 .findChildFiles (vstXmlFiles, File::findFiles, false, "*.vstxml");
 
                             if (vstXmlFiles.size() > 0)
@@ -535,7 +552,9 @@ public:
     {
         if (bundleRef != 0)
         {
+           #if JUCE_MAC
             CFBundleCloseBundleResourceMap (bundleRef, resFileId);
+           #endif
 
             if (CFGetRetainCount (bundleRef) == 1)
                 CFBundleUnloadExecutable (bundleRef);
@@ -550,7 +569,7 @@ public:
         eff->dispatcher (eff, effClose, 0, 0, 0, 0);
     }
 
-#endif
+  #endif
 
 private:
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleHandle)
@@ -615,6 +634,7 @@ public:
     ~VSTPluginInstance()
     {
         const ScopedLock sl (lock);
+        stopTimer();
 
         if (effect != nullptr && effect->magic == kEffectMagic)
         {
@@ -668,6 +688,18 @@ public:
         desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0);
     }
 
+    bool initialiseEffect (double initialSampleRate, int initialBlockSize)
+    {
+        if (effect != nullptr)
+        {
+            effect->resvd2 = (VstIntPtr) (pointer_sized_int) this;
+            initialise (initialSampleRate, initialBlockSize);
+            return true;
+        }
+
+        return false;
+    }
+
     void initialise (double initialSampleRate, int initialBlockSize)
     {
         if (initialised || effect == nullptr)
@@ -714,7 +746,7 @@ public:
         wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0;
 
        #if JUCE_MAC && JUCE_SUPPORT_CARBON
-        usesCocoaNSView = (pluginCanDo ("hasCockosViewAsConfig") & (int) 0xffff0000) == 0xbeef0000;
+        usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul;
        #endif
 
         setLatencySamples (effect->initialDelay);
@@ -856,7 +888,12 @@ public:
     }
 
     //==============================================================================
+   #if JUCE_IOS
+    bool hasEditor() const override                  { return false; }
+   #else
     bool hasEditor() const override                  { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; }
+   #endif
+
     AudioProcessorEditor* createEditor() override;
 
     //==============================================================================
@@ -1787,6 +1824,7 @@ private:
 };
 
 //==============================================================================
+#if ! JUCE_IOS
 class VSTPluginWindow;
 static Array<VSTPluginWindow*> activeVSTWindows;
 
@@ -2525,7 +2563,7 @@ private:
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow)
 };
-
+#endif
 #if JUCE_MSVC
  #pragma warning (pop)
 #endif
@@ -2533,8 +2571,12 @@ private:
 //==============================================================================
 AudioProcessorEditor* VSTPluginInstance::createEditor()
 {
+   #if JUCE_IOS
+    return nullptr;
+   #else
     return hasEditor() ? new VSTPluginWindow (*this)
                        : nullptr;
+   #endif
 }
 
 //==============================================================================
@@ -2647,12 +2689,7 @@ void VSTPluginFormat::createPluginInstance (const PluginDescription& desc,
 
             result = new VSTPluginInstance (module);
 
-            if (result->effect != nullptr)
-            {
-                result->effect->resvd2 = (VstIntPtr) (pointer_sized_int) (VSTPluginInstance*) result;
-                result->initialise (sampleRate, blockSize);
-            }
-            else
+            if (! result->initialiseEffect (sampleRate, blockSize))
                 result = nullptr;
         }
 
@@ -2676,7 +2713,7 @@ bool VSTPluginFormat::fileMightContainThisPluginType (const String& fileOrIdenti
 {
     const File f (File::createFileWithoutCheckingPath (fileOrIdentifier));
 
-  #if JUCE_MAC
+  #if JUCE_MAC || JUCE_IOS
     return f.isDirectory() && f.hasFileExtension (".vst");
   #elif JUCE_WINDOWS
     return f.existsAsFile() && f.hasFileExtension (".dll");
@@ -2751,6 +2788,19 @@ FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch()
     paths.add (WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\Software\\VST\\VSTPluginsPath",
                                           programFiles + "\\VstPlugins"));
     return paths;
+   #elif JUCE_IOS
+    // on iOS you can only load plug-ins inside the hosts bundle folder
+    CFURLRef relativePluginDir = CFBundleCopyBuiltInPlugInsURL (CFBundleGetMainBundle());
+    CFURLRef pluginDir = CFURLCopyAbsoluteURL (relativePluginDir);
+    CFRelease (relativePluginDir);
+
+    CFStringRef path = CFURLCopyFileSystemPath (pluginDir, kCFURLPOSIXPathStyle);
+    CFRelease (pluginDir);
+
+    FileSearchPath retval (String (CFStringGetCStringPtr (path, kCFStringEncodingUTF8)));
+    CFRelease (path);
+
+    return retval;
    #endif
 }
 
@@ -2795,6 +2845,22 @@ bool VSTPluginFormat::setChunkData (AudioPluginInstance* plugin, const void* dat
     return false;
 }
 
+AudioPluginInstance* VSTPluginFormat::createCustomVSTFromMainCall (void* entryPointFunction,
+                                                                   double initialSampleRate, int initialBufferSize)
+{
+    ModuleHandle::Ptr module = new ModuleHandle (File(), (MainCall) entryPointFunction);
+
+    if (module->open())
+    {
+        ScopedPointer<VSTPluginInstance> result (new VSTPluginInstance (module));
+
+        if (result->initialiseEffect (initialSampleRate, initialBufferSize))
+            return result.release();
+    }
+
+    return nullptr;
+}
+
 void VSTPluginFormat::setExtraFunctions (AudioPluginInstance* plugin, ExtraFunctions* functions)
 {
     ScopedPointer<ExtraFunctions> f (functions);
diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h
index dc6ad74..02f4a57 100644
--- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h
+++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h
@@ -22,7 +22,7 @@
   ==============================================================================
 */
 
-#if (JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WIN || JUCE_LINUX)) || DOXYGEN
+#if (JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)) || DOXYGEN
 
 //==============================================================================
 /**
@@ -53,6 +53,13 @@ public:
     /** Attempts to set a VST's state from a chunk of memory. */
     static bool setChunkData (AudioPluginInstance* plugin, const void* data, int size, bool isPreset);
 
+    /** Given a suitable function pointer to a VSTPluginMain function, this will attempt to
+        instantiate and return a plugin for it.
+    */
+    static AudioPluginInstance* createCustomVSTFromMainCall (void* entryPointFunction,
+                                                             double initialSampleRate,
+                                                             int initialBufferSize);
+
     //==============================================================================
     /** Base class for some extra functions that can be attached to a VST plugin instance. */
     class ExtraFunctions
diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h
index 2c775db..3d72d4b 100644
--- a/modules/juce_audio_processors/juce_audio_processors.h
+++ b/modules/juce_audio_processors/juce_audio_processors.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_processors
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE audio processor classes
   description:      Classes for loading and playing VST, AU, or internally-generated audio processors.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp b/modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp
index 3873647..e12a226 100644
--- a/modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp
+++ b/modules/juce_audio_processors/processors/juce_AudioChannelSet.cpp
@@ -208,6 +208,13 @@ void AudioChannelSet::addChannel (ChannelType newChannel)
     channels.setBit (bit);
 }
 
+void AudioChannelSet::removeChannel (ChannelType newChannel)
+{
+    const int bit = static_cast<int> (newChannel);
+    jassert (bit >= 0 && bit < 1024);
+    channels.clearBit (bit);
+}
+
 AudioChannelSet AudioChannelSet::disabled()           { return AudioChannelSet(); }
 AudioChannelSet AudioChannelSet::mono()               { return AudioChannelSet (1u << centre); }
 AudioChannelSet AudioChannelSet::stereo()             { return AudioChannelSet ((1u << left) | (1u << right)); }
diff --git a/modules/juce_audio_processors/processors/juce_AudioChannelSet.h b/modules/juce_audio_processors/processors/juce_AudioChannelSet.h
index 3bfc2c6..8af8f87 100644
--- a/modules/juce_audio_processors/processors/juce_AudioChannelSet.h
+++ b/modules/juce_audio_processors/processors/juce_AudioChannelSet.h
@@ -166,10 +166,13 @@ public:
     /** Adds a channel to the set. */
     void addChannel (ChannelType newChannelType);
 
+    /** Removes a channel from the set. */
+    void removeChannel (ChannelType newChannelType);
+
     /** Returns the number of channels in the set. */
     int size() const noexcept;
 
-    /** Returns the number of channels in the set. */
+    /** Returns true if there are no channels in the set. */
     bool isDisabled() const noexcept                    { return size() == 0; }
 
     /** Returns an array of all the types in this channel set. */
@@ -195,6 +198,9 @@ public:
     /** Returns if this is a channel layout made-up of discrete channels. */
     bool isDiscreteLayout() const noexcept;
 
+    /** Intersect two channel layouts. */
+    void intersect (const AudioChannelSet& other)      { channels &= other.channels; }
+
     //==============================================================================
     bool operator== (const AudioChannelSet&) const noexcept;
     bool operator!= (const AudioChannelSet&) const noexcept;
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
index a5f4a79..b7eed3b 100644
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
@@ -292,6 +292,15 @@ const String AudioProcessor::getParameterName (int index)
     return String();
 }
 
+String AudioProcessor::getParameterID (int index)
+{
+    // Don't use getParamChecked here, as this must also work for legacy plug-ins
+    if (AudioProcessorParameterWithID* p = dynamic_cast<AudioProcessorParameterWithID*> (managedParameters[index]))
+        return p->paramID;
+
+    return String (index);
+}
+
 String AudioProcessor::getParameterName (int index, int maximumStringLength)
 {
     if (AudioProcessorParameter* p = managedParameters[index])
@@ -394,8 +403,16 @@ void AudioProcessor::suspendProcessing (const bool shouldBeSuspended)
 }
 
 void AudioProcessor::reset() {}
-void AudioProcessor::processBlockBypassed (AudioBuffer<float>&, MidiBuffer&) {}
-void AudioProcessor::processBlockBypassed (AudioBuffer<double>&, MidiBuffer&) {}
+
+template <typename floatType>
+void AudioProcessor::processBypassed (AudioBuffer<floatType>& buffer, MidiBuffer&)
+{
+    for (int ch = getMainBusNumInputChannels(); ch < getTotalNumOutputChannels(); ++ch)
+        buffer.clear (ch, 0, buffer.getNumSamples());
+}
+
+void AudioProcessor::processBlockBypassed (AudioBuffer<float>&  buffer, MidiBuffer& midi)    { processBypassed (buffer, midi); }
+void AudioProcessor::processBlockBypassed (AudioBuffer<double>& buffer, MidiBuffer& midi)    { processBypassed (buffer, midi); }
 
 void AudioProcessor::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
 {
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h
index cabb277..c997050 100644
--- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h
@@ -611,6 +611,17 @@ public:
     */
     virtual const String getParameterName (int parameterIndex);
 
+    /** Returns the ID of a particular parameter.
+
+        The ID is used to communicate the value or mapping of a particular parameter with
+        the host. By default this method will simply return a string representation of
+        index.
+
+        NOTE! This method will eventually be deprecated! It's recommended that you use the
+        AudioProcessorParameterWithID class instead to manage your parameters.
+     */
+    virtual String getParameterID (int index);
+
     /** Called by the host to find out the value of one of the filter's parameters.
 
         The host will expect the value returned to be between 0 and 1.0.
@@ -628,7 +639,7 @@ public:
         If you want to provide customised short versions of your parameter names that
         will look better in constrained spaces (e.g. the displays on hardware controller
         devices or mixing desks) then you should implement this method.
-        If you don't override it, the default implementation will call getParameterText(int),
+        If you don't override it, the default implementation will call getParameterName(int),
         and truncate the result.
 
         NOTE! This method will eventually be deprecated! It's recommended that you use
@@ -1002,6 +1013,9 @@ private:
     void disableNonMainBuses (bool isInput);
     void updateSpeakerFormatStrings();
 
+    template <typename floatType>
+    void processBypassed (AudioBuffer<floatType>&, MidiBuffer&);
+
     // This method is no longer used - you can delete it from your AudioProcessor classes.
     JUCE_DEPRECATED_WITH_BODY (virtual bool silenceInProducesSilenceOut() const, { return false; });
 
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp
index 07f865e..344d8c4 100644
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp
@@ -22,14 +22,16 @@
   ==============================================================================
 */
 
-AudioProcessorEditor::AudioProcessorEditor (AudioProcessor& p) noexcept  : processor (p)
+AudioProcessorEditor::AudioProcessorEditor (AudioProcessor& p) noexcept  : processor (p), constrainer (nullptr)
 {
+    initialise();
 }
 
-AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* p) noexcept  : processor (*p)
+AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* p) noexcept  : processor (*p), constrainer (nullptr)
 {
     // the filter must be valid..
     jassert (p != nullptr);
+    initialise();
 }
 
 AudioProcessorEditor::~AudioProcessorEditor()
@@ -37,7 +39,132 @@ AudioProcessorEditor::~AudioProcessorEditor()
     // if this fails, then the wrapper hasn't called editorBeingDeleted() on the
     // filter for some reason..
     jassert (processor.getActiveEditor() != this);
+    removeComponentListener (resizeListener);
 }
 
 void AudioProcessorEditor::setControlHighlight (ParameterControlHighlightInfo) {}
 int AudioProcessorEditor::getControlParameterIndex (Component&)  { return -1; }
+
+void AudioProcessorEditor::initialise()
+{
+    resizable = false;
+
+    attachConstrainer (&defaultConstrainer);
+    addComponentListener (resizeListener = new AudioProcessorEditorListener (this));
+}
+
+//==============================================================================
+void AudioProcessorEditor::setResizable (const bool shouldBeResizable, const bool useBottomRightCornerResizer)
+{
+    if (shouldBeResizable != resizable)
+    {
+        resizable = shouldBeResizable;
+
+        if (! resizable)
+        {
+            setConstrainer (&defaultConstrainer);
+
+            if (getWidth() > 0 && getHeight() > 0)
+            {
+                defaultConstrainer.setSizeLimits (getWidth(), getHeight(), getWidth(), getHeight());
+                resized();
+            }
+        }
+    }
+
+    const bool shouldHaveCornerResizer = (useBottomRightCornerResizer && shouldBeResizable);
+    if (shouldHaveCornerResizer != (resizableCorner != nullptr))
+    {
+        if (shouldHaveCornerResizer)
+        {
+            Component::addChildComponent (resizableCorner = new ResizableCornerComponent (this, constrainer));
+            resizableCorner->setAlwaysOnTop (true);
+        }
+        else
+            resizableCorner = nullptr;
+    }
+}
+
+void AudioProcessorEditor::setResizeLimits (const int newMinimumWidth,
+                                            const int newMinimumHeight,
+                                            const int newMaximumWidth,
+                                            const int newMaximumHeight) noexcept
+{
+    // if you've set up a custom constrainer then these settings won't have any effect..
+    jassert (constrainer == &defaultConstrainer || constrainer == nullptr);
+
+    const bool shouldEnableResize      = (newMinimumWidth != newMaximumWidth || newMinimumHeight != newMaximumHeight);
+    const bool shouldHaveCornerResizer = (shouldEnableResize != resizable    || resizableCorner != nullptr);
+
+    setResizable (shouldEnableResize, shouldHaveCornerResizer);
+
+    if (constrainer == nullptr)
+        setConstrainer (&defaultConstrainer);
+
+    defaultConstrainer.setSizeLimits (newMinimumWidth, newMinimumHeight,
+                                      newMaximumWidth, newMaximumHeight);
+
+    setBoundsConstrained (getBounds());
+}
+
+void AudioProcessorEditor::setConstrainer (ComponentBoundsConstrainer* newConstrainer)
+{
+    if (constrainer != newConstrainer)
+    {
+        resizable = true;
+        attachConstrainer (newConstrainer);
+    }
+}
+
+void AudioProcessorEditor::attachConstrainer (ComponentBoundsConstrainer* newConstrainer)
+{
+    if (constrainer != newConstrainer)
+    {
+        constrainer = newConstrainer;
+        updatePeer();
+    }
+}
+
+void AudioProcessorEditor::setBoundsConstrained (Rectangle<int> newBounds)
+{
+    if (constrainer != nullptr)
+        constrainer->setBoundsForComponent (this, newBounds, false, false, false, false);
+    else
+        setBounds (newBounds);
+}
+
+void AudioProcessorEditor::editorResized (bool wasResized)
+{
+    if (wasResized)
+    {
+        bool resizerHidden = false;
+
+        if (ComponentPeer* peer = getPeer())
+            resizerHidden = peer->isFullScreen() || peer->isKioskMode();
+
+        if (resizableCorner != nullptr)
+        {
+           resizableCorner->setVisible (! resizerHidden);
+
+            const int resizerSize = 18;
+            resizableCorner->setBounds (getWidth() - resizerSize,
+                                        getHeight() - resizerSize,
+                                        resizerSize, resizerSize);
+        }
+
+
+        if (! resizable)
+        {
+            if (getWidth() > 0 && getHeight() > 0)
+                defaultConstrainer.setSizeLimits (getWidth(), getHeight(),
+                                                  getWidth(), getHeight());
+        }
+    }
+}
+
+void AudioProcessorEditor::updatePeer()
+{
+    if (isOnDesktop())
+        if (ComponentPeer* const peer = getPeer())
+            peer->setConstrainer (constrainer);
+}
diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h
index e043c37..e28de0a 100644
--- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h
+++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h
@@ -25,7 +25,7 @@
 #ifndef JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED
 #define JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED
 
-
+class AudioProcessorEditorListener;
 //==============================================================================
 /**
     Base class for the component that acts as the GUI for an AudioProcessor.
@@ -84,7 +84,83 @@ public:
     */
     virtual int getControlParameterIndex (Component&);
 
+    //==============================================================================
+    /** Make the editor resizable or fixed.
+
+        @param shouldBeResizable   whether it's resizable at all
+        @see setResizeLimits, isResizable
+    */
+    void setResizable (bool shouldBeResizable, bool useBottomRightCornerResizer);
+
+    /** Returns true if resizing is enabled.
+
+        @see setResizable
+    */
+    bool isResizable() const noexcept      { return resizable; }
+
+    /** This sets the maximum and minimum sizes for the window.
+
+        If the window's current size is outside these limits, it will be resized to
+        make sure it's within them.
+
+        A direct call to setBounds() will bypass any constraint checks, but when the
+        window is dragged by the user or resized by other indirect means, the constrainer
+        will limit the numbers involved.
+
+        @see setResizable
+    */
+    void setResizeLimits (int newMinimumWidth,
+                          int newMinimumHeight,
+                          int newMaximumWidth,
+                          int newMaximumHeight) noexcept;
+
+
+    /** Returns the bounds constrainer object that this window is using.
+        You can access this to change its properties.
+    */
+    ComponentBoundsConstrainer* getConstrainer() noexcept           { return constrainer; }
+
+    /** Sets the bounds-constrainer object to use for resizing and dragging this window.
+
+        A pointer to the object you pass in will be kept, but it won't be deleted
+        by this object, so it's the caller's responsibility to manage it.
+
+        If you pass a nullptr, then no contraints will be placed on the positioning of the window.
+    */
+    void setConstrainer (ComponentBoundsConstrainer* newConstrainer);
+
+    /** Calls the window's setBounds method, after first checking these bounds
+        with the current constrainer.
+
+        @see setConstrainer
+     */
+    void setBoundsConstrained (Rectangle<int> newBounds);
+
+    ScopedPointer<ResizableCornerComponent> resizableCorner;
+
 private:
+    //==============================================================================
+    struct AudioProcessorEditorListener : ComponentListener
+    {
+        AudioProcessorEditorListener (AudioProcessorEditor* audioEditor) : e (audioEditor) {}
+
+        void componentMovedOrResized (Component&, bool, bool wasResized) override   { e->editorResized (wasResized); }
+        void componentParentHierarchyChanged (Component&) override                  { e->updatePeer(); }
+        AudioProcessorEditor* e;
+    };
+
+    //==============================================================================
+    void initialise();
+    void editorResized (bool wasResized);
+    void updatePeer();
+    void attachConstrainer (ComponentBoundsConstrainer* newConstrainer);
+
+    //==============================================================================
+    ScopedPointer<AudioProcessorEditorListener> resizeListener;
+    bool resizable;
+    ComponentBoundsConstrainer defaultConstrainer;
+    ComponentBoundsConstrainer* constrainer;
+
     JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditor)
 };
 
diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
index e1ba865..a8918a7 100644
--- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
+++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
@@ -105,6 +105,16 @@ private:
             }
         }
 
+        void startedDragging() override
+        {
+            owner.beginParameterChangeGesture(index);
+        }
+
+        void stoppedDragging() override
+        {
+            owner.endParameterChangeGesture(index);
+        }
+
         String getTextFromValue (double /*value*/) override
         {
             return owner.getParameterText (index) + " " + owner.getParameterLabel (index).trimEnd();
diff --git a/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp
index b53aae3..5d45ac6 100644
--- a/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp
+++ b/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp
@@ -27,6 +27,8 @@ KnownPluginList::~KnownPluginList() {}
 
 void KnownPluginList::clear()
 {
+    ScopedLock lock (typesArrayLock);
+
     if (types.size() > 0)
     {
         types.clear();
@@ -36,6 +38,8 @@ void KnownPluginList::clear()
 
 PluginDescription* KnownPluginList::getTypeForFile (const String& fileOrIdentifier) const
 {
+    ScopedLock lock (typesArrayLock);
+
     for (int i = 0; i < types.size(); ++i)
         if (types.getUnchecked(i)->fileOrIdentifier == fileOrIdentifier)
             return types.getUnchecked(i);
@@ -45,6 +49,8 @@ PluginDescription* KnownPluginList::getTypeForFile (const String& fileOrIdentifi
 
 PluginDescription* KnownPluginList::getTypeForIdentifierString (const String& identifierString) const
 {
+    ScopedLock lock (typesArrayLock);
+
     for (int i = 0; i < types.size(); ++i)
         if (types.getUnchecked(i)->matchesIdentifierString (identifierString))
             return types.getUnchecked(i);
@@ -54,27 +60,37 @@ PluginDescription* KnownPluginList::getTypeForIdentifierString (const String& id
 
 bool KnownPluginList::addType (const PluginDescription& type)
 {
-    for (int i = types.size(); --i >= 0;)
     {
-        if (types.getUnchecked(i)->isDuplicateOf (type))
+        ScopedLock lock (typesArrayLock);
+
+        for (int i = types.size(); --i >= 0;)
         {
-            // strange - found a duplicate plugin with different info..
-            jassert (types.getUnchecked(i)->name == type.name);
-            jassert (types.getUnchecked(i)->isInstrument == type.isInstrument);
+            if (types.getUnchecked(i)->isDuplicateOf (type))
+            {
+                // strange - found a duplicate plugin with different info..
+                jassert (types.getUnchecked(i)->name == type.name);
+                jassert (types.getUnchecked(i)->isInstrument == type.isInstrument);
 
-            *types.getUnchecked(i) = type;
-            return false;
+                *types.getUnchecked(i) = type;
+                return false;
+            }
         }
+
+        types.insert (0, new PluginDescription (type));
     }
 
-    types.insert (0, new PluginDescription (type));
     sendChangeMessage();
     return true;
 }
 
 void KnownPluginList::removeType (const int index)
 {
-    types.remove (index);
+    {
+        ScopedLock lock (typesArrayLock);
+
+        types.remove (index);
+    }
+
     sendChangeMessage();
 }
 
@@ -84,6 +100,8 @@ bool KnownPluginList::isListingUpToDate (const String& fileOrIdentifier,
     if (getTypeForFile (fileOrIdentifier) == nullptr)
         return false;
 
+    ScopedLock lock (typesArrayLock);
+
     for (int i = types.size(); --i >= 0;)
     {
         const PluginDescription* const d = types.getUnchecked(i);
@@ -113,6 +131,8 @@ bool KnownPluginList::scanAndAddFile (const String& fileOrIdentifier,
     {
         bool needsRescanning = false;
 
+        ScopedLock lock (typesArrayLock);
+
         for (int i = types.size(); --i >= 0;)
         {
             const PluginDescription* const d = types.getUnchecked(i);
@@ -298,12 +318,17 @@ void KnownPluginList::sort (const SortMethod method, bool forwards)
     if (method != defaultOrder)
     {
         Array<PluginDescription*> oldOrder, newOrder;
-        oldOrder.addArray (types);
 
-        PluginSorter sorter (method, forwards);
-        types.sort (sorter, true);
+        {
+            ScopedLock lock (typesArrayLock);
+
+            oldOrder.addArray (types);
+
+            PluginSorter sorter (method, forwards);
+            types.sort (sorter, true);
 
-        newOrder.addArray (types);
+            newOrder.addArray (types);
+        }
 
         if (oldOrder != newOrder)
             sendChangeMessage();
@@ -315,8 +340,12 @@ XmlElement* KnownPluginList::createXml() const
 {
     XmlElement* const e = new XmlElement ("KNOWNPLUGINS");
 
-    for (int i = types.size(); --i >= 0;)
-        e->prependChildElement (types.getUnchecked(i)->createXml());
+    {
+        ScopedLock lock (typesArrayLock);
+
+        for (int i = types.size(); --i >= 0;)
+            e->prependChildElement (types.getUnchecked(i)->createXml());
+    }
 
     for (int i = 0; i < blacklist.size(); ++i)
         e->createNewChildElement ("BLACKLISTED")->setAttribute ("id", blacklist[i]);
@@ -516,6 +545,7 @@ KnownPluginList::PluginTree* KnownPluginList::createTree (const SortMethod sortM
     Array<PluginDescription*> sorted;
 
     {
+        ScopedLock lock (typesArrayLock);
         PluginSorter sorter (sortMethod, true);
 
         for (int i = 0; i < types.size(); ++i)
diff --git a/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/modules/juce_audio_processors/scanning/juce_KnownPluginList.h
index 252c542..7be3c76 100644
--- a/modules/juce_audio_processors/scanning/juce_KnownPluginList.h
+++ b/modules/juce_audio_processors/scanning/juce_KnownPluginList.h
@@ -216,7 +216,7 @@ private:
     OwnedArray<PluginDescription> types;
     StringArray blacklist;
     ScopedPointer<CustomScanner> scanner;
-    CriticalSection scanLock;
+    CriticalSection scanLock, typesArrayLock;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownPluginList)
 };
diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
index 37adaa3..a321a5d 100644
--- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
+++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
@@ -348,8 +348,10 @@ public:
 
         if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format.
         {
+           #if ! JUCE_IOS
             if (propertiesToUse != nullptr)
                 path = getLastSearchPath (*propertiesToUse, formatToScan);
+           #endif
 
             pathList.setSize (500, 300);
             pathList.setPath (path);
diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp
index 3d242df..1cbbadd 100644
--- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp
+++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp
@@ -25,7 +25,7 @@
 #if JUCE_COMPILER_SUPPORTS_LAMBDAS
 
 //==============================================================================
-struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParameter,
+struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParameterWithID,
                                                    private ValueTree::Listener
 {
     Parameter (AudioProcessorValueTreeState& s,
@@ -33,7 +33,8 @@ struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParamete
                NormalisableRange<float> r, float defaultVal,
                std::function<String (float)> valueToText,
                std::function<float (const String&)> textToValue)
-        : owner (s), paramID (parameterID), name (paramName), label (labelText),
+        : AudioProcessorParameterWithID (parameterID, paramName),
+          owner (s), label (labelText),
           valueToTextFunction (valueToText),
           textToValueFunction (textToValue),
           range (r), value (defaultVal), defaultValue (defaultVal),
@@ -51,7 +52,6 @@ struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParamete
 
     float getValue() const override                             { return range.convertTo0to1 (value); }
     float getDefaultValue() const override                      { return range.convertTo0to1 (defaultValue); }
-    String getName (int maximumStringLength) const override     { return name.substring (0, maximumStringLength); }
     String getLabel() const override                            { return label; }
 
     float getValueForText (const String& text) const override
@@ -141,7 +141,7 @@ struct AudioProcessorValueTreeState::Parameter   : public AudioProcessorParamete
 
     AudioProcessorValueTreeState& owner;
     ValueTree state;
-    String paramID, name, label;
+    String label;
     ListenerList<AudioProcessorValueTreeState::Listener> listeners;
     std::function<String (float)> valueToTextFunction;
     std::function<float (const String&)> textToValueFunction;
diff --git a/modules/juce_audio_utils/juce_audio_utils.h b/modules/juce_audio_utils/juce_audio_utils.h
index 5181222..2de78b5 100644
--- a/modules/juce_audio_utils/juce_audio_utils.h
+++ b/modules/juce_audio_utils/juce_audio_utils.h
@@ -33,7 +33,7 @@
 
   ID:               juce_audio_utils
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE extra audio utility classes
   description:      Classes for audio-related GUI and miscellaneous tasks.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h b/modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h
index 00f209a..a5bde5b 100644
--- a/modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h
+++ b/modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h
@@ -239,7 +239,7 @@ inline void b2Contact::SetEnabled(bool flag)
 	}
 	else
 	{
-		m_flags &= ~e_enabledFlag;
+		m_flags &= ~((unsigned int) e_enabledFlag);
 	}
 }
 
diff --git a/modules/juce_box2d/juce_box2d.h b/modules/juce_box2d/juce_box2d.h
index 6d2128b..bf5f9da 100644
--- a/modules/juce_box2d/juce_box2d.h
+++ b/modules/juce_box2d/juce_box2d.h
@@ -33,7 +33,7 @@
 
   ID:               juce_box2d
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE wrapper for the Box2D physics engine
   description:      The Box2D physics engine and some utility classes.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_core/containers/juce_Array.h b/modules/juce_core/containers/juce_Array.h
index 30e6de8..7b536e2 100644
--- a/modules/juce_core/containers/juce_Array.h
+++ b/modules/juce_core/containers/juce_Array.h
@@ -540,13 +540,17 @@ public:
         will be done.
 
         @param newElement   the new object to add to the array
+        @return             true if the element was added to the array; false otherwise.
     */
-    void addIfNotAlreadyThere (ParameterType newElement)
+    bool addIfNotAlreadyThere (ParameterType newElement)
     {
         const ScopedLockType lock (getLock());
 
-        if (! contains (newElement))
-            add (newElement);
+        if (contains (newElement))
+            return false;
+
+        add (newElement);
+        return true;
     }
 
     /** Replaces an element with a new value.
diff --git a/modules/juce_core/containers/juce_OwnedArray.h b/modules/juce_core/containers/juce_OwnedArray.h
index 9fdb61e..a64c9cb 100644
--- a/modules/juce_core/containers/juce_OwnedArray.h
+++ b/modules/juce_core/containers/juce_OwnedArray.h
@@ -378,16 +378,17 @@ public:
         If the array already contains a matching object, nothing will be done.
 
         @param newObject   the new object to add to the array
-        @returns           the new object that was added
+        @returns           true if the new object was added, false otherwise
     */
-    ObjectClass* addIfNotAlreadyThere (ObjectClass* newObject) noexcept
+    bool addIfNotAlreadyThere (ObjectClass* newObject) noexcept
     {
         const ScopedLockType lock (getLock());
 
-        if (! contains (newObject))
-            add (newObject);
+        if (contains (newObject))
+            return false;
 
-        return newObject;
+        add (newObject);
+        return true;
     }
 
     /** Replaces an object in the array with a different one.
diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.h b/modules/juce_core/containers/juce_ReferenceCountedArray.h
index 87d7639..e5dfe96 100644
--- a/modules/juce_core/containers/juce_ReferenceCountedArray.h
+++ b/modules/juce_core/containers/juce_ReferenceCountedArray.h
@@ -386,12 +386,17 @@ public:
         If the array already contains a matching object, nothing will be done.
 
         @param newObject   the new object to add to the array
+        @returns           true if the object has been added, false otherwise
     */
-    void addIfNotAlreadyThere (ObjectClass* const newObject) noexcept
+    bool addIfNotAlreadyThere (ObjectClass* const newObject) noexcept
     {
         const ScopedLockType lock (getLock());
-        if (! contains (newObject))
-            add (newObject);
+
+        if (contains (newObject))
+            return false;
+
+        add (newObject);
+        return true;
     }
 
     /** Replaces an object in the array with a different one.
diff --git a/modules/juce_core/containers/juce_Variant.cpp b/modules/juce_core/containers/juce_Variant.cpp
index 9e3335d..01c65ed 100644
--- a/modules/juce_core/containers/juce_Variant.cpp
+++ b/modules/juce_core/containers/juce_Variant.cpp
@@ -504,6 +504,7 @@ var& var::operator= (const double v)             { type->cleanUp (value); type =
 var& var::operator= (const char* const v)        { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; }
 var& var::operator= (const wchar_t* const v)     { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; }
 var& var::operator= (const String& v)            { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; }
+var& var::operator= (const MemoryBlock& v)       { type->cleanUp (value); type = &VariantType_Binary::instance; value.binaryValue = new MemoryBlock (v); return *this; }
 var& var::operator= (const Array<var>& v)        { var v2 (v); swapWith (v2); return *this; }
 var& var::operator= (ReferenceCountedObject* v)  { var v2 (v); swapWith (v2); return *this; }
 var& var::operator= (NativeFunction v)           { var v2 (v); swapWith (v2); return *this; }
diff --git a/modules/juce_core/containers/juce_Variant.h b/modules/juce_core/containers/juce_Variant.h
index 8720a0d..4b57c6a 100644
--- a/modules/juce_core/containers/juce_Variant.h
+++ b/modules/juce_core/containers/juce_Variant.h
@@ -95,6 +95,7 @@ public:
     var& operator= (const char* value);
     var& operator= (const wchar_t* value);
     var& operator= (const String& value);
+    var& operator= (const MemoryBlock& value);
     var& operator= (const Array<var>& value);
     var& operator= (ReferenceCountedObject* object);
     var& operator= (NativeFunction method);
diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp
index 4463a04..bebdeed 100644
--- a/modules/juce_core/files/juce_File.cpp
+++ b/modules/juce_core/files/juce_File.cpp
@@ -73,19 +73,40 @@ const File File::nonexistent;
 //==============================================================================
 static String removeEllipsis (const String& path)
 {
-    StringArray toks;
-    toks.addTokens (path, File::separatorString, StringRef());
-
-    for (int i = 1; i < toks.size(); ++i)
+    // This will quickly find both /../ and /./ at the expense of a minor
+    // false-positive performance hit when path elements end in a dot.
+   #if JUCE_WINDOWS
+    if (path.contains (".\\"))
+   #else
+    if (path.contains ("./"))
+   #endif
     {
-        if (toks[i] == ".." && toks[i - 1] != "..")
+        StringArray toks;
+        toks.addTokens (path, File::separatorString, StringRef());
+        bool anythingChanged = false;
+
+        for (int i = 1; i < toks.size(); ++i)
         {
-            toks.removeRange (i - 1, 2);
-            i = jmax (0, i - 2);
+            const String& t = toks[i];
+
+            if (t == ".." && toks[i - 1] != "..")
+            {
+                anythingChanged = true;
+                toks.removeRange (i - 1, 2);
+                i = jmax (0, i - 2);
+            }
+            else if (t == ".")
+            {
+                anythingChanged = true;
+                toks.remove (i--);
+            }
         }
+
+        if (anythingChanged)
+            return toks.joinIntoString (File::separatorString);
     }
 
-    return toks.joinIntoString (File::separatorString);
+    return path;
 }
 
 String File::parseAbsolutePath (const String& p)
@@ -95,10 +116,7 @@ String File::parseAbsolutePath (const String& p)
 
 #if JUCE_WINDOWS
     // Windows..
-    String path (p.replaceCharacter ('/', '\\'));
-
-    if (path.contains ("\\..\\"))
-        path = removeEllipsis (path);
+    String path (removeEllipsis (p.replaceCharacter ('/', '\\')));
 
     if (path.startsWithChar (separator))
     {
@@ -137,10 +155,7 @@ String File::parseAbsolutePath (const String& p)
     // If that's why you've ended up here, use File::getChildFile() to build your paths instead.
     jassert ((! p.containsChar ('\\')) || (p.indexOfChar ('/') >= 0 && p.indexOfChar ('/') < p.indexOfChar ('\\')));
 
-    String path (p);
-
-    if (path.contains ("/../"))
-        path = removeEllipsis (path);
+    String path (removeEllipsis (p));
 
     if (path.startsWithChar ('~'))
     {
@@ -1058,7 +1073,9 @@ public:
         expect (home.getChildFile ("././xyz") == home.getChildFile ("xyz"));
         expect (home.getChildFile ("../xyz") == home.getParentDirectory().getChildFile ("xyz"));
         expect (home.getChildFile (".././xyz") == home.getParentDirectory().getChildFile ("xyz"));
+        expect (home.getChildFile (".././xyz/./abc") == home.getParentDirectory().getChildFile ("xyz/abc"));
         expect (home.getChildFile ("./../xyz") == home.getParentDirectory().getChildFile ("xyz"));
+        expect (home.getChildFile ("a1/a2/a3/./../../a4") == home.getChildFile ("a1/a4"));
 
         {
             FileOutputStream fo (tempFile);
diff --git a/modules/juce_core/files/juce_FileSearchPath.cpp b/modules/juce_core/files/juce_FileSearchPath.cpp
index 5531c62..629ac60 100644
--- a/modules/juce_core/files/juce_FileSearchPath.cpp
+++ b/modules/juce_core/files/juce_FileSearchPath.cpp
@@ -87,13 +87,14 @@ void FileSearchPath::add (const File& dir, const int insertIndex)
     directories.insert (insertIndex, dir.getFullPathName());
 }
 
-void FileSearchPath::addIfNotAlreadyThere (const File& dir)
+bool FileSearchPath::addIfNotAlreadyThere (const File& dir)
 {
     for (int i = 0; i < directories.size(); ++i)
         if (File (directories[i]) == dir)
-            return;
+            return false;
 
     add (dir);
+    return true;
 }
 
 void FileSearchPath::remove (const int index)
diff --git a/modules/juce_core/files/juce_FileSearchPath.h b/modules/juce_core/files/juce_FileSearchPath.h
index 3744a49..1089c8b 100644
--- a/modules/juce_core/files/juce_FileSearchPath.h
+++ b/modules/juce_core/files/juce_FileSearchPath.h
@@ -92,8 +92,11 @@ public:
     void add (const File& directoryToAdd,
               int insertIndex = -1);
 
-    /** Adds a new directory to the search path if it's not already in there. */
-    void addIfNotAlreadyThere (const File& directoryToAdd);
+    /** Adds a new directory to the search path if it's not already in there.
+
+        @return true if the directory has been added, false otherwise.
+    */
+    bool addIfNotAlreadyThere (const File& directoryToAdd);
 
     /** Removes a directory from the search path. */
     void remove (int indexToRemove);
diff --git a/modules/juce_core/javascript/juce_JSON.cpp b/modules/juce_core/javascript/juce_JSON.cpp
index 98762a6..455412c 100644
--- a/modules/juce_core/javascript/juce_JSON.cpp
+++ b/modules/juce_core/javascript/juce_JSON.cpp
@@ -571,6 +571,19 @@ public:
         return CharPointer_ASCII (buffer);
     }
 
+    // (creates a random double that can be easily stringified, to avoid
+    // false failures when decimal places are rounded or truncated slightly)
+    static var createRandomDouble (Random& r)
+    {
+        for (;;)
+        {
+            var v (String (r.nextDouble() * 1000.0, 20).getDoubleValue());
+
+            if (v.toString() == String (static_cast<double> (v), 20))
+                return v;
+        }
+    }
+
     static var createRandomVar (Random& r, int depth)
     {
         switch (r.nextInt (depth > 3 ? 6 : 8))
@@ -579,7 +592,7 @@ public:
             case 1:     return r.nextInt();
             case 2:     return r.nextInt64();
             case 3:     return r.nextBool();
-            case 4:     return String (r.nextDouble(), 8).getDoubleValue();
+            case 4:     return createRandomDouble (r);
             case 5:     return createRandomWideCharString (r);
 
             case 6:
diff --git a/modules/juce_core/javascript/juce_Javascript.cpp b/modules/juce_core/javascript/juce_Javascript.cpp
index 44bc7a6..2fa845f 100644
--- a/modules/juce_core/javascript/juce_Javascript.cpp
+++ b/modules/juce_core/javascript/juce_Javascript.cpp
@@ -67,12 +67,13 @@ struct JavascriptEngine::RootObject   : public DynamicObject
 {
     RootObject()
     {
-        setMethod ("exec",      exec);
-        setMethod ("eval",      eval);
-        setMethod ("trace",     trace);
-        setMethod ("charToInt", charToInt);
-        setMethod ("parseInt",  IntegerClass::parseInt);
-        setMethod ("typeof",    typeof_internal);
+        setMethod ("exec",       exec);
+        setMethod ("eval",       eval);
+        setMethod ("trace",      trace);
+        setMethod ("charToInt",  charToInt);
+        setMethod ("parseInt",   IntegerClass::parseInt);
+        setMethod ("typeof",     typeof_internal);
+        setMethod ("parseFloat", parseFloat);
     }
 
     Time timeout;
@@ -1505,6 +1506,8 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             setMethod ("remove",   remove);
             setMethod ("join",     join);
             setMethod ("push",     push);
+            setMethod ("splice",   splice);
+            setMethod ("indexOf",  indexOf);
         }
 
         static Identifier getClassName()   { static const Identifier i ("Array"); return i; }
@@ -1548,6 +1551,52 @@ struct JavascriptEngine::RootObject   : public DynamicObject
 
             return var::undefined();
         }
+
+        static var splice (Args a)
+        {
+            if (Array<var>* array = a.thisObject.getArray())
+            {
+                const int arraySize = array->size();
+                int start = get (a, 0);
+
+                if (start < 0)
+                    start = jmax (0, arraySize + start);
+                else if (start > arraySize)
+                    start = arraySize;
+
+                const int num = a.numArguments > 1 ? jlimit (0, arraySize - start, getInt (a, 1))
+                                                   : arraySize - start;
+
+                Array<var> itemsRemoved;
+                itemsRemoved.ensureStorageAllocated (num);
+
+                for (int i = 0; i < num; ++i)
+                    itemsRemoved.add (array->getReference (start + i));
+
+                array->removeRange (start, num);
+
+                for (int i = 2; i < a.numArguments; ++i)
+                    array->insert (start++, get (a, i));
+
+                return itemsRemoved;
+            }
+
+            return var::undefined();
+        }
+
+        static var indexOf (Args a)
+        {
+            if (const Array<var>* array = a.thisObject.getArray())
+            {
+                const var target (get (a, 0));
+
+                for (int i = (a.numArguments > 1 ? getInt (a, 1) : 0); i < array->size(); ++i)
+                    if (array->getReference(i) == target)
+                        return i;
+            }
+
+            return -1;
+        }
     };
 
     //==============================================================================
@@ -1677,6 +1726,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
     //==============================================================================
     static var trace (Args a)      { Logger::outputDebugString (JSON::toString (a.thisObject)); return var::undefined(); }
     static var charToInt (Args a)  { return (int) (getString (a, 0)[0]); }
+    static var parseFloat (Args a) { return getDouble (a, 0); }
 
     static var typeof_internal (Args a)
     {
diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp
index 34d63a2..370e7d7 100644
--- a/modules/juce_core/juce_core.cpp
+++ b/modules/juce_core/juce_core.cpp
@@ -82,6 +82,7 @@
  #endif
 
  #if JUCE_LINUX
+  #include <stdio.h>
   #include <langinfo.h>
   #include <ifaddrs.h>
   #include <sys/resource.h>
diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h
index bb073d7..e27cdc8 100644
--- a/modules/juce_core/juce_core.h
+++ b/modules/juce_core/juce_core.h
@@ -38,7 +38,7 @@
 
   ID:               juce_core
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE core classes
   description:      The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_core/maths/juce_BigInteger.cpp b/modules/juce_core/maths/juce_BigInteger.cpp
index 81bcf61..d551245 100644
--- a/modules/juce_core/maths/juce_BigInteger.cpp
+++ b/modules/juce_core/maths/juce_BigInteger.cpp
@@ -385,12 +385,12 @@ BigInteger& BigInteger::operator+= (const BigInteger& other)
             BigInteger temp (*this);
             temp.negate();
             *this = other;
-            operator-= (temp);
+            *this -= temp;
         }
         else
         {
             negate();
-            operator-= (other);
+            *this -= other;
             negate();
         }
     }
@@ -436,7 +436,7 @@ BigInteger& BigInteger::operator-= (const BigInteger& other)
         {
             BigInteger temp (other);
             swapWith (temp);
-            operator-= (temp);
+            *this -= temp;
             negate();
             return *this;
         }
@@ -444,7 +444,7 @@ BigInteger& BigInteger::operator-= (const BigInteger& other)
     else
     {
         negate();
-        operator+= (other);
+        *this += other;
         negate();
         return *this;
     }
@@ -476,24 +476,40 @@ BigInteger& BigInteger::operator-= (const BigInteger& other)
 
 BigInteger& BigInteger::operator*= (const BigInteger& other)
 {
-    BigInteger total;
-    highestBit = getHighestBit();
+    int n = getHighestBit();
+    int t = other.getHighestBit();
+
     const bool wasNegative = isNegative();
     setNegative (false);
 
-    for (int i = 0; i <= highestBit; ++i)
+    BigInteger total;
+    total.highestBit = n + t + 1;
+
+    n >>= 5;
+    t >>= 5;
+
+    total.ensureSize ((size_t) (n + t + 2));
+
+    BigInteger m (other);
+    m.setNegative (false);
+
+    for (int i = 0; i <= t; ++i)
     {
-        if (operator[](i))
+        uint32 c = 0;
+
+        for (int j = 0; j <= n; ++j)
         {
-            BigInteger n (other);
-            n.setNegative (false);
-            n <<= i;
-            total += n;
+            uint64 uv = (uint64) total.values[i + j] + (uint64) values[j] * (uint64) m.values[i] + (uint64) c;
+            total.values[i + j] = (uint32) uv;
+            c = uv >> 32;
         }
+
+        total.values[i + n + 1] = c;
     }
 
     total.setNegative (wasNegative ^ other.isNegative());
     swapWith (total);
+
     return *this;
 }
 
@@ -683,7 +699,7 @@ void BigInteger::shiftLeft (int bits, const int startBit)
     if (startBit > 0)
     {
         for (int i = highestBit + 1; --i >= startBit;)
-            setBit (i + bits, operator[] (i));
+            setBit (i + bits, (*this) [i]);
 
         while (--bits >= 0)
             clearBit (bits + startBit);
@@ -726,7 +742,7 @@ void BigInteger::shiftRight (int bits, const int startBit)
     if (startBit > 0)
     {
         for (int i = startBit; i <= highestBit; ++i)
-            setBit (i, operator[] (i + bits));
+            setBit (i, (*this) [i + bits]);
 
         highestBit = getHighestBit();
     }
@@ -816,25 +832,128 @@ BigInteger BigInteger::findGreatestCommonDivisor (BigInteger n) const
 
 void BigInteger::exponentModulo (const BigInteger& exponent, const BigInteger& modulus)
 {
+    *this %= modulus;
     BigInteger exp (exponent);
     exp %= modulus;
 
-    BigInteger value (1);
-    swapWith (value);
-    value %= modulus;
+    if (modulus.getHighestBit() <= 32 || modulus % 2 == 0)
+    {
+        BigInteger a (*this);
+
+        const int n = exp.getHighestBit();
+
+        for (int i = n; --i >= 0;)
+        {
+            *this *= *this;
 
-    while (! exp.isZero())
+            if (exp[i])
+                *this *= a;
+
+            if (compareAbsolute (modulus) >= 0)
+                *this %= modulus;
+        }
+    }
+    else
     {
-        if (exp [0])
+        const int Rfactor = modulus.getHighestBit() + 1;
+        BigInteger R (1);
+        R.shiftLeft (Rfactor, 0);
+
+        BigInteger R1, m1, g;
+        g.extendedEuclidean (modulus, R, m1, R1);
+
+        if (! g.isOne())
         {
-            operator*= (value);
-            operator%= (modulus);
+            BigInteger a (*this);
+
+            for (int i = exp.getHighestBit(); --i >= 0;)
+            {
+                *this *= *this;
+
+                if (exp[i])
+                    *this *= a;
+
+                if (compareAbsolute (modulus) >= 0)
+                    *this %= modulus;
+            }
         }
+        else
+        {
+            BigInteger am (((*this) * R) % modulus);
+            BigInteger xm (am);
+            BigInteger um (R % modulus);
 
-        value *= value;
-        value %= modulus;
-        exp >>= 1;
+            for (int i = exp.getHighestBit(); --i >= 0;)
+            {
+                xm.montgomeryMultiplication (xm, modulus, m1, Rfactor);
+
+                if (exp[i])
+                    xm.montgomeryMultiplication (am, modulus, m1, Rfactor);
+            }
+
+            xm.montgomeryMultiplication (1, modulus, m1, Rfactor);
+            swapWith (xm);
+        }
+    }
+}
+
+void BigInteger::montgomeryMultiplication (const BigInteger& other, const BigInteger& modulus,
+                                           const BigInteger& modulusp, const int k)
+{
+    *this *= other;
+
+    BigInteger t (*this);
+
+    setRange (k, highestBit - k + 1, false);
+    *this *= modulusp;
+
+    setRange (k, highestBit - k + 1, false);
+    *this *= modulus;
+    *this += t;
+    shiftRight (k, 0);
+
+    if (compare (modulus) >= 0)
+        *this -= modulus;
+    else if (isNegative())
+        *this += modulus;
+}
+
+void BigInteger::extendedEuclidean (const BigInteger& a, const BigInteger& b,
+                                    BigInteger& x, BigInteger& y)
+{
+    BigInteger p(a), q(b), gcd(1);
+
+    Array<BigInteger> tempValues;
+
+    while (! q.isZero())
+    {
+        tempValues.add (p / q);
+        gcd = q;
+        q = p % q;
+        p = gcd;
+    }
+
+    x.clear();
+    y = 1;
+
+    for (int i = 1; i < tempValues.size(); ++i)
+    {
+        const BigInteger& v = tempValues.getReference (tempValues.size() - i - 1);
+
+        if ((i & 1) != 0)
+            x += y * v;
+        else
+            y += x * v;
     }
+
+    if (gcd.compareAbsolute (y * b - x * a) != 0)
+    {
+        x.negate();
+        x.swapWith (y);
+        x.negate();
+    }
+
+    swapWith (gcd);
 }
 
 void BigInteger::inverseModulo (const BigInteger& modulus)
@@ -846,7 +965,7 @@ void BigInteger::inverseModulo (const BigInteger& modulus)
     }
 
     if (isNegative() || compareAbsolute (modulus) >= 0)
-        operator%= (modulus);
+        *this %= modulus;
 
     if (isOne())
         return;
@@ -959,8 +1078,8 @@ void BigInteger::parseString (StringRef text, const int base)
 
             if (((uint32) digit) < (uint32) base)
             {
-                operator<<= (bits);
-                operator+= (digit);
+                *this <<= bits;
+                *this += digit;
             }
             else if (c == 0)
             {
@@ -978,8 +1097,8 @@ void BigInteger::parseString (StringRef text, const int base)
 
             if (c >= '0' && c <= '9')
             {
-                operator*= (ten);
-                operator+= ((int) (c - '0'));
+                *this *= ten;
+                *this += (int) (c - '0');
             }
             else if (c == 0)
             {
diff --git a/modules/juce_core/maths/juce_BigInteger.h b/modules/juce_core/maths/juce_BigInteger.h
index 2f99424..ada0e89 100644
--- a/modules/juce_core/maths/juce_BigInteger.h
+++ b/modules/juce_core/maths/juce_BigInteger.h
@@ -181,6 +181,22 @@ public:
     int getHighestBit() const noexcept;
 
     //==============================================================================
+    /** Returns true if the value is less than zero.
+        @see setNegative, negate
+    */
+    bool isNegative() const noexcept;
+
+    /** Changes the sign of the number to be positive or negative.
+        @see isNegative, negate
+    */
+    void setNegative (bool shouldBeNegative) noexcept;
+
+    /** Inverts the sign of the number.
+        @see isNegative, setNegative
+    */
+    void negate() noexcept;
+
+    //==============================================================================
     // All the standard arithmetic ops...
 
     BigInteger& operator+= (const BigInteger&);
@@ -236,6 +252,7 @@ public:
     */
     int compareAbsolute (const BigInteger& other) const noexcept;
 
+    //==============================================================================
     /** Divides this value by another one and returns the remainder.
 
         This number is divided by other, leaving the quotient in this number,
@@ -243,7 +260,7 @@ public:
     */
     void divideBy (const BigInteger& divisor, BigInteger& remainder);
 
-    /** Returns the largest value that will divide both this value and the one passed-in. */
+    /** Returns the largest value that will divide both this value and the argument. */
     BigInteger findGreatestCommonDivisor (BigInteger other) const;
 
     /** Performs a combined exponent and modulo operation.
@@ -256,21 +273,20 @@ public:
     */
     void inverseModulo (const BigInteger& modulus);
 
-    //==============================================================================
-    /** Returns true if the value is less than zero.
-        @see setNegative, negate
-    */
-    bool isNegative() const noexcept;
-
-    /** Changes the sign of the number to be positive or negative.
-        @see isNegative, negate
+    /** Performs the Montgomery Multiplication with modulo.
+        This object is left containing the result value: ((this * other) * R1) % modulus.
+        To get this result, we need modulus, modulusp and k such as R = 2^k, with
+        modulus * modulusp - R * R1 = GCD(modulus, R) = 1
     */
-    void setNegative (bool shouldBeNegative) noexcept;
+    void montgomeryMultiplication (const BigInteger& other, const BigInteger& modulus,
+                                   const BigInteger& modulusp, int k);
 
-    /** Inverts the sign of the number.
-        @see isNegative, setNegative
+    /** Performs the Extended Euclidean algorithm.
+        This method will set the xOut and yOut arguments such that (a * xOut) - (b * yOut) = GCD (a, b).
+        On return, this object is left containing the value of the GCD.
     */
-    void negate() noexcept;
+    void extendedEuclidean (const BigInteger& a, const BigInteger& b,
+                            BigInteger& xOut, BigInteger& yOut);
 
     //==============================================================================
     /** Converts the number to a string.
diff --git a/modules/juce_core/memory/juce_ReferenceCountedObject.h b/modules/juce_core/memory/juce_ReferenceCountedObject.h
index 9a2e9c7..cf60756 100644
--- a/modules/juce_core/memory/juce_ReferenceCountedObject.h
+++ b/modules/juce_core/memory/juce_ReferenceCountedObject.h
@@ -246,6 +246,14 @@ public:
         incIfNotNull (refCountedObject);
     }
 
+   #if JUCE_COMPILER_SUPPORTS_NULLPTR
+    /** Creates a pointer to a null object. */
+    ReferenceCountedObjectPtr (decltype (nullptr)) noexcept
+        : referencedObject (nullptr)
+    {
+    }
+   #endif
+
     /** Copies another pointer.
         This will increment the object's reference-count.
     */
@@ -258,7 +266,7 @@ public:
     /** Copies another pointer.
         This will increment the object's reference-count (if it is non-null).
     */
-    template <class Convertible>
+    template <typename Convertible>
     ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr<Convertible>& other) noexcept
         : referencedObject (static_cast<ReferencedType*> (other.get()))
     {
@@ -278,7 +286,7 @@ public:
         The reference count of the old object is decremented, and it might be
         deleted if it hits zero. The new object's count is incremented.
     */
-    template <class Convertible>
+    template <typename Convertible>
     ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr<Convertible>& other)
     {
         return operator= (static_cast<ReferencedType*> (other.get()));
@@ -370,42 +378,42 @@ private:
 
 //==============================================================================
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, ReferenceCountedObjectClass* const object2) noexcept
 {
     return object1.get() == object2;
 }
 
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
 {
     return object1.get() == object2.get();
 }
 
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator== (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
 {
     return object1 == object2.get();
 }
 
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectClass* object2) noexcept
 {
     return object1.get() != object2;
 }
 
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
 {
     return object1.get() != object2.get();
 }
 
 /** Compares two ReferenceCountedObjectPtrs. */
-template <class ReferenceCountedObjectClass>
+template <typename ReferenceCountedObjectClass>
 bool operator!= (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
 {
     return object1 != object2.get();
diff --git a/modules/juce_core/memory/juce_ScopedPointer.h b/modules/juce_core/memory/juce_ScopedPointer.h
index 6b46077..3db0c1c 100644
--- a/modules/juce_core/memory/juce_ScopedPointer.h
+++ b/modules/juce_core/memory/juce_ScopedPointer.h
@@ -76,6 +76,13 @@ public:
     {
     }
 
+   #if JUCE_COMPILER_SUPPORTS_NULLPTR
+    /** Creates a ScopedPointer containing a null pointer. */
+    inline ScopedPointer (decltype (nullptr)) noexcept   : object (nullptr)
+    {
+    }
+   #endif
+
     /** Creates a ScopedPointer that owns the specified object. */
     inline ScopedPointer (ObjectType* const objectToTakePossessionOf) noexcept
         : object (objectToTakePossessionOf)
diff --git a/modules/juce_core/native/juce_linux_Network.cpp b/modules/juce_core/native/juce_linux_Network.cpp
index a05518c..6401ca0 100644
--- a/modules/juce_core/native/juce_linux_Network.cpp
+++ b/modules/juce_core/native/juce_linux_Network.cpp
@@ -429,14 +429,15 @@ private:
         writeValueIfNotPresent (header, userHeaders, "Connection:", "close");
 
         if (isPost)
-        {
             writeValueIfNotPresent (header, userHeaders, "Content-Length:", String ((int) postData.getSize()));
-            header << userHeaders << "\r\n" << postData;
-        }
-        else
-        {
-            header << "\r\n" << userHeaders << "\r\n";
-        }
+
+        if (userHeaders.isNotEmpty())
+            header << "\r\n" << userHeaders;
+
+        header << "\r\n";
+
+        if (isPost)
+            header << postData;
 
         return header.getMemoryBlock();
     }
diff --git a/modules/juce_core/native/juce_mac_Network.mm b/modules/juce_core/native/juce_mac_Network.mm
index f14adc7..afde564 100644
--- a/modules/juce_core/native/juce_mac_Network.mm
+++ b/modules/juce_core/native/juce_mac_Network.mm
@@ -35,6 +35,7 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result)
         for (const ifaddrs* cursor = addrs; cursor != nullptr; cursor = cursor->ifa_next)
         {
             sockaddr_storage* sto = (sockaddr_storage*) cursor->ifa_addr;
+
             if (sto->ss_family == AF_LINK)
             {
                 const sockaddr_dl* const sadd = (const sockaddr_dl*) cursor->ifa_addr;
@@ -45,7 +46,7 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result)
 
                 if (sadd->sdl_type == IFT_ETHER)
                 {
-                    MACAddress ma (MACAddress (((const uint8*) sadd->sdl_data) + sadd->sdl_nlen));
+                    MACAddress ma (((const uint8*) sadd->sdl_data) + sadd->sdl_nlen);
 
                     if (! ma.isNull())
                         result.addIfNotAlreadyThere (ma);
@@ -109,6 +110,253 @@ bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailA
 }
 
 //==============================================================================
+// Unfortunately, we need to have this ugly ifdef here as long as some older OS X versions do not support NSURLSession
+#if JUCE_IOS || (defined (__MAC_OS_X_VERSION_MIN_REQUIRED) && defined (__MAC_10_10) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10)
+
+//==============================================================================
+class URLConnectionState   : private Thread
+{
+public:
+    URLConnectionState (NSURLRequest* req, const int maxRedirects)
+        : Thread ("http connection"),
+          request ([req retain]),
+          data ([[NSMutableData data] retain]),
+          numRedirectsToFollow (maxRedirects)
+    {
+        static DelegateClass cls;
+        delegate = [cls.createInstance() init];
+        DelegateClass::setState (delegate, this);
+    }
+
+    ~URLConnectionState()
+    {
+        stop();
+        [data release];
+        [request release];
+        [headers release];
+        [session release];
+        [delegate release];
+    }
+
+    bool start (URL::OpenStreamProgressCallback* callback, void* context)
+    {
+        startThread();
+
+        while (isThreadRunning() && ! initialised)
+        {
+            if (callback != nullptr)
+                callback (context, (int) latestTotalBytes, (int) [[request HTTPBody] length]);
+
+            Thread::sleep (1);
+        }
+
+        return true;
+    }
+
+    void stop()
+    {
+        {
+            const ScopedLock sl (dataLock);
+            [task cancel];
+        }
+
+        stopThread (10000);
+        [task release];
+        task = nil;
+    }
+
+    int read (char* dest, int numBytes)
+    {
+        int numDone = 0;
+
+        while (numBytes > 0)
+        {
+            const int available = jmin (numBytes, (int) [data length]);
+
+            if (available > 0)
+            {
+                const ScopedLock sl (dataLock);
+                [data getBytes: dest length: (NSUInteger) available];
+                [data replaceBytesInRange: NSMakeRange (0, (NSUInteger) available) withBytes: nil length: 0];
+
+                numDone += available;
+                numBytes -= available;
+                dest += available;
+            }
+            else
+            {
+                if (hasFailed || hasFinished)
+                    break;
+
+                Thread::sleep (1);
+            }
+        }
+
+        return numDone;
+    }
+
+    void didReceiveResponse (NSURLResponse* response, id completionHandler)
+    {
+        {
+            const ScopedLock sl (dataLock);
+            [data setLength: 0];
+        }
+
+        contentLength = [response expectedContentLength];
+
+        [headers release];
+        headers = nil;
+
+        if ([response isKindOfClass: [NSHTTPURLResponse class]])
+        {
+            auto httpResponse = (NSHTTPURLResponse*) response;
+            headers = [[httpResponse allHeaderFields] retain];
+            statusCode = (int) [httpResponse statusCode];
+        }
+
+        initialised = true;
+
+        if (completionHandler != nil)
+        {
+            // Need to wrangle this parameter back into an obj-C block,
+            // and call it to allow the transfer to continue..
+            void (^callbackBlock)(NSURLSessionResponseDisposition) = completionHandler;
+            callbackBlock (NSURLSessionResponseAllow);
+        }
+    }
+
+    void didBecomeInvalidWithError (NSError* error)
+    {
+        DBG (nsStringToJuce ([error description])); ignoreUnused (error);
+        hasFailed = true;
+        initialised = true;
+        signalThreadShouldExit();
+    }
+
+    void didReceiveData (NSData* newData)
+    {
+        const ScopedLock sl (dataLock);
+        [data appendData: newData];
+        initialised = true;
+    }
+
+    void didSendBodyData (int64_t totalBytesWritten)
+    {
+        latestTotalBytes = static_cast<int> (totalBytesWritten);
+    }
+
+    void willPerformHTTPRedirection (NSURLRequest* aRequest, void (^completionHandler)(NSURLRequest *))
+    {
+        NSURLRequest* newRequest = (numRedirects++ < numRedirectsToFollow ? aRequest : nullptr);
+        completionHandler (newRequest);
+    }
+
+    void run() override
+    {
+        jassert (task == nil && session == nil);
+
+        session = [[NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]
+                                                 delegate: delegate
+                                            delegateQueue: [NSOperationQueue currentQueue]] retain];
+
+        task = [session dataTaskWithRequest: request];
+
+        if (task == nil)
+            return;
+
+        [task retain];
+        [task resume];
+
+        while (! threadShouldExit())
+        {
+            wait (5);
+
+            if (task.state != NSURLSessionTaskStateRunning)
+                break;
+        }
+
+        hasFinished = true;
+        initialised = true;
+    }
+
+    int64 contentLength = -1;
+    CriticalSection dataLock;
+    id delegate = nil;
+    NSURLRequest* request = nil;
+    NSURLSession* session = nil;
+    NSURLSessionTask* task = nil;
+    NSMutableData* data = nil;
+    NSDictionary* headers = nil;
+    int statusCode = 0;
+    bool initialised = false, hasFailed = false, hasFinished = false;
+    const int numRedirectsToFollow;
+    int numRedirects = 0;
+    int64 latestTotalBytes = 0;
+
+private:
+    //==============================================================================
+    struct DelegateClass  : public ObjCClass<NSObject>
+    {
+        DelegateClass()  : ObjCClass<NSObject> ("JUCE_URLDelegate_")
+        {
+            addIvar<URLConnectionState*> ("state");
+
+            addMethod (@selector (URLSession:dataTask:didReceiveResponse:completionHandler:),
+                                                                            didReceiveResponse,        "v@:@@@@");
+            addMethod (@selector (URLSession:didBecomeInvalidWithError:),   didBecomeInvalidWithError, "v@:@@");
+            addMethod (@selector (URLSession:dataTask:didReceiveData:),     didReceiveData,            "v@:@@@");
+            addMethod (@selector (URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:),
+                                                                            didSendBodyData,           "v@:@@qqq");
+            addMethod (@selector (URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:),
+                                                                            willPerformHTTPRedirection, "v@:@@@@@");
+            registerClass();
+        }
+
+        static void setState (id self, URLConnectionState* state)  { object_setInstanceVariable (self, "state", state); }
+        static URLConnectionState* getState (id self)              { return getIvar<URLConnectionState*> (self, "state"); }
+
+    private:
+        static void didReceiveResponse (id self, SEL, NSURLSession*, NSURLSessionDataTask*, NSURLResponse* response, id completionHandler)
+        {
+            getState (self)->didReceiveResponse (response, completionHandler);
+        }
+
+        static void didBecomeInvalidWithError (id self, SEL, NSURLSession*, NSError* error)
+        {
+            getState (self)->didBecomeInvalidWithError (error);
+        }
+
+        static void didReceiveData (id self, SEL, NSURLSession*, NSURLSessionDataTask*, NSData* newData)
+        {
+            getState (self)->didReceiveData (newData);
+        }
+
+        static void didSendBodyData (id self, SEL, NSURLSession*, NSURLSessionTask*, int64_t, int64_t totalBytesWritten, int64_t)
+        {
+            getState (self)->didSendBodyData (totalBytesWritten);
+        }
+
+        static void willPerformHTTPRedirection (id self, SEL, NSURLSession*, NSURLSessionTask*, NSHTTPURLResponse*,
+                                                NSURLRequest* request, void (^completionHandler)(NSURLRequest *))
+        {
+            getState (self)->willPerformHTTPRedirection (request, completionHandler);
+        }
+    };
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (URLConnectionState)
+};
+
+//==============================================================================
+#else
+
+// This version is only used for backwards-compatibility with older OSX targets,
+// so we'll turn off deprecation warnings. This code will be removed at some point
+// in the future.
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+
+//==============================================================================
 class URLConnectionState   : public Thread
 {
 public:
@@ -160,7 +408,11 @@ public:
 
     void stop()
     {
-        [connection cancel];
+        {
+            const ScopedLock sl (dataLock);
+            [connection cancel];
+        }
+
         stopThread (10000);
     }
 
@@ -339,6 +591,10 @@ private:
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (URLConnectionState)
 };
 
+#pragma clang diagnostic pop
+
+#endif
+
 
 //==============================================================================
 class WebInputStream  : public InputStream
@@ -372,8 +628,13 @@ public:
         }
     }
 
+    ~WebInputStream()
+    {
+        connection = nullptr;
+    }
+
     //==============================================================================
-    bool isError() const                { return connection == nullptr; }
+    bool isError() const                { return (connection == nullptr || connection->headers == nullptr); }
     int64 getTotalLength() override     { return connection == nullptr ? -1 : connection->contentLength; }
     bool isExhausted() override         { return finished; }
     int64 getPosition() override        { return position; }
@@ -433,14 +694,11 @@ private:
     {
         jassert (connection == nullptr);
 
-        NSMutableURLRequest* req = [NSMutableURLRequest  requestWithURL: [NSURL URLWithString: juceStringToNS (address)]
-                                                            cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
-                                                        timeoutInterval: timeOutMs <= 0 ? 60.0 : (timeOutMs / 1000.0)];
-
-        if (req != nil)
+        if (NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: juceStringToNS (address)]
+                                                               cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
+                                                           timeoutInterval: timeOutMs <= 0 ? 60.0 : (timeOutMs / 1000.0)])
         {
             [req setHTTPMethod: [NSString stringWithUTF8String: httpRequestCmd.toRawUTF8()]];
-            //[req setCachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
 
             StringArray headerLines;
             headerLines.addLines (headers);
@@ -448,8 +706,8 @@ private:
 
             for (int i = 0; i < headerLines.size(); ++i)
             {
-                const String key (headerLines[i].upToFirstOccurrenceOf (":", false, false).trim());
-                const String value (headerLines[i].fromFirstOccurrenceOf (":", false, false).trim());
+                String key   = headerLines[i].upToFirstOccurrenceOf (":", false, false).trim();
+                String value = headerLines[i].fromFirstOccurrenceOf (":", false, false).trim();
 
                 if (key.isNotEmpty() && value.isNotEmpty())
                     [req addValue: juceStringToNS (value) forHTTPHeaderField: juceStringToNS (key)];
diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h
index 412c36a..033e437 100644
--- a/modules/juce_core/native/juce_posix_SharedCode.h
+++ b/modules/juce_core/native/juce_posix_SharedCode.h
@@ -26,10 +26,6 @@
   ==============================================================================
 */
 
-#ifdef JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
- extern int* jucePlugInClientCurrentWrapperType;
-#endif
-
 CriticalSection::CriticalSection() noexcept
 {
     pthread_mutexattr_t atts;
@@ -336,11 +332,21 @@ uint64 File::getFileIdentifier() const
     return juce_stat (fullPath, info) ? (uint64) info.st_ino : 0;
 }
 
+static bool hasEffectiveRootFilePermissions()
+{
+   #if JUCE_LINUX
+    return (geteuid() == 0);
+   #else
+    return false;
+   #endif
+}
+
 //==============================================================================
 bool File::hasWriteAccess() const
 {
     if (exists())
-        return access (fullPath.toUTF8(), W_OK) == 0;
+        return (hasEffectiveRootFilePermissions()
+             || access (fullPath.toUTF8(), W_OK) == 0);
 
     if ((! isDirectory()) && fullPath.containsChar (separator))
         return getParentDirectory().hasWriteAccess();
@@ -634,12 +640,7 @@ File juce_getExecutableFile()
         {
             Dl_info exeInfo;
 
-          #ifdef JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
-            void* localSymbol = jucePlugInClientCurrentWrapperType != nullptr ? (void*) jucePlugInClientCurrentWrapperType
-                                                                              : (void*) juce_getExecutableFile;
-          #else
             void* localSymbol = (void*) juce_getExecutableFile;
-          #endif
             dladdr (localSymbol, &exeInfo);
             return CharPointer_UTF8 (exeInfo.dli_fname);
         }
@@ -1090,14 +1091,14 @@ public:
                 close (pipeHandles[0]);   // close the read handle
 
                 if ((streamFlags & wantStdOut) != 0)
-                    dup2 (pipeHandles[1], 1); // turns the pipe into stdout
+                    dup2 (pipeHandles[1], STDOUT_FILENO); // turns the pipe into stdout
                 else
-                    close (STDOUT_FILENO);
+                    dup2 (open ("/dev/null", O_WRONLY), STDOUT_FILENO);
 
                 if ((streamFlags & wantStdErr) != 0)
-                    dup2 (pipeHandles[1], 2);
+                    dup2 (pipeHandles[1], STDERR_FILENO);
                 else
-                    close (STDERR_FILENO);
+                    dup2 (open ("/dev/null", O_WRONLY), STDERR_FILENO);
 
                 close (pipeHandles[1]);
 
diff --git a/modules/juce_core/native/juce_win32_Network.cpp b/modules/juce_core/native/juce_win32_Network.cpp
index dc80f77..3282a60 100644
--- a/modules/juce_core/native/juce_win32_Network.cpp
+++ b/modules/juce_core/native/juce_win32_Network.cpp
@@ -53,7 +53,7 @@ public:
             if (! isError())
             {
                 DWORD bufferSizeBytes = 4096;
-                StringPairArray dataHeaders (false);
+                StringPairArray dataHeaders;
 
                 for (;;)
                 {
diff --git a/modules/juce_core/native/juce_win32_SystemStats.cpp b/modules/juce_core/native/juce_win32_SystemStats.cpp
index 027d06b..e07e6a0 100644
--- a/modules/juce_core/native/juce_win32_SystemStats.cpp
+++ b/modules/juce_core/native/juce_win32_SystemStats.cpp
@@ -260,17 +260,6 @@ public:
     {
         LARGE_INTEGER ticks;
         QueryPerformanceCounter (&ticks);
-
-        const int64 mainCounterAsHiResTicks = (juce_millisecondsSinceStartup() * hiResTicksPerSecond) / 1000;
-        const int64 newOffset = mainCounterAsHiResTicks - ticks.QuadPart;
-
-        // fix for a very obscure PCI hardware bug that can make the counter
-        // sometimes jump forwards by a few seconds..
-        const int64 offsetDrift = abs64 (newOffset - hiResTicksOffset);
-
-        if (offsetDrift > (hiResTicksPerSecond >> 1))
-            hiResTicksOffset = newOffset;
-
         return ticks.QuadPart + hiResTicksOffset;
     }
 
diff --git a/modules/juce_core/network/juce_URL.cpp b/modules/juce_core/network/juce_URL.cpp
index 9a0a3e6..2350e8a 100644
--- a/modules/juce_core/network/juce_URL.cpp
+++ b/modules/juce_core/network/juce_URL.cpp
@@ -136,7 +136,7 @@ namespace URLHelpers
                 || url[i] == '+' || url[i] == '-' || url[i] == '.')
             ++i;
 
-        return url[i] == ':' ? i + 1 : 0;
+        return url.substring (i).startsWith ("://") ? i + 1 : 0;
     }
 
     static int findStartOfNetLocation (const String& url)
diff --git a/modules/juce_core/system/juce_CompilerSupport.h b/modules/juce_core/system/juce_CompilerSupport.h
index 9b903c8..5169a37 100644
--- a/modules/juce_core/system/juce_CompilerSupport.h
+++ b/modules/juce_core/system/juce_CompilerSupport.h
@@ -98,7 +98,7 @@
   #define JUCE_COMPILER_SUPPORTS_STATIC_ASSERT 1
  #endif
 
- #ifndef JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL
+ #if __has_feature (cxx_override_control) && (! defined (JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL))
   #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1
  #endif
 
diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h
index d7cf618..2234f27 100644
--- a/modules/juce_core/system/juce_StandardHeader.h
+++ b/modules/juce_core/system/juce_StandardHeader.h
@@ -36,7 +36,7 @@
 */
 #define JUCE_MAJOR_VERSION      4
 #define JUCE_MINOR_VERSION      2
-#define JUCE_BUILDNUMBER        1
+#define JUCE_BUILDNUMBER        3
 
 /** Current Juce version number.
 
diff --git a/modules/juce_core/text/juce_StringArray.cpp b/modules/juce_core/text/juce_StringArray.cpp
index dc331d8..f31c847 100644
--- a/modules/juce_core/text/juce_StringArray.cpp
+++ b/modules/juce_core/text/juce_StringArray.cpp
@@ -152,10 +152,13 @@ void StringArray::insert (const int index, const String& newString)
     strings.insert (index, newString);
 }
 
-void StringArray::addIfNotAlreadyThere (const String& newString, const bool ignoreCase)
+bool StringArray::addIfNotAlreadyThere (const String& newString, const bool ignoreCase)
 {
-    if (! contains (newString, ignoreCase))
-        add (newString);
+    if (contains (newString, ignoreCase))
+        return false;
+
+    add (newString);
+    return true;
 }
 
 void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd)
diff --git a/modules/juce_core/text/juce_StringArray.h b/modules/juce_core/text/juce_StringArray.h
index 9d96241..d173a2c 100644
--- a/modules/juce_core/text/juce_StringArray.h
+++ b/modules/juce_core/text/juce_StringArray.h
@@ -191,8 +191,10 @@ public:
 
     /** Adds a string to the array as long as it's not already in there.
         The search can optionally be case-insensitive.
+
+        @return true if the string has been added, false otherwise.
     */
-    void addIfNotAlreadyThere (const String& stringToAdd, bool ignoreCase = false);
+    bool addIfNotAlreadyThere (const String& stringToAdd, bool ignoreCase = false);
 
     /** Replaces one of the strings in the array with another one.
 
diff --git a/modules/juce_core/unit_tests/juce_UnitTest.h b/modules/juce_core/unit_tests/juce_UnitTest.h
index d698c95..72a2896 100644
--- a/modules/juce_core/unit_tests/juce_UnitTest.h
+++ b/modules/juce_core/unit_tests/juce_UnitTest.h
@@ -138,23 +138,78 @@ public:
     */
     void expect (bool testResult, const String& failureMessage = String());
 
-    /** Compares two values, and if they don't match, prints out a message containing the
-        expected and actual result values.
+    //==============================================================================
+    /** Compares a value to an expected value.
+        If they are not equal, prints out a message containing the expected and actual values.
     */
     template <class ValueType>
     void expectEquals (ValueType actual, ValueType expected, String failureMessage = String())
     {
-        const bool result = (actual == expected);
+        bool result = actual == expected;
+        expectResultAndPrint (actual, expected, result, "", failureMessage);
+    }
 
-        if (! result)
-        {
-            if (failureMessage.isNotEmpty())
-                failureMessage << " -- ";
+    /** Checks whether a value is not equal to a comparison value.
+        If this check fails, prints out a message containing the actual and comparison values.
+    */
+    template <class ValueType>
+    void expectNotEquals (ValueType value, ValueType valueToCompareTo, String failureMessage = String())
+    {
+        bool result = value != valueToCompareTo;
+        expectResultAndPrint (value, valueToCompareTo, result, "unequal to", failureMessage);
+    }
 
-            failureMessage << "Expected value: " << expected << ", Actual value: " << actual;
-        }
+    /** Checks whether a value is greater than a comparison value.
+        If this check fails, prints out a message containing the actual and comparison values.
+    */
+    template <class ValueType>
+    void expectGreaterThan (ValueType value, ValueType valueToCompareTo, String failureMessage = String())
+    {
+        bool result = value > valueToCompareTo;
+        expectResultAndPrint (value, valueToCompareTo, result, "greater than", failureMessage);
+    }
 
-        expect (result, failureMessage);
+    /** Checks whether a value is less than a comparison value.
+        If this check fails, prints out a message containing the actual and comparison values.
+    */
+    template <class ValueType>
+    void expectLessThan (ValueType value, ValueType valueToCompareTo, String failureMessage = String())
+    {
+        bool result = value < valueToCompareTo;
+        expectResultAndPrint (value, valueToCompareTo, result, "less than", failureMessage);
+    }
+
+    /** Checks whether a value is greater or equal to a comparison value.
+        If this check fails, prints out a message containing the actual and comparison values.
+    */
+    template <class ValueType>
+    void expectGreaterOrEqual (ValueType value, ValueType valueToCompareTo, String failureMessage = String())
+    {
+        bool result = value >= valueToCompareTo;
+        expectResultAndPrint (value, valueToCompareTo, result, "greater or equal to", failureMessage);
+    }
+
+    /** Checks whether a value is less or equal to a comparison value.
+        If this check fails, prints out a message containing the actual and comparison values.
+    */
+    template <class ValueType>
+    void expectLessOrEqual (ValueType value, ValueType valueToCompareTo, String failureMessage = String())
+    {
+        bool result = value <= valueToCompareTo;
+        expectResultAndPrint (value, valueToCompareTo, result, "less or equal to", failureMessage);
+    }
+
+    /** Computes the difference between a value and a comparison value, and if it is larger than a
+        specified maximum value, prints out a message containing the actual and comparison values
+        and the maximum allowed error.
+    */
+    template <class ValueType>
+    void expectWithinAbsoluteError (ValueType actual, ValueType expected, ValueType maxAbsoluteError, String failureMessage = String())
+    {
+        const ValueType diff = std::abs (actual - expected);
+        const bool result = diff <= maxAbsoluteError;
+
+        expectResultAndPrint (actual, expected, result, " within " + String (maxAbsoluteError) + " of" , failureMessage);
     }
 
     //==============================================================================
@@ -222,6 +277,24 @@ public:
 
 private:
     //==============================================================================
+    template <class ValueType>
+    void expectResultAndPrint (ValueType value, ValueType valueToCompareTo, bool result,
+                               String compDescription, String failureMessage)
+    {
+        if (! result)
+        {
+            if (failureMessage.isNotEmpty())
+                failureMessage << " -- ";
+
+            failureMessage << "Expected value" << (compDescription.isEmpty() ? "" : " ")
+                           << compDescription << ": " << valueToCompareTo
+                           << ", Actual value: " << value;
+        }
+
+        expect (result, failureMessage);
+    }
+
+    //==============================================================================
     const String name;
     UnitTestRunner* runner;
 
diff --git a/modules/juce_core/xml/juce_XmlDocument.cpp b/modules/juce_core/xml/juce_XmlDocument.cpp
index c0f016e..bf56f4f 100644
--- a/modules/juce_core/xml/juce_XmlDocument.cpp
+++ b/modules/juce_core/xml/juce_XmlDocument.cpp
@@ -617,9 +617,17 @@ void XmlDocument::readChildElements (XmlElement& parent)
                 }
                 else
                 {
-                    for (;;)
+                    for (;; ++input)
                     {
-                        const juce_wchar nextChar = *input;
+                        juce_wchar nextChar = *input;
+
+                        if (nextChar == '\r')
+                        {
+                            nextChar = '\n';
+
+                            if (input[1] == '\n')
+                                continue;
+                        }
 
                         if (nextChar == '<' || nextChar == '&')
                             break;
@@ -633,7 +641,6 @@ void XmlDocument::readChildElements (XmlElement& parent)
 
                         textElementContent.appendUTF8Char (nextChar);
                         contentShouldBeUsed = contentShouldBeUsed || ! CharacterFunctions::isWhitespace (nextChar);
-                        ++input;
                     }
                 }
             }
diff --git a/modules/juce_cryptography/juce_cryptography.h b/modules/juce_cryptography/juce_cryptography.h
index 2f7d422..047172a 100644
--- a/modules/juce_cryptography/juce_cryptography.h
+++ b/modules/juce_cryptography/juce_cryptography.h
@@ -33,7 +33,7 @@
 
   ID:               juce_cryptography
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE cryptography classes
   description:      Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_data_structures/juce_data_structures.h b/modules/juce_data_structures/juce_data_structures.h
index e9b3922..fd8b0c3 100644
--- a/modules/juce_data_structures/juce_data_structures.h
+++ b/modules/juce_data_structures/juce_data_structures.h
@@ -33,7 +33,7 @@
 
   ID:               juce_data_structures
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE data model helper classes
   description:      Classes for undo/redo management, and smart data structures.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp
index b422a1c..3890f8a 100644
--- a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp
+++ b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp
@@ -33,13 +33,13 @@ InterprocessConnectionServer::~InterprocessConnectionServer()
 }
 
 //==============================================================================
-bool InterprocessConnectionServer::beginWaitingForSocket (const int portNumber)
+bool InterprocessConnectionServer::beginWaitingForSocket (const int portNumber, const String& bindAddress)
 {
     stop();
 
     socket = new StreamingSocket();
 
-    if (socket->createListener (portNumber))
+    if (socket->createListener (portNumber, bindAddress))
     {
         startThread();
         return true;
diff --git a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h
index 3235083..01bee32 100644
--- a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h
+++ b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h
@@ -57,9 +57,16 @@ public:
 
         Use stop() to stop the thread running.
 
+        @param portNumber    The port on which the server will receive
+                             connections
+        @param bindAddress   The address on which the server will listen
+                             for connections. An empty string indicates
+                             that it should listen on all addresses
+                             assigned to this machine.
+
         @see createConnectionObject, stop
     */
-    bool beginWaitingForSocket (int portNumber);
+    bool beginWaitingForSocket (int portNumber, const String& bindAddress = String());
 
     /** Terminates the listener thread, if it's active.
 
diff --git a/modules/juce_events/juce_events.h b/modules/juce_events/juce_events.h
index 2a0798d..b2e6c5e 100644
--- a/modules/juce_events/juce_events.h
+++ b/modules/juce_events/juce_events.h
@@ -33,7 +33,7 @@
 
   ID:               juce_events
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE message and event handling classes
   description:      Classes for running an application's main event loop and sending/receiving messages, timers, etc.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_events/messages/juce_ApplicationBase.cpp b/modules/juce_events/messages/juce_ApplicationBase.cpp
index 66cd07f..f130bf4 100644
--- a/modules/juce_events/messages/juce_ApplicationBase.cpp
+++ b/modules/juce_events/messages/juce_ApplicationBase.cpp
@@ -257,6 +257,16 @@ bool JUCEApplicationBase::initialiseApp()
     }
    #endif
 
+   #if JUCE_WINDOWS && JUCE_STANDALONE_APPLICATION && ! defined (_CONSOLE)
+    if (AttachConsole (ATTACH_PARENT_PROCESS) != 0)
+    {
+        // if we've launched a GUI app from cmd.exe or PowerShell, we need this to enable printf etc.
+        freopen("CON", "w", stdout);
+        freopen("CON", "w", stderr);
+        freopen("CON", "r", stdin);
+    }
+   #endif
+
     // let the app do its setting-up..
     initialise (getCommandLineParameters());
 
diff --git a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
index 2efb3aa..4f3df52 100644
--- a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
+++ b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
@@ -25,7 +25,7 @@
 namespace
 {
     template <typename Type>
-    Rectangle<Type> coordsToRectangle (Type x, Type y, Type w, Type h)
+    Rectangle<Type> coordsToRectangle (Type x, Type y, Type w, Type h) noexcept
     {
        #if JUCE_DEBUG
         const int maxVal = 0x3fffffff;
@@ -77,7 +77,7 @@ bool Graphics::isVectorDevice() const
     return context.isVectorDevice();
 }
 
-bool Graphics::reduceClipRegion (const Rectangle<int>& area)
+bool Graphics::reduceClipRegion (Rectangle<int> area)
 {
     saveStateIfPending();
     return context.clipToRectangle (area);
@@ -85,7 +85,7 @@ bool Graphics::reduceClipRegion (const Rectangle<int>& area)
 
 bool Graphics::reduceClipRegion (const int x, const int y, const int w, const int h)
 {
-    return reduceClipRegion (Rectangle<int> (x, y, w, h));
+    return reduceClipRegion (coordsToRectangle (x, y, w, h));
 }
 
 bool Graphics::reduceClipRegion (const RectangleList<int>& clipRegion)
@@ -108,7 +108,7 @@ bool Graphics::reduceClipRegion (const Image& image, const AffineTransform& tran
     return ! context.isClipEmpty();
 }
 
-void Graphics::excludeClipRegion (const Rectangle<int>& rectangleToExclude)
+void Graphics::excludeClipRegion (Rectangle<int> rectangleToExclude)
 {
     saveStateIfPending();
     context.excludeClipRectangle (rectangleToExclude);
@@ -164,7 +164,7 @@ void Graphics::addTransform (const AffineTransform& transform)
     context.addTransform (transform);
 }
 
-bool Graphics::clipRegionIntersects (const Rectangle<int>& area) const
+bool Graphics::clipRegionIntersects (Rectangle<int> area) const
 {
     return context.clipRegionIntersects (area);
 }
@@ -281,7 +281,7 @@ void Graphics::drawMultiLineText (const String& text, const int startX,
     }
 }
 
-void Graphics::drawText (const String& text, const Rectangle<float>& area,
+void Graphics::drawText (const String& text, Rectangle<float> area,
                          Justification justificationType, bool useEllipsesIfTooBig) const
 {
     if (text.isNotEmpty() && context.clipRegionIntersects (area.getSmallestIntegerContainer()))
@@ -297,19 +297,19 @@ void Graphics::drawText (const String& text, const Rectangle<float>& area,
     }
 }
 
-void Graphics::drawText (const String& text, const Rectangle<int>& area,
+void Graphics::drawText (const String& text, Rectangle<int> area,
                          Justification justificationType, bool useEllipsesIfTooBig) const
 {
     drawText (text, area.toFloat(), justificationType, useEllipsesIfTooBig);
 }
 
-void Graphics::drawText (const String& text, const int x, const int y, const int width, const int height,
+void Graphics::drawText (const String& text, int x, int y, int width, int height,
                          Justification justificationType, const bool useEllipsesIfTooBig) const
 {
-    drawText (text, Rectangle<int> (x, y, width, height), justificationType, useEllipsesIfTooBig);
+    drawText (text, coordsToRectangle (x, y, width, height), justificationType, useEllipsesIfTooBig);
 }
 
-void Graphics::drawFittedText (const String& text, const Rectangle<int>& area,
+void Graphics::drawFittedText (const String& text, Rectangle<int> area,
                                Justification justification,
                                const int maximumNumberOfLines,
                                const float minimumHorizontalScale) const
@@ -328,7 +328,7 @@ void Graphics::drawFittedText (const String& text, const Rectangle<int>& area,
     }
 }
 
-void Graphics::drawFittedText (const String& text, const int x, const int y, const int width, const int height,
+void Graphics::drawFittedText (const String& text, int x, int y, int width, int height,
                                Justification justification,
                                const int maximumNumberOfLines,
                                const float minimumHorizontalScale) const
@@ -338,12 +338,12 @@ void Graphics::drawFittedText (const String& text, const int x, const int y, con
 }
 
 //==============================================================================
-void Graphics::fillRect (const Rectangle<int>& r) const
+void Graphics::fillRect (Rectangle<int> r) const
 {
     context.fillRect (r, false);
 }
 
-void Graphics::fillRect (const Rectangle<float>& r) const
+void Graphics::fillRect (Rectangle<float> r) const
 {
     context.fillRect (r);
 }
@@ -371,7 +371,7 @@ void Graphics::fillRectList (const RectangleList<int>& rects) const
 
 void Graphics::setPixel (int x, int y) const
 {
-    context.fillRect (Rectangle<int> (x, y, 1, 1), false);
+    context.fillRect (coordsToRectangle (x, y, 1, 1), false);
 }
 
 void Graphics::fillAll() const
@@ -426,7 +426,7 @@ void Graphics::drawRect (int x, int y, int width, int height, int lineThickness)
     drawRect (coordsToRectangle (x, y, width, height), lineThickness);
 }
 
-void Graphics::drawRect (const Rectangle<int>& r, int lineThickness) const
+void Graphics::drawRect (Rectangle<int> r, int lineThickness) const
 {
     drawRect (r.toFloat(), (float) lineThickness);
 }
@@ -444,7 +444,7 @@ void Graphics::drawRect (Rectangle<float> r, const float lineThickness) const
 }
 
 //==============================================================================
-void Graphics::fillEllipse (const Rectangle<float>& area) const
+void Graphics::fillEllipse (Rectangle<float> area) const
 {
     Path p;
     p.addEllipse (area);
@@ -453,19 +453,31 @@ void Graphics::fillEllipse (const Rectangle<float>& area) const
 
 void Graphics::fillEllipse (float x, float y, float w, float h) const
 {
-    fillEllipse (Rectangle<float> (x, y, w, h));
+    fillEllipse (coordsToRectangle (x, y, w, h));
 }
 
 void Graphics::drawEllipse (float x, float y, float width, float height, float lineThickness) const
 {
-    Path p;
-    p.addEllipse (x, y, width, height);
-    strokePath (p, PathStrokeType (lineThickness));
+    drawEllipse (coordsToRectangle (x, y, width, height), lineThickness);
 }
 
-void Graphics::drawEllipse (const Rectangle<float>& area, float lineThickness) const
+void Graphics::drawEllipse (Rectangle<float> area, float lineThickness) const
 {
-    drawEllipse (area.getX(), area.getY(), area.getWidth(), area.getHeight(), lineThickness);
+    Path p;
+
+    if (area.getWidth() == area.getHeight())
+    {
+        // For a circle, we can avoid having to generate a stroke
+        p.addEllipse (area.expanded (lineThickness * 0.5f));
+        p.addEllipse (area.reduced  (lineThickness * 0.5f));
+        p.setUsingNonZeroWinding (false);
+        fillPath (p);
+    }
+    else
+    {
+        p.addEllipse (area);
+        strokePath (p, PathStrokeType (lineThickness));
+    }
 }
 
 void Graphics::fillRoundedRectangle (float x, float y, float width, float height, float cornerSize) const
@@ -473,7 +485,7 @@ void Graphics::fillRoundedRectangle (float x, float y, float width, float height
     fillRoundedRectangle (coordsToRectangle (x, y, width, height), cornerSize);
 }
 
-void Graphics::fillRoundedRectangle (const Rectangle<float>& r, const float cornerSize) const
+void Graphics::fillRoundedRectangle (Rectangle<float> r, const float cornerSize) const
 {
     Path p;
     p.addRoundedRectangle (r, cornerSize);
@@ -486,7 +498,7 @@ void Graphics::drawRoundedRectangle (float x, float y, float width, float height
     drawRoundedRectangle (coordsToRectangle (x, y, width, height), cornerSize, lineThickness);
 }
 
-void Graphics::drawRoundedRectangle (const Rectangle<float>& r, float cornerSize, float lineThickness) const
+void Graphics::drawRoundedRectangle (Rectangle<float> r, float cornerSize, float lineThickness) const
 {
     Path p;
     p.addRoundedRectangle (r, cornerSize);
@@ -500,7 +512,7 @@ void Graphics::drawArrow (const Line<float>& line, float lineThickness, float ar
     fillPath (p);
 }
 
-void Graphics::fillCheckerBoard (const Rectangle<int>& area,
+void Graphics::fillCheckerBoard (Rectangle<int> area,
                                  const int checkWidth, const int checkHeight,
                                  Colour colour1, Colour colour2) const
 {
@@ -630,18 +642,22 @@ void Graphics::drawImageAt (const Image& imageToDraw, int x, int y, bool fillAlp
                           fillAlphaChannel);
 }
 
-void Graphics::drawImageWithin (const Image& imageToDraw,
-                                int dx, int dy, int dw, int dh,
-                                RectanglePlacement placementWithinTarget,
-                                const bool fillAlphaChannelWithCurrentBrush) const
+void Graphics::drawImage (const Image& imageToDraw, Rectangle<float> targetArea,
+                          RectanglePlacement placementWithinTarget, bool fillAlphaChannelWithCurrentBrush) const
 {
     if (imageToDraw.isValid())
         drawImageTransformed (imageToDraw,
-                              placementWithinTarget.getTransformToFit (imageToDraw.getBounds().toFloat(),
-                                                                       coordsToRectangle (dx, dy, dw, dh).toFloat()),
+                              placementWithinTarget.getTransformToFit (imageToDraw.getBounds().toFloat(), targetArea),
                               fillAlphaChannelWithCurrentBrush);
 }
 
+void Graphics::drawImageWithin (const Image& imageToDraw, int dx, int dy, int dw, int dh,
+                                RectanglePlacement placementWithinTarget, bool fillAlphaChannelWithCurrentBrush) const
+{
+    drawImage (imageToDraw, coordsToRectangle (dx, dy, dw, dh).toFloat(),
+               placementWithinTarget, fillAlphaChannelWithCurrentBrush);
+}
+
 void Graphics::drawImage (const Image& imageToDraw,
                           int dx, int dy, int dw, int dh,
                           int sx, int sy, int sw, int sh,
diff --git a/modules/juce_graphics/contexts/juce_GraphicsContext.h b/modules/juce_graphics/contexts/juce_GraphicsContext.h
index 3cfcc8c..9820539 100644
--- a/modules/juce_graphics/contexts/juce_GraphicsContext.h
+++ b/modules/juce_graphics/contexts/juce_GraphicsContext.h
@@ -170,7 +170,7 @@ public:
         @see drawSingleLineText, drawFittedText, drawMultiLineText, GlyphArrangement::addJustifiedText
     */
     void drawText (const String& text,
-                   const Rectangle<int>& area,
+                   Rectangle<int> area,
                    Justification justificationType,
                    bool useEllipsesIfTooBig = true) const;
 
@@ -184,7 +184,7 @@ public:
         @see drawSingleLineText, drawFittedText, drawMultiLineText, GlyphArrangement::addJustifiedText
     */
     void drawText (const String& text,
-                   const Rectangle<float>& area,
+                   Rectangle<float> area,
                    Justification justificationType,
                    bool useEllipsesIfTooBig = true) const;
 
@@ -233,7 +233,7 @@ public:
         @see GlyphArrangement::addFittedText
     */
     void drawFittedText (const String& text,
-                         const Rectangle<int>& area,
+                         Rectangle<int> area,
                          Justification justificationFlags,
                          int maximumNumberOfLines,
                          float minimumHorizontalScale = 0.0f) const;
@@ -257,12 +257,12 @@ public:
     /** Fills a rectangle with the current colour or brush.
         @see drawRect, fillRoundedRectangle
     */
-    void fillRect (const Rectangle<int>& rectangle) const;
+    void fillRect (Rectangle<int> rectangle) const;
 
     /** Fills a rectangle with the current colour or brush.
         @see drawRect, fillRoundedRectangle
     */
-    void fillRect (const Rectangle<float>& rectangle) const;
+    void fillRect (Rectangle<float> rectangle) const;
 
     /** Fills a rectangle with the current colour or brush.
         @see drawRect, fillRoundedRectangle
@@ -297,11 +297,11 @@ public:
     /** Uses the current colour or brush to fill a rectangle with rounded corners.
         @see drawRoundedRectangle, Path::addRoundedRectangle
     */
-    void fillRoundedRectangle (const Rectangle<float>& rectangle,
+    void fillRoundedRectangle (Rectangle<float> rectangle,
                                float cornerSize) const;
 
     /** Fills a rectangle with a checkerboard pattern, alternating between two colours. */
-    void fillCheckerBoard (const Rectangle<int>& area,
+    void fillCheckerBoard (Rectangle<int> area,
                            int checkWidth, int checkHeight,
                            Colour colour1, Colour colour2) const;
 
@@ -321,7 +321,7 @@ public:
         The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards.
         @see fillRect
     */
-    void drawRect (const Rectangle<int>& rectangle, int lineThickness = 1) const;
+    void drawRect (Rectangle<int> rectangle, int lineThickness = 1) const;
 
     /** Draws a rectangular outline, using the current colour or brush.
         The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards.
@@ -338,7 +338,7 @@ public:
     /** Uses the current colour or brush to draw the outline of a rectangle with rounded corners.
         @see fillRoundedRectangle, Path::addRoundedRectangle
     */
-    void drawRoundedRectangle (const Rectangle<float>& rectangle,
+    void drawRoundedRectangle (Rectangle<float> rectangle,
                                float cornerSize, float lineThickness) const;
 
     /** Fills a 1x1 pixel using the current colour or brush.
@@ -358,7 +358,7 @@ public:
         The ellipse is drawn to fit inside the given rectangle.
         @see drawEllipse, Path::addEllipse
     */
-    void fillEllipse (const Rectangle<float>& area) const;
+    void fillEllipse (Rectangle<float> area) const;
 
     /** Draws an elliptical stroke using the current colour or brush.
         @see fillEllipse, Path::addEllipse
@@ -369,7 +369,7 @@ public:
     /** Draws an elliptical stroke using the current colour or brush.
         @see fillEllipse, Path::addEllipse
     */
-    void drawEllipse (const Rectangle<float>& area, float lineThickness) const;
+    void drawEllipse (Rectangle<float> area, float lineThickness) const;
 
     //==============================================================================
     /** Draws a line between two points.
@@ -544,6 +544,23 @@ public:
 
     /** Draws an image to fit within a designated rectangle.
 
+        @param imageToDraw              the source image to draw
+        @param destArea                 the target rectangle to fit it into
+        @param placementWithinTarget    this specifies how the image should be positioned
+                                        within the target rectangle - see the RectanglePlacement
+                                        class for more details about this.
+        @param fillAlphaChannelWithCurrentBrush     if true, then instead of drawing the image, just its
+                                                    alpha channel will be used as a mask with which to
+                                                    draw with the current brush or colour. This is
+                                                    similar to fillAlphaMap(), and see also drawImage()
+        @see drawImage, drawImageTransformed, drawImageAt, RectanglePlacement
+    */
+    void drawImage (const Image& imageToDraw, Rectangle<float> targetArea,
+                    RectanglePlacement placementWithinTarget = RectanglePlacement::stretchToFit,
+                    bool fillAlphaChannelWithCurrentBrush = false) const;
+
+    /** Draws an image to fit within a designated rectangle.
+
         If the image is too big or too small for the space, it will be rescaled
         to fit as nicely as it can do without affecting its aspect ratio. It will
         then be placed within the target rectangle according to the justification flags
@@ -568,7 +585,6 @@ public:
                           RectanglePlacement placementWithinTarget,
                           bool fillAlphaChannelWithCurrentBrush = false) const;
 
-
     //==============================================================================
     /** Returns the position of the bounding box for the current clipping region.
         @see getClipRegion, clipRegionIntersects
@@ -581,7 +597,7 @@ public:
         method can be used to optimise a component's paint() method, by letting it
         avoid drawing complex objects that aren't within the region being repainted.
     */
-    bool clipRegionIntersects (const Rectangle<int>& area) const;
+    bool clipRegionIntersects (Rectangle<int> area) const;
 
     /** Intersects the current clipping region with another region.
 
@@ -595,7 +611,7 @@ public:
         @returns true if the resulting clipping region is non-zero in size
         @see setOrigin, clipRegionIntersects
     */
-    bool reduceClipRegion (const Rectangle<int>& area);
+    bool reduceClipRegion (Rectangle<int> area);
 
     /** Intersects the current clipping region with a rectangle list region.
 
@@ -625,7 +641,7 @@ public:
     bool reduceClipRegion (const Image& image, const AffineTransform& transform);
 
     /** Excludes a rectangle to stop it being drawn into. */
-    void excludeClipRegion (const Rectangle<int>& rectangleToExclude);
+    void excludeClipRegion (Rectangle<int> rectangleToExclude);
 
     /** Returns true if no drawing can be done because the clip region is zero. */
     bool isClipEmpty() const;
diff --git a/modules/juce_graphics/geometry/juce_PathStrokeType.cpp b/modules/juce_graphics/geometry/juce_PathStrokeType.cpp
index c0dd878..9f55b03 100644
--- a/modules/juce_graphics/geometry/juce_PathStrokeType.cpp
+++ b/modules/juce_graphics/geometry/juce_PathStrokeType.cpp
@@ -449,7 +449,7 @@ namespace PathStrokeHelpers
         {
             destPath.startNewSubPath (firstLine.rx2, firstLine.ry2);
 
-            if (arrowhead != nullptr)
+            if (arrowhead != nullptr && arrowhead->startWidth > 0.0f)
                 addArrowhead (destPath, firstLine.rx2, firstLine.ry2, lastX1, lastY1, firstLine.x1, firstLine.y1,
                               width, arrowhead->startWidth);
             else
@@ -491,7 +491,7 @@ namespace PathStrokeHelpers
         {
             destPath.lineTo (lastX2, lastY2);
 
-            if (arrowhead != nullptr)
+            if (arrowhead != nullptr && arrowhead->endWidth > 0.0f)
                 addArrowhead (destPath, lastX2, lastY2, lastLine.rx1, lastLine.ry1, lastLine.x2, lastLine.y2,
                               width, arrowhead->endWidth);
             else
diff --git a/modules/juce_graphics/images/juce_Image.cpp b/modules/juce_graphics/images/juce_Image.cpp
index cb51d5d..2bf79eb 100644
--- a/modules/juce_graphics/images/juce_Image.cpp
+++ b/modules/juce_graphics/images/juce_Image.cpp
@@ -102,7 +102,7 @@ public:
             sendDataChangeMessage();
     }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
         SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false);
         memcpy (s->imageData, imageData, (size_t) (lineStride * height));
@@ -153,13 +153,13 @@ class SubsectionPixelData  : public ImagePixelData
 public:
     SubsectionPixelData (ImagePixelData* const im, const Rectangle<int>& r)
         : ImagePixelData (im->pixelFormat, r.getWidth(), r.getHeight()),
-          image (im), area (r)
+          sourceImage (im), area (r)
     {
     }
 
     LowLevelGraphicsContext* createLowLevelContext() override
     {
-        LowLevelGraphicsContext* g = image->createLowLevelContext();
+        LowLevelGraphicsContext* g = sourceImage->createLowLevelContext();
         g->clipToRectangle (area);
         g->setOrigin (area.getPosition());
         return g;
@@ -167,16 +167,16 @@ public:
 
     void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override
     {
-        image->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode);
+        sourceImage->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode);
 
         if (mode != Image::BitmapData::readOnly)
             sendDataChangeMessage();
     }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
         jassert (getReferenceCount() > 0); // (This method can't be used on an unowned pointer, as it will end up self-deleting)
-        const ScopedPointer<ImageType> type (image->createType());
+        const ScopedPointer<ImageType> type (createType());
 
         Image newImage (type->create (pixelFormat, area.getWidth(), area.getHeight(), pixelFormat != Image::RGB));
 
@@ -185,18 +185,17 @@ public:
             g.drawImageAt (Image (this), 0, 0);
         }
 
-        newImage.getPixelData()->incReferenceCount();
         return newImage.getPixelData();
     }
 
-    ImageType* createType() const override          { return image->createType(); }
+    ImageType* createType() const override          { return sourceImage->createType(); }
 
     /* as we always hold a reference to image, don't double count */
-    int getSharedCount() const noexcept override    { return getReferenceCount() + image->getSharedCount() - 1; }
+    int getSharedCount() const noexcept override    { return getReferenceCount() + sourceImage->getSharedCount() - 1; }
 
 private:
     friend class Image;
-    const ImagePixelData::Ptr image;
+    const ImagePixelData::Ptr sourceImage;
     const Rectangle<int> area;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubsectionPixelData)
diff --git a/modules/juce_graphics/images/juce_Image.h b/modules/juce_graphics/images/juce_Image.h
index 189094c..d246739 100644
--- a/modules/juce_graphics/images/juce_Image.h
+++ b/modules/juce_graphics/images/juce_Image.h
@@ -435,10 +435,12 @@ public:
     ImagePixelData (Image::PixelFormat, int width, int height);
     ~ImagePixelData();
 
+    typedef ReferenceCountedObjectPtr<ImagePixelData> Ptr;
+
     /** Creates a context that will draw into this image. */
     virtual LowLevelGraphicsContext* createLowLevelContext() = 0;
     /** Creates a copy of this image. */
-    virtual ImagePixelData* clone() = 0;
+    virtual Ptr clone() = 0;
     /** Creates an instance of the type of this image. */
     virtual ImageType* createType() const = 0;
     /** Initialises a BitmapData object. */
@@ -458,8 +460,6 @@ public:
     */
     NamedValueSet userData;
 
-    typedef ReferenceCountedObjectPtr<ImagePixelData> Ptr;
-
     //==============================================================================
     struct Listener
     {
diff --git a/modules/juce_graphics/juce_graphics.h b/modules/juce_graphics/juce_graphics.h
index 795b61b..e367bde 100644
--- a/modules/juce_graphics/juce_graphics.h
+++ b/modules/juce_graphics/juce_graphics.h
@@ -33,7 +33,7 @@
 
   ID:               juce_graphics
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE graphics classes
   description:      Classes for 2D vector graphics, image loading/saving, font handling, etc.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
index 584e6e7..90ff506 100644
--- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
+++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm
@@ -72,7 +72,7 @@ public:
         }
     }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
         CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false);
         memcpy (im->imageData, imageData, (size_t) (lineStride * height));
diff --git a/modules/juce_gui_basics/buttons/juce_DrawableButton.h b/modules/juce_gui_basics/buttons/juce_DrawableButton.h
index 072cbbf..7c142bc 100644
--- a/modules/juce_gui_basics/buttons/juce_DrawableButton.h
+++ b/modules/juce_gui_basics/buttons/juce_DrawableButton.h
@@ -73,19 +73,19 @@ public:
         The button will keep its own internal copies of these drawables.
 
         @param normalImage      the thing to draw for the button's 'normal' state. An internal copy
-                                will be made of the object passed-in if it is non-zero.
+                                will be made of the object passed-in if it is non-null.
         @param overImage        the thing to draw for the button's 'over' state - if this is
-                                zero, the button's normal image will be used when the mouse is
+                                null, the button's normal image will be used when the mouse is
                                 over it. An internal copy will be made of the object passed-in
-                                if it is non-zero.
+                                if it is non-null.
         @param downImage        the thing to draw for the button's 'down' state - if this is
-                                zero, the 'over' image will be used instead (or the normal image
+                                null, the 'over' image will be used instead (or the normal image
                                 as a last resort). An internal copy will be made of the object
-                                passed-in if it is non-zero.
-        @param disabledImage    an image to draw when the button is disabled. If this is zero,
+                                passed-in if it is non-null.
+        @param disabledImage    an image to draw when the button is disabled. If this is null,
                                 the normal image will be drawn with a reduced opacity instead.
                                 An internal copy will be made of the object passed-in if it is
-                                non-zero.
+                                non-null.
         @param normalImageOn    same as the normalImage, but this is used when the button's toggle
                                 state is 'on'. If this is nullptr, the normal image is used instead
         @param overImageOn      same as the overImage, but this is used when the button's toggle
diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp
index 23d7ab1..f96dadc 100644
--- a/modules/juce_gui_basics/components/juce_Component.cpp
+++ b/modules/juce_gui_basics/components/juce_Component.cpp
@@ -1712,7 +1712,7 @@ int Component::runModalLoop()
                                            ->callFunctionOnMessageThread (&ComponentHelpers::runModalLoopCallback, this);
     }
 
-    if (! isCurrentlyModal())
+    if (! isCurrentlyModal (false))
         enterModalState (true);
 
     return ModalComponentManager::getInstance()->runEventLoopForCurrentComponent();
@@ -1728,7 +1728,7 @@ void Component::enterModalState (const bool shouldTakeKeyboardFocus,
     // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
     ASSERT_MESSAGE_MANAGER_IS_LOCKED
 
-    if (! isCurrentlyModal())
+    if (! isCurrentlyModal (false))
     {
         ModalComponentManager& mcm = *ModalComponentManager::getInstance();
         mcm.startModal (this, deleteWhenDismissed);
@@ -1748,7 +1748,7 @@ void Component::enterModalState (const bool shouldTakeKeyboardFocus,
 
 void Component::exitModalState (const int returnValue)
 {
-    if (isCurrentlyModal())
+    if (isCurrentlyModal (false))
     {
         if (MessageManager::getInstance()->isThisTheMessageThread())
         {
@@ -1777,9 +1777,15 @@ void Component::exitModalState (const int returnValue)
     }
 }
 
-bool Component::isCurrentlyModal() const noexcept
+bool Component::isCurrentlyModal (bool onlyConsiderForemostModalComponent) const noexcept
 {
-    return getCurrentlyModalComponent() == this;
+    const int n = onlyConsiderForemostModalComponent ? 1 : getNumCurrentlyModalComponents();
+
+    for (int i = 0; i < n; ++i)
+        if (getCurrentlyModalComponent (i) == this)
+            return true;
+
+    return false;
 }
 
 bool Component::isCurrentlyBlockedByAnotherModalComponent() const
@@ -2679,7 +2685,7 @@ void Component::internalFocusLoss (const FocusChangeType cause)
 {
     const WeakReference<Component> safePointer (this);
 
-    focusLost (focusChangedDirectly);
+    focusLost (cause);
 
     if (safePointer != nullptr)
         internalChildFocusChange (cause, safePointer);
diff --git a/modules/juce_gui_basics/components/juce_Component.h b/modules/juce_gui_basics/components/juce_Component.h
index 486066a..4f7750f 100644
--- a/modules/juce_gui_basics/components/juce_Component.h
+++ b/modules/juce_gui_basics/components/juce_Component.h
@@ -1952,12 +1952,14 @@ public:
     /** Returns true if this component is the modal one.
 
         It's possible to have nested modal components, e.g. a pop-up dialog box
-        that launches another pop-up, but this will only return true for
-        the one at the top of the stack.
+        that launches another pop-up. If onlyConsiderForemostModalComponent is
+        true then isCurrentlyModal will only return true for the one at the top
+        of the stack. If onlyConsiderForemostModalComponent is false then
+        isCurrentlyModal will return true for any modal component in the stack.
 
         @see getCurrentlyModalComponent
     */
-    bool isCurrentlyModal() const noexcept;
+    bool isCurrentlyModal (bool onlyConsiderForemostModalComponent = true) const noexcept;
 
     /** Returns the number of components that are currently in a modal state.
         @see getCurrentlyModalComponent
diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp
index cc46ac0..908c4d1 100644
--- a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp
+++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp
@@ -245,13 +245,14 @@ bool ModalComponentManager::cancelAllModalComponents()
     return numModal > 0;
 }
 
+//==============================================================================
 #if JUCE_MODAL_LOOPS_PERMITTED
 class ModalComponentManager::ReturnValueRetriever     : public ModalComponentManager::Callback
 {
 public:
     ReturnValueRetriever (int& v, bool& done) : value (v), finished (done) {}
 
-    void modalStateFinished (int returnValue)
+    void modalStateFinished (int returnValue) override
     {
         finished = true;
         value = returnValue;
@@ -292,3 +293,21 @@ int ModalComponentManager::runEventLoopForCurrentComponent()
     return returnValue;
 }
 #endif
+
+//==============================================================================
+#if JUCE_COMPILER_SUPPORTS_LAMBDAS
+struct LambdaCallback  : public ModalComponentManager::Callback
+{
+    LambdaCallback (std::function<void(int)> fn) noexcept : function (fn) {}
+    void modalStateFinished (int result) override  { function (result); }
+
+    std::function<void(int)> function;
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LambdaCallback)
+};
+
+ModalComponentManager::Callback* ModalCallbackFunction::create (std::function<void(int)> f)
+{
+    return new LambdaCallback (f);
+}
+#endif
diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/modules/juce_gui_basics/components/juce_ModalComponentManager.h
index b081751..03b2990 100644
--- a/modules/juce_gui_basics/components/juce_ModalComponentManager.h
+++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.h
@@ -184,9 +184,20 @@ public:
     static ModalComponentManager::Callback* create (void (*functionToCall) (int, ParamType),
                                                     ParamType parameterValue)
     {
-        return new FunctionCaller1 <ParamType> (functionToCall, parameterValue);
+        return new FunctionCaller1<ParamType> (functionToCall, parameterValue);
     }
 
+   #if JUCE_COMPILER_SUPPORTS_LAMBDAS
+    /** This is a utility function to create a ModalComponentManager::Callback that will
+        call a lambda function.
+        The lambda that you supply must take an integer parameter, which is the result code that
+        was returned when the modal component was dismissed.
+
+        @see ModalComponentManager::Callback
+    */
+    static ModalComponentManager::Callback* create (std::function<void(int)>);
+   #endif
+
     //==============================================================================
     /** This is a utility function to create a ModalComponentManager::Callback that will
         call a static function with two custom parameters.
@@ -214,7 +225,7 @@ public:
                                                        ParamType1 parameterValue1,
                                                        ParamType2 parameterValue2)
     {
-        return new FunctionCaller2 <ParamType1, ParamType2> (functionToCall, parameterValue1, parameterValue2);
+        return new FunctionCaller2<ParamType1, ParamType2> (functionToCall, parameterValue1, parameterValue2);
     }
 
     //==============================================================================
@@ -244,7 +255,7 @@ public:
     static ModalComponentManager::Callback* forComponent (void (*functionToCall) (int, ComponentType*),
                                                           ComponentType* component)
     {
-        return new ComponentCaller1 <ComponentType> (functionToCall, component);
+        return new ComponentCaller1<ComponentType> (functionToCall, component);
     }
 
     //==============================================================================
@@ -275,21 +286,20 @@ public:
                                                           ComponentType* component,
                                                           ParamType param)
     {
-        return new ComponentCaller2 <ComponentType, ParamType> (functionToCall, component, param);
+        return new ComponentCaller2<ComponentType, ParamType> (functionToCall, component, param);
     }
 
 private:
     //==============================================================================
     template <typename ParamType>
-    class FunctionCaller1  : public ModalComponentManager::Callback
+    struct FunctionCaller1  : public ModalComponentManager::Callback
     {
-    public:
         typedef void (*FunctionType) (int, ParamType);
 
         FunctionCaller1 (FunctionType& f, ParamType& p1)
             : function (f), param (p1) {}
 
-        void modalStateFinished (int returnValue)  { function (returnValue, param); }
+        void modalStateFinished (int returnValue) override  { function (returnValue, param); }
 
     private:
         const FunctionType function;
@@ -299,15 +309,14 @@ private:
     };
 
     template <typename ParamType1, typename ParamType2>
-    class FunctionCaller2  : public ModalComponentManager::Callback
+    struct FunctionCaller2  : public ModalComponentManager::Callback
     {
-    public:
         typedef void (*FunctionType) (int, ParamType1, ParamType2);
 
         FunctionCaller2 (FunctionType& f, ParamType1& p1, ParamType2& p2)
             : function (f), param1 (p1), param2 (p2) {}
 
-        void modalStateFinished (int returnValue)   { function (returnValue, param1, param2); }
+        void modalStateFinished (int returnValue) override  { function (returnValue, param1, param2); }
 
     private:
         const FunctionType function;
@@ -318,15 +327,14 @@ private:
     };
 
     template <typename ComponentType>
-    class ComponentCaller1  : public ModalComponentManager::Callback
+    struct ComponentCaller1  : public ModalComponentManager::Callback
     {
-    public:
         typedef void (*FunctionType) (int, ComponentType*);
 
         ComponentCaller1 (FunctionType& f, ComponentType* c)
             : function (f), comp (c) {}
 
-        void modalStateFinished (int returnValue)
+        void modalStateFinished (int returnValue) override
         {
             function (returnValue, static_cast<ComponentType*> (comp.get()));
         }
@@ -339,15 +347,14 @@ private:
     };
 
     template <typename ComponentType, typename ParamType1>
-    class ComponentCaller2  : public ModalComponentManager::Callback
+    struct ComponentCaller2  : public ModalComponentManager::Callback
     {
-    public:
         typedef void (*FunctionType) (int, ComponentType*, ParamType1);
 
         ComponentCaller2 (FunctionType& f, ComponentType* c, ParamType1 p1)
             : function (f), comp (c), param1 (p1) {}
 
-        void modalStateFinished (int returnValue)
+        void modalStateFinished (int returnValue) override
         {
             function (returnValue, static_cast<ComponentType*> (comp.get()), param1);
         }
diff --git a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp
index 513cf6b..e819d3f 100644
--- a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp
+++ b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp
@@ -66,6 +66,55 @@ public:
         const XmlPath* parent;
     };
 
+  //==============================================================================
+  struct UsePathOp
+  {
+    const SVGState* state;
+    Path* targetPath;
+
+    void operator() (const XmlPath& xmlPath)
+    {
+      state->parsePathElement (xmlPath, *targetPath);
+    }
+  };
+
+  struct GetClipPathOp
+  {
+    const SVGState* state;
+    Drawable* target;
+
+    void operator() (const XmlPath& xmlPath)
+    {
+      state->applyClipPath (*target, xmlPath);
+    }
+  };
+
+  struct SetGradientStopsOp
+  {
+    const SVGState* state;
+    ColourGradient* gradient;
+
+    void operator() (const XmlPath& xml)
+    {
+      state->addGradientStopsIn (*gradient, xml);
+    }
+  };
+
+  struct GetFillTypeOp
+  {
+    const SVGState* state;
+    const Path* path;
+    float opacity;
+    FillType fillType;
+
+    void operator() (const XmlPath& xml)
+    {
+      if (xml->hasTagNameIgnoringNamespace ("linearGradient")
+      || xml->hasTagNameIgnoringNamespace ("radialGradient"))
+    fillType = state->getGradientFillType (xml, *path, opacity);
+    }
+  };
+
     //==============================================================================
     Drawable* parseSVGElement (const XmlPath& xml)
     {
@@ -553,17 +602,6 @@ private:
         {
             const String linkedID = link.substring (1);
 
-            struct UsePathOp
-            {
-                const SVGState* state;
-                Path* targetPath;
-
-                void operator() (const XmlPath& xmlPath)
-                {
-                    state->parsePathElement (xmlPath, *targetPath);
-                }
-            };
-
             UsePathOp op = { this, &path };
             topLevelXml.applyOperationToChildWithID (linkedID, op);
         }
@@ -692,17 +730,6 @@ private:
 
             if (urlID.isNotEmpty())
             {
-                struct GetClipPathOp
-                {
-                    const SVGState* state;
-                    Drawable* target;
-
-                    void operator() (const XmlPath& xmlPath)
-                    {
-                        state->applyClipPath (*target, xmlPath);
-                    }
-                };
-
                 GetClipPathOp op = { this, &d };
                 topLevelXml.applyOperationToChildWithID (urlID, op);
             }
@@ -751,17 +778,6 @@ private:
 
             if (id.startsWithChar ('#'))
             {
-                struct SetGradientStopsOp
-                {
-                    const SVGState* state;
-                    ColourGradient* gradient;
-
-                    void operator() (const XmlPath& xml)
-                    {
-                        state->addGradientStopsIn (*gradient, xml);
-                    }
-                };
-
                 SetGradientStopsOp op = { this, &gradient, };
                 topLevelXml.applyOperationToChildWithID (id.substring (1), op);
             }
@@ -893,21 +909,6 @@ private:
 
         if (urlID.isNotEmpty())
         {
-            struct GetFillTypeOp
-            {
-                const SVGState* state;
-                const Path* path;
-                float opacity;
-                FillType fillType;
-
-                void operator() (const XmlPath& xml)
-                {
-                    if (xml->hasTagNameIgnoringNamespace ("linearGradient")
-                         || xml->hasTagNameIgnoringNamespace ("radialGradient"))
-                        fillType = state->getGradientFillType (xml, *path, opacity);
-                }
-            };
-
             GetFillTypeOp op = { this, &path, opacity, FillType() };
 
             if (topLevelXml.applyOperationToChildWithID (urlID, op))
diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
index 97c3f32..7a6eb36 100644
--- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
+++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp
@@ -113,13 +113,15 @@ bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previ
     }
     else
     {
-        WildcardFileFilter wildcard (selectsFiles ? filters : String::empty,
-                                     selectsDirectories ? "*" : String::empty,
-                                     String::empty);
+        ignoreUnused (selectMultiple);
+
+        WildcardFileFilter wildcard (selectsFiles ? filters : String(),
+                                     selectsDirectories ? "*" : String(),
+                                     String());
 
         FileBrowserComponent browserComponent (flags, startingFile, &wildcard, previewComp);
 
-        FileChooserDialogBox box (title, String::empty,
+        FileChooserDialogBox box (title, String(),
                                   browserComponent, warnAboutOverwrite,
                                   browserComponent.findColour (AlertWindow::backgroundColourId));
 
diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h
index 94f4729..b0e31ed 100644
--- a/modules/juce_gui_basics/juce_gui_basics.h
+++ b/modules/juce_gui_basics/juce_gui_basics.h
@@ -33,7 +33,7 @@
 
   ID:               juce_gui_basics
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE GUI core classes
   description:      Basic user-interface components and related classes.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp b/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp
index 29e2f4e..22fc2c2 100644
--- a/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp
+++ b/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp
@@ -250,7 +250,7 @@ String KeyPress::getTextDescription() const
     {
         // some keyboard layouts use a shift-key to get the slash, but in those cases, we
         // want to store it as being a slash, not shift+whatever.
-        if (textCharacter == '/')
+        if (textCharacter == '/' && keyCode != numberPadDivide)
             return "/";
 
         if (mods.isCtrlDown())      desc << "ctrl + ";
diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
index a7d2d0b..718496c 100644
--- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
+++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
@@ -1075,6 +1075,11 @@ void LookAndFeel_V2::drawMenuBarItem (Graphics& g, int width, int height,
     g.drawFittedText (itemText, 0, 0, width, height, Justification::centred, 1);
 }
 
+Component* LookAndFeel_V2::getParentComponentForMenuOptions (const PopupMenu::Options& options)
+{
+    return options.getParentComponent();
+}
+
 //==============================================================================
 void LookAndFeel_V2::fillTextEditorBackground (Graphics& g, int /*width*/, int /*height*/, TextEditor& textEditor)
 {
diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
index aea4539..1633bfd 100644
--- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
+++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
@@ -173,6 +173,8 @@ public:
                           bool isMouseOverItem, bool isMenuOpen, bool isMouseOverBar,
                           MenuBarComponent&) override;
 
+    Component* getParentComponentForMenuOptions (const PopupMenu::Options& options) override;
+
     //==============================================================================
     void drawComboBox (Graphics&, int width, int height, bool isButtonDown,
                        int buttonX, int buttonY, int buttonW, int buttonH,
diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp
index e81b1b0..774830c 100644
--- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp
+++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp
@@ -28,7 +28,7 @@ LookAndFeel_V3::LookAndFeel_V3()
 
     const Colour textButtonColour (0xffeeeeff);
     setColour (TextButton::buttonColourId, textButtonColour);
-    setColour (TextButton::buttonOnColourId, textButtonColour);
+    setColour (TextButton::buttonOnColourId, Colour (0xff000000));
     setColour (ComboBox::buttonColourId, textButtonColour);
     setColour (TextEditor::outlineColourId, Colours::transparentBlack);
     setColour (TabbedButtonBar::tabOutlineColourId, Colour (0x66000000));
diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
index 04e437b..004bfff 100644
--- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
+++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
@@ -152,7 +152,9 @@ private:
 
     void updateShortcutKeyDescription()
     {
-        if (item.commandManager != nullptr && item.itemID != 0)
+        if (item.commandManager != nullptr
+             && item.itemID != 0
+             && item.shortcutKeyDescription.isEmpty())
         {
             String shortcutKey;
             const Array<KeyPress> keyPresses (item.commandManager->getKeyMappings()
@@ -198,6 +200,7 @@ public:
          options (opts),
          managerOfChosenCommand (manager),
          componentAttachedTo (options.targetComponent),
+         parentComponent (nullptr),
          hasBeenOver (false),
          needsToScroll (false),
          dismissOnMouseUp (shouldDismissOnMouseUp),
@@ -218,6 +221,8 @@ public:
         setLookAndFeel (parent != nullptr ? &(parent->getLookAndFeel())
                                           : menu.lookAndFeel.get());
 
+        parentComponent = getLookAndFeel().getParentComponentForMenuOptions (options);
+
         setOpaque (getLookAndFeel().findColour (PopupMenu::backgroundColourId).isOpaque()
                      || ! Desktop::canUseSemiTransparentWindows());
 
@@ -235,18 +240,30 @@ public:
 
         if (options.visibleItemID != 0)
         {
-            const int y = options.targetArea.getY() - windowPos.getY();
+            const Point<int> targetPosition =
+                (parentComponent != nullptr ? parentComponent->getLocalPoint (nullptr, options.targetArea.getTopLeft())
+                                            : options.targetArea.getTopLeft());
+
+            const int y = targetPosition.getY() - windowPos.getY();
             ensureItemIsVisible (options.visibleItemID,
                                  isPositiveAndBelow (y, windowPos.getHeight()) ? y : -1);
         }
 
         resizeToBestWindowPos();
-        addToDesktop (ComponentPeer::windowIsTemporary
-                       | ComponentPeer::windowIgnoresKeyPresses
-                       | getLookAndFeel().getMenuWindowFlags());
 
-        getActiveWindows().add (this);
-        Desktop::getInstance().addGlobalMouseListener (this);
+        if (parentComponent != nullptr)
+        {
+            parentComponent->addChildComponent (this);
+        }
+        else
+        {
+            addToDesktop (ComponentPeer::windowIsTemporary
+                          | ComponentPeer::windowIgnoresKeyPresses
+                          | getLookAndFeel().getMenuWindowFlags());
+
+            getActiveWindows().add (this);
+            Desktop::getInstance().addGlobalMouseListener (this);
+        }
     }
 
     ~MenuWindow()
@@ -268,10 +285,13 @@ public:
 
     void paintOverChildren (Graphics& g) override
     {
+        LookAndFeel& lf = getLookAndFeel();
+
+        if (parentComponent != nullptr)
+            lf.drawResizableFrame (g, getWidth(), getHeight(), BorderSize<int> (PopupMenuSettings::borderSize));
+
         if (canScroll())
         {
-            LookAndFeel& lf = getLookAndFeel();
-
             if (isTopScrollZoneActive())
                 lf.drawPopupMenuUpDownArrow (g, getWidth(), PopupMenuSettings::scrollZone, true);
 
@@ -551,27 +571,43 @@ public:
     }
 
     //==============================================================================
-    void calculateWindowPos (const Rectangle<int>& target, const bool alignToRectangle)
+    Rectangle<int> getParentArea (Point<int> targetPoint)
     {
-        const Rectangle<int> mon (Desktop::getInstance().getDisplays()
-                                     .getDisplayContaining (target.getCentre())
-                                                           #if JUCE_MAC
-                                                            .userArea);
-                                                           #else
-                                                            .totalArea); // on windows, don't stop the menu overlapping the taskbar
-                                                           #endif
+        Rectangle<int> parentArea (Desktop::getInstance().getDisplays()
+                                   .getDisplayContaining (targetPoint)
+                                  #if JUCE_MAC
+                                   .userArea);
+                                  #else
+                                   .totalArea); // on windows, don't stop the menu overlapping the taskbar
+                                  #endif
 
-        const int maxMenuHeight = mon.getHeight() - 24;
+        if (parentComponent == nullptr)
+            return parentArea;
+
+        return parentComponent->getLocalArea (nullptr,
+                                              parentComponent->getScreenBounds()
+                                                    .reduced (PopupMenuSettings::borderSize)
+                                                    .getIntersection (parentArea));
+    }
+
+    void calculateWindowPos (Rectangle<int> target, const bool alignToRectangle)
+    {
+        const Rectangle<int> parentArea = getParentArea (target.getCentre());
+
+        if (parentComponent != nullptr)
+            target = parentComponent->getLocalArea (nullptr, target).getIntersection (parentArea);
+
+        const int maxMenuHeight = parentArea.getHeight() - 24;
 
         int x, y, widthToUse, heightToUse;
-        layoutMenuItems (mon.getWidth() - 24, maxMenuHeight, widthToUse, heightToUse);
+        layoutMenuItems (parentArea.getWidth() - 24, maxMenuHeight, widthToUse, heightToUse);
 
         if (alignToRectangle)
         {
             x = target.getX();
 
-            const int spaceUnder = mon.getHeight() - (target.getBottom() - mon.getY());
-            const int spaceOver = target.getY() - mon.getY();
+            const int spaceUnder = parentArea.getHeight() - (target.getBottom() - parentArea.getY());
+            const int spaceOver = target.getY() - parentArea.getY();
 
             if (heightToUse < spaceUnder - 30 || spaceUnder >= spaceOver)
                 y = target.getBottom();
@@ -580,7 +616,7 @@ public:
         }
         else
         {
-            bool tendTowardsRight = target.getCentreX() < mon.getCentreX();
+            bool tendTowardsRight = target.getCentreX() < parentArea.getCentreX();
 
             if (parent != nullptr)
             {
@@ -589,19 +625,19 @@ public:
                     const bool parentGoingRight = (parent->getX() + parent->getWidth() / 2
                                                     > parent->parent->getX() + parent->parent->getWidth() / 2);
 
-                    if (parentGoingRight && target.getRight() + widthToUse < mon.getRight() - 4)
+                    if (parentGoingRight && target.getRight() + widthToUse < parentArea.getRight() - 4)
                         tendTowardsRight = true;
                     else if ((! parentGoingRight) && target.getX() > widthToUse + 4)
                         tendTowardsRight = false;
                 }
-                else if (target.getRight() + widthToUse < mon.getRight() - 32)
+                else if (target.getRight() + widthToUse < parentArea.getRight() - 32)
                 {
                     tendTowardsRight = true;
                 }
             }
 
-            const int biggestSpace = jmax (mon.getRight() - target.getRight(),
-                                           target.getX() - mon.getX()) - 32;
+            const int biggestSpace = jmax (parentArea.getRight() - target.getRight(),
+                                           target.getX() - parentArea.getX()) - 32;
 
             if (biggestSpace < widthToUse)
             {
@@ -610,21 +646,21 @@ public:
                 if (numColumns > 1)
                     layoutMenuItems (biggestSpace - 4, maxMenuHeight, widthToUse, heightToUse);
 
-                tendTowardsRight = (mon.getRight() - target.getRight()) >= (target.getX() - mon.getX());
+                tendTowardsRight = (parentArea.getRight() - target.getRight()) >= (target.getX() - parentArea.getX());
             }
 
             if (tendTowardsRight)
-                x = jmin (mon.getRight() - widthToUse - 4, target.getRight());
+                x = jmin (parentArea.getRight() - widthToUse - 4, target.getRight());
             else
-                x = jmax (mon.getX() + 4, target.getX() - widthToUse);
+                x = jmax (parentArea.getX() + 4, target.getX() - widthToUse);
 
             y = target.getY();
-            if (target.getCentreY() > mon.getCentreY())
-                y = jmax (mon.getY(), target.getBottom() - heightToUse);
+            if (target.getCentreY() > parentArea.getCentreY())
+                y = jmax (parentArea.getY(), target.getBottom() - heightToUse);
         }
 
-        x = jmax (mon.getX() + 1, jmin (mon.getRight() - (widthToUse + 6), x));
-        y = jmax (mon.getY() + 1, jmin (mon.getBottom() - (heightToUse + 6), y));
+        x = jmax (parentArea.getX() + 1, jmin (parentArea.getRight() - (widthToUse + 6), x));
+        y = jmax (parentArea.getY() + 1, jmin (parentArea.getBottom() - (heightToUse + 6), y));
 
         windowPos.setBounds (x, y, widthToUse, heightToUse);
 
@@ -695,9 +731,12 @@ public:
             childNum += numChildren;
         }
 
-        if (totalW < options.minWidth)
+        // width must never be larger than the screen
+        const int minWidth = jmin (maxMenuW, options.minWidth);
+
+        if (totalW < minWidth)
         {
-            totalW = options.minWidth;
+            totalW = minWidth;
 
             for (int col = 0; col < numColumns; ++col)
                 columnWidths.set (0, totalW / numColumns);
@@ -727,16 +766,15 @@ public:
                                                     windowPos.getHeight() - (PopupMenuSettings::scrollZone + m->getHeight())),
                                               currentY);
 
-                        const Rectangle<int> mon (Desktop::getInstance().getDisplays()
-                                                    .getDisplayContaining (windowPos.getPosition()).userArea);
+                        const Rectangle<int> parantArea = getParentArea (windowPos.getPosition());
 
                         int deltaY = wantedY - currentY;
 
-                        windowPos.setSize (jmin (windowPos.getWidth(), mon.getWidth()),
-                                           jmin (windowPos.getHeight(), mon.getHeight()));
+                        windowPos.setSize (jmin (windowPos.getWidth(), parantArea.getWidth()),
+                                           jmin (windowPos.getHeight(), parantArea.getHeight()));
 
-                        const int newY = jlimit (mon.getY(),
-                                                 mon.getBottom() - windowPos.getHeight(),
+                        const int newY = jlimit (parantArea.getY(),
+                                                 parantArea.getBottom() - windowPos.getHeight(),
                                                  windowPos.getY() + deltaY);
 
                         deltaY -= newY - windowPos.getY();
@@ -912,6 +950,7 @@ public:
     OwnedArray<ItemComponent> items;
     ApplicationCommandManager** managerOfChosenCommand;
     WeakReference<Component> componentAttachedTo;
+    Component* parentComponent;
     Rectangle<int> windowPos;
     bool hasBeenOver, needsToScroll;
     bool dismissOnMouseUp, hideOnExit, disableMouseMoves, hasAnyJuceCompHadFocus;
@@ -1428,6 +1467,7 @@ void PopupMenu::addSectionHeader (const String& title)
 //==============================================================================
 PopupMenu::Options::Options()
     : targetComponent (nullptr),
+      parentComponent (nullptr),
       visibleItemID (0),
       minWidth (0),
       maxColumns (0),
@@ -1482,6 +1522,13 @@ PopupMenu::Options PopupMenu::Options::withItemThatMustBeVisible (int idOfItemTo
     return o;
 }
 
+PopupMenu::Options PopupMenu::Options::withParentComponent (Component* parent) const noexcept
+{
+    Options o (*this);
+    o.parentComponent = parent;
+    return o;
+}
+
 Component* PopupMenu::createWindow (const Options& options,
                                     ApplicationCommandManager** managerOfChosenCommand) const
 {
@@ -1506,7 +1553,7 @@ struct PopupMenuCompletionCallback  : public ModalComponentManager::Callback
         PopupMenuSettings::menuWasHiddenBecauseOfAppChange = false;
     }
 
-    void modalStateFinished (int result)
+    void modalStateFinished (int result) override
     {
         if (managerOfChosenCommand != nullptr && result != 0)
         {
diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h
index ac0a4d7..0a7f277 100644
--- a/modules/juce_gui_basics/menus/juce_PopupMenu.h
+++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h
@@ -380,18 +380,31 @@ public:
     public:
         Options();
 
+        //==============================================================================
         Options withTargetComponent (Component* targetComponent) const noexcept;
         Options withTargetScreenArea (const Rectangle<int>& targetArea) const noexcept;
         Options withMinimumWidth (int minWidth) const noexcept;
         Options withMaximumNumColumns (int maxNumColumns) const noexcept;
         Options withStandardItemHeight (int standardHeight) const noexcept;
         Options withItemThatMustBeVisible (int idOfItemToBeVisible) const noexcept;
+        Options withParentComponent (Component* parentComponent) const noexcept;
+
+        //==============================================================================
+        Component* getParentComponent() const noexcept          { return parentComponent; }
+        Component* getTargetComponent() const noexcept          { return targetComponent; }
+        Rectangle<int> getTargetScreenArea() const noexcept     { return targetArea; }
+        int getMinimumWidth() const noexcept                    { return minWidth; }
+        int getMaximumNumColumns() const noexcept               { return maxColumns; }
+        int getStandardItemHeight() const noexcept              { return standardHeight; }
+        int getItemThatMustBeVisible() const noexcept           { return visibleItemID; }
 
     private:
+        //==============================================================================
         friend class PopupMenu;
         friend class PopupMenu::Window;
         Rectangle<int> targetArea;
         Component* targetComponent;
+        Component* parentComponent;
         int visibleItemID, minWidth, maxColumns, standardHeight;
     };
 
@@ -668,6 +681,8 @@ public:
                                       bool isMenuOpen,
                                       bool isMouseOverBar,
                                       MenuBarComponent&) = 0;
+
+        virtual Component* getParentComponentForMenuOptions (const PopupMenu::Options& options) = 0;
     };
 
 private:
diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp
index 79f091e..09bc067 100644
--- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp
+++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp
@@ -572,9 +572,8 @@ private:
     int sizeAllocated;
     float scale;
 
-    class PreallocatedImage  : public ImagePixelData
+    struct PreallocatedImage  : public ImagePixelData
     {
-    public:
         PreallocatedImage (const int width_, const int height_, jint* data_, bool hasAlpha_)
             : ImagePixelData (Image::ARGB, width_, height_), data (data_), hasAlpha (hasAlpha_)
         {
@@ -607,7 +606,7 @@ private:
             bm.data = (uint8*) (data + x + y * width);
         }
 
-        ImagePixelData* clone()
+        ImagePixelData::Ptr clone()
         {
             PreallocatedImage* s = new PreallocatedImage (width, height, 0, hasAlpha);
             s->allocatedData.malloc (sizeof (jint) * width * height);
diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm
index e0a90b4..466c4ec 100644
--- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm
+++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm
@@ -39,6 +39,7 @@ Array<AppInactivityCallback*> appBecomingInactiveCallbacks;
 {
 }
 
+ at property (strong, nonatomic) UIWindow *window;
 - (void) applicationDidFinishLaunching: (UIApplication*) application;
 - (void) applicationWillTerminate: (UIApplication*) application;
 - (void) applicationDidEnterBackground: (UIApplication*) application;
diff --git a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
index 180a0bf..05b23f6 100644
--- a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
+++ b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp
@@ -171,8 +171,6 @@ void FileChooser::showPlatformDialog (Array<File>& results,
     else
         addZenityArgs (args, separator, title, file, filters, isDirectory, isSave, selectMultipleFiles);
 
-    args.add ("2>/dev/null"); // (to avoid logging info ending up in the results)
-
     ChildProcess child;
 
     if (child.start (args, ChildProcess::wantStdOut))
diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp
index 752588d..5896787 100644
--- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp
+++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp
@@ -635,7 +635,7 @@ public:
             sendDataChangeMessage();
     }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
         jassertfalse;
         return nullptr;
@@ -1214,7 +1214,10 @@ private:
                                         e.dpi = ((static_cast<double> (crtc->width) * 25.4 * 0.5) / static_cast<double> (output->mm_width))
                                             + ((static_cast<double> (crtc->height) * 25.4 * 0.5) / static_cast<double> (output->mm_height));
 
-                                    e.scale = masterScale * getScaleForDisplay (output->name, e);
+                                    double scale = getScaleForDisplay (output->name, e);
+                                    scale = (scale <= 0.1 ? 1.0 : scale);
+
+                                    e.scale = masterScale * scale;
 
                                     infos.add (e);
                                 }
@@ -3959,9 +3962,8 @@ void* CustomMouseCursorInfo::create() const
             hotspotX = (hotspotX * (int) cursorW) / (int) imageW;
             hotspotY = (hotspotY * (int) cursorH) / (int) imageH;
 
-            g.drawImageWithin (image, 0, 0, (int) imageW, (int) imageH,
-                               RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize,
-                               false);
+            g.drawImage (image, Rectangle<float> ((float) imageW, (float) imageH),
+                         RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize);
         }
         else
         {
diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
index 494958b..a4cea29 100644
--- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
+++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
@@ -2098,7 +2098,7 @@ const int KeyPress::F7Key           = NSF7FunctionKey;
 const int KeyPress::F8Key           = NSF8FunctionKey;
 const int KeyPress::F9Key           = NSF9FunctionKey;
 const int KeyPress::F10Key          = NSF10FunctionKey;
-const int KeyPress::F11Key          = NSF1FunctionKey;
+const int KeyPress::F11Key          = NSF11FunctionKey;
 const int KeyPress::F12Key          = NSF12FunctionKey;
 const int KeyPress::F13Key          = NSF13FunctionKey;
 const int KeyPress::F14Key          = NSF14FunctionKey;
diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp
index e382c9a..264b81b 100644
--- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp
+++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp
@@ -39,6 +39,10 @@
  #define WM_APPCOMMAND                     0x0319
 #endif
 
+#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+ #include <juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h>
+#endif
+
 extern void juce_repeatLastProcessPriority();
 extern void juce_checkCurrentlyFocusedTopLevelWindow();  // in juce_TopLevelWindow.cpp
 extern bool juce_isRunningInWine();
@@ -381,7 +385,7 @@ public:
             sendDataChangeMessage();
     }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
         WindowsBitmapImage* im = new WindowsBitmapImage (pixelFormat, width, height, false);
 
@@ -561,6 +565,9 @@ namespace IconConverters
 
 //==============================================================================
 class HWNDComponentPeer  : public ComponentPeer
+   #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+    , public ModifierKeyReceiver
+   #endif
 {
 public:
     enum RenderingEngineType
@@ -585,6 +592,9 @@ public:
           currentWindowIcon (0),
           dropTarget (nullptr),
           updateLayeredWindowAlpha (255)
+         #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+        , modProvider (nullptr)
+         #endif
     {
         callFunctionIfNotLocked (&createWindowCallback, this);
 
@@ -1166,6 +1176,9 @@ private:
     JuceDropTarget* dropTarget;
     uint8 updateLayeredWindowAlpha;
     MultiTouchMapper<DWORD> currentTouches;
+   #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+    ModifierKeyProvider* modProvider;
+   #endif
 
     //==============================================================================
     class TemporaryImage    : public Timer
@@ -1752,6 +1765,11 @@ private:
 
             updateKeyModifiers();
 
+           #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+            if (modProvider != nullptr)
+                currentModifiers = currentModifiers.withFlags (modProvider->getWin32Modifiers());
+           #endif
+
             TRACKMOUSEEVENT tme;
             tme.cbSize = sizeof (tme);
             tme.dwFlags = TME_LEAVE;
@@ -1794,6 +1812,12 @@ private:
         if (isValidPeer (this))
         {
             updateModifiersFromWParam (wParam);
+
+          #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+            if (modProvider != nullptr)
+                currentModifiers = currentModifiers.withFlags (modProvider->getWin32Modifiers());
+          #endif
+
             isDragging = true;
 
             doMouseEvent (position, MouseInputSource::invalidPressure);
@@ -1807,6 +1831,12 @@ private:
             return;
 
         updateModifiersFromWParam (wParam);
+
+       #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+        if (modProvider != nullptr)
+            currentModifiers = currentModifiers.withFlags (modProvider->getWin32Modifiers());
+       #endif
+
         const bool wasDragging = isDragging;
         isDragging = false;
 
@@ -2393,6 +2423,19 @@ private:
     }
 
     //==============================================================================
+  #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client
+    void setModifierKeyProvider (ModifierKeyProvider* provider) override
+    {
+        modProvider = provider;
+    }
+
+    void removeModifierKeyProvider() override
+    {
+        modProvider = nullptr;
+    }
+   #endif
+
+    //==============================================================================
 public:
     static LRESULT CALLBACK windowProc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
     {
diff --git a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp
index 86cb548..9d75060 100644
--- a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp
+++ b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp
@@ -73,5 +73,5 @@ RectanglePlacement ImageComponent::getImagePlacement() const
 void ImageComponent::paint (Graphics& g)
 {
     g.setOpacity (1.0f);
-    g.drawImageWithin (image, 0, 0, getWidth(), getHeight(), placement, false);
+    g.drawImage (image, getLocalBounds().toFloat(), placement);
 }
diff --git a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp
index 458f0b5..c9362c2 100644
--- a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp
+++ b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp
@@ -33,6 +33,7 @@ public:
           fixedSize (fixedSize_),
           drawBar (drawBar_)
     {
+        setWantsKeyboardFocus (false);
     }
 
     bool getToolbarItemSizes (int toolbarThickness, bool /*isToolbarVertical*/,
diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h
index 0594e57..2027115 100644
--- a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h
+++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h
@@ -104,7 +104,7 @@ public:
 
         @see contentAreaChanged
     */
-    const Rectangle<int>& getContentArea() const noexcept           { return contentArea; }
+    Rectangle<int> getContentArea() const noexcept                  { return contentArea; }
 
     //==============================================================================
     /** This method must return the size criteria for this item, based on a given toolbar
diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
index 8f97006..ef311e8 100644
--- a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
+++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
@@ -92,7 +92,8 @@ void TooltipWindow::displayTip (Point<int> screenPos, const String& tip)
 
             addToDesktop (ComponentPeer::windowHasDropShadow
                             | ComponentPeer::windowIsTemporary
-                            | ComponentPeer::windowIgnoresKeyPresses);
+                            | ComponentPeer::windowIgnoresKeyPresses
+                            | ComponentPeer::windowIgnoresMouseClicks);
         }
 
         toFront (false);
diff --git a/modules/juce_gui_extra/juce_gui_extra.h b/modules/juce_gui_extra/juce_gui_extra.h
index c2719a9..63d9305 100644
--- a/modules/juce_gui_extra/juce_gui_extra.h
+++ b/modules/juce_gui_extra/juce_gui_extra.h
@@ -33,7 +33,7 @@
 
   ID:               juce_gui_extra
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE extended GUI classes
   description:      Miscellaneous GUI classes for specialised tasks.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp
index 40d6970..a522483 100644
--- a/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp
+++ b/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp
@@ -112,8 +112,8 @@ void SystemTrayIconComponent::setIconImage (const Image& newImage)
 void SystemTrayIconComponent::paint (Graphics& g)
 {
     if (pimpl != nullptr)
-        g.drawImageWithin (pimpl->image, 0, 0, getWidth(), getHeight(),
-                           RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize, false);
+        g.drawImage (pimpl->image, getLocalBounds().toFloat(),
+                     RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize);
 }
 
 void SystemTrayIconComponent::setIconTooltip (const String& /*tooltip*/)
diff --git a/modules/juce_opengl/juce_opengl.h b/modules/juce_opengl/juce_opengl.h
index 208c678..da65fbb 100644
--- a/modules/juce_opengl/juce_opengl.h
+++ b/modules/juce_opengl/juce_opengl.h
@@ -33,7 +33,7 @@
 
   ID:               juce_opengl
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE OpenGL classes
   description:      Classes for rendering OpenGL in a JUCE window.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp
index 4a9dacc..e0eae4f 100644
--- a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp
+++ b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp
@@ -46,19 +46,13 @@ public:
 
     ImageType* createType() const override     { return new OpenGLImageType(); }
 
-    ImagePixelData* clone() override
+    ImagePixelData::Ptr clone() override
     {
-        OpenGLFrameBufferImage* im = new OpenGLFrameBufferImage (context, width, height);
-        im->incReferenceCount();
+        Image newImage (new OpenGLFrameBufferImage (context, width, height));
+        Graphics g (newImage);
+        g.drawImageAt (Image (this), 0, 0, false);
 
-        {
-            Image newImage (im);
-            Graphics g (newImage);
-            g.drawImageAt (Image (this), 0, 0, false);
-        }
-
-        im->resetReferenceCount();
-        return im;
+        return newImage.getPixelData();
     }
 
     void initialiseBitmapData (Image::BitmapData& bitmapData, int x, int y, Image::BitmapData::ReadWriteMode mode) override
diff --git a/modules/juce_osc/juce_osc.h b/modules/juce_osc/juce_osc.h
index 959a965..98e8955 100644
--- a/modules/juce_osc/juce_osc.h
+++ b/modules/juce_osc/juce_osc.h
@@ -33,7 +33,7 @@
 
   ID:               juce_osc
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE OSC classes
   description:      Open Sound Control implementation.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_tracktion_marketplace/juce_tracktion_marketplace.h b/modules/juce_tracktion_marketplace/juce_tracktion_marketplace.h
index 3773953..e39c625 100644
--- a/modules/juce_tracktion_marketplace/juce_tracktion_marketplace.h
+++ b/modules/juce_tracktion_marketplace/juce_tracktion_marketplace.h
@@ -33,7 +33,7 @@
 
   ID:               juce_tracktion_marketplace
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE Tracktion marketplace support
   description:      Classes for online product authentication via the Tracktion marketplace.
   website:          http://www.juce.com/juce
diff --git a/modules/juce_video/juce_video.h b/modules/juce_video/juce_video.h
index 5b886d7..770f977 100644
--- a/modules/juce_video/juce_video.h
+++ b/modules/juce_video/juce_video.h
@@ -34,7 +34,7 @@
 
   ID:               juce_video
   vendor:           juce
-  version:          4.2.1
+  version:          4.2.3
   name:             JUCE video playback and capture classes
   description:      Classes for playing video and capturing camera input.
   website:          http://www.juce.com/juce

-- 
juce packaging



More information about the pkg-multimedia-commits mailing list